teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2018/01/28 06:43

投稿

TaroToyotomi
TaroToyotomi

スコア1461

answer CHANGED
@@ -1,3 +1,162 @@
1
1
  if(&((*p)->next) == q || &((*q)->next) == p)の条件式が何を意味しているかは理解していますか?
2
2
  ifの条件式が真になる場合は図のようになりますが、elseの場合はどのようなケースが考えられますか?
3
- ![イメージ説明](76fc520ebbbafca1219b1b8f254894b9.png)
3
+ ![イメージ説明](76fc520ebbbafca1219b1b8f254894b9.png)
4
+
5
+ [追記]
6
+ 提示されたexchange()関数を実行してみました。
7
+ 仕様が不明なので何とも言えないのですが、正常に動作しているようには見えません。
8
+ exchange()関数実行後にリンクリストが壊れているように見えますが・・・。
9
+ 正常動作はどのように確認しましたか?
10
+
11
+ ```c
12
+ #include <stdio.h>
13
+ #include <stdlib.h>
14
+ #include <assert.h>
15
+
16
+ #define N 256
17
+ #define FILENAME "address.csv"
18
+
19
+ struct address{
20
+ char name[N];
21
+ char address[N];
22
+ char tel[N]; // 電話番号
23
+ char mail[N];
24
+ struct address *next;
25
+ struct address *before;
26
+ };
27
+
28
+ void exchange(struct address **p, struct address **q)
29
+ {
30
+ struct address *r, *s, *t;
31
+ assert(*p != 0 && *q != 0);
32
+
33
+ if (p == q)
34
+ return;
35
+
36
+ r = *p;
37
+ s = *q;
38
+ if (&((*p)->next) == q || &((*q)->next) == p) {
39
+ if (s->next != 0){
40
+ s->next->before = r;
41
+ }
42
+ r->before = s;
43
+ s->before = r->before;
44
+ *p = s;
45
+ *q = s->next;
46
+ s->next = r;
47
+ return;
48
+ } else {
49
+ if (s->next != 0){
50
+ s->next->before = r;
51
+ }
52
+ t = s->before;
53
+ s->before = r->before;
54
+ if (r->next != 0){
55
+ r->next->before = s;
56
+ }
57
+ r->before = t;
58
+ t = r->next;
59
+ r->next = s->next;
60
+ s->next = t;
61
+ *p = s;
62
+ *q = r;
63
+ }
64
+ }
65
+
66
+ void data_create( struct address **head )
67
+ {
68
+ int i;
69
+ struct address data[8] = {
70
+ { "yamada","tone","090-1122","mail-9", NULL, NULL },
71
+ { "hosi","nagoya","090-1122","mail-9", NULL, NULL },
72
+ { "kato","kanagawa","090-1122","mail-9", NULL, NULL },
73
+ { "koko","yosida","090-1122","mail-9", NULL, NULL },
74
+ { "naka","kamikosaka","090-1122","mail-9", NULL, NULL },
75
+ { "nakada","nogata","090-1122","mail-9", NULL, NULL },
76
+ { "saito","yamanashi","090-1122","mail-9", NULL, NULL },
77
+ { "suzuki","saitama","090-1122","mail-9", NULL, NULL }
78
+ };
79
+ struct address *p[9] = {NULL};
80
+
81
+ for ( i = 0; i < 8; i++ ) {
82
+ p[i] = malloc( sizeof(struct address));
83
+ *p[i] = data[i];
84
+ }
85
+
86
+ for ( i = 0; i < 8; i++ ){
87
+ if ( p[i] != NULL ) {
88
+ p[i]->next = p[i+1];
89
+ if ( i > 0 ) {
90
+ p[i]->before = p[i-1];
91
+ }
92
+ }
93
+ }
94
+
95
+ *head = p[0];
96
+ }
97
+
98
+ int main()
99
+ {
100
+ struct address *head = NULL;
101
+ struct address *p = NULL;
102
+ struct address *q = NULL;
103
+ data_create( &head );
104
+
105
+ printf( "オリジナルデータ表示\n");
106
+ p = head;
107
+ while ( p != NULL ) {
108
+ printf("addr=%08x, next=%08x, before=%08x, %s\n", p, p->next, p->before, p->name );
109
+ p = p->next;
110
+ }
111
+ printf("###################\n");
112
+ printf( "exchange() 実行前\n");
113
+ p = head->next;
114
+ q = head->next->next;
115
+ printf("p: addr=%08x, next=%08x, before=%08x, %s\n", p, p->next, p->before, p->name );
116
+ printf("q: addr=%08x, next=%08x, before=%08x, %s\n", q, q->next, q->before, q->name );
117
+ exchange( &p, &q );
118
+ printf( "exchange() 実行後\n");
119
+ printf("p: addr=%08x, next=%08x, before=%08x, %s\n", p, p->next, p->before, p->name );
120
+ printf("q: addr=%08x, next=%08x, before=%08x, %s\n", q, q->next, q->before, q->name );
121
+
122
+ printf("###################\n");
123
+ printf( "変更後データ表示\n");
124
+ p = head;
125
+ while ( p != NULL ) {
126
+ printf("addr=%08x, next=%08x, before=%08x, %s\n", p, p->next, p->before, p->name );
127
+ p = p->next;
128
+ }
129
+
130
+
131
+ return 0;
132
+ }
133
+ ```
134
+
135
+ 実行結果
136
+ $gcc -o main *.c
137
+ $main
138
+ オリジナルデータ表示
139
+ addr=01675010, next=01675430, before=00000000, yamada
140
+ addr=01675430, next=01675850, before=01675010, hosi
141
+ addr=01675850, next=01675c70, before=01675430, kato
142
+ addr=01675c70, next=01676090, before=01675850, koko
143
+ addr=01676090, next=016764b0, before=01675c70, naka
144
+ addr=016764b0, next=016768d0, before=01676090, nakada
145
+ addr=016768d0, next=01676cf0, before=016764b0, saito
146
+ addr=01676cf0, next=00000000, before=016768d0, suzuki
147
+ ###################
148
+ exchange() 実行前
149
+ p: addr=01675430, next=01675850, before=01675010, hosi
150
+ q: addr=01675850, next=01675c70, before=01675430, kato
151
+ exchange() 実行後
152
+ p: addr=01675850, next=01675850, before=01675850, kato
153
+ q: addr=01675430, next=01675c70, before=01675430, hosi
154
+ ###################
155
+ 変更後データ表示
156
+ addr=01675010, next=01675430, before=00000000, yamada
157
+ addr=01675430, next=01675c70, before=01675430, hosi
158
+ addr=01675c70, next=01676090, before=01675430, koko
159
+ addr=01676090, next=016764b0, before=01675c70, naka
160
+ addr=016764b0, next=016768d0, before=01676090, nakada
161
+ addr=016768d0, next=01676cf0, before=016764b0, saito
162
+ addr=01676cf0, next=00000000, before=016768d0, suzuki