前提・実現したいこと
頭(ダミー)がある2つの双方向循環リスト d1, d2においてd1の末尾をd2の先頭につなげ、d2の末尾をd1の先頭つなげたいのですが出力して見たところうまくいっていませんでした。
原因が分からないのでご教示願います。
例
d1 (2)(4) d2 (1)(3) 結合後 d1 (2)(4)(1)(3)
該当のソースコード(必要ならばすべてのソースコードを添付します)
C
1typedef int elementtype; 2 3struct dlnode { 4 elementtype element; 5 struct dlnode *prev, *next; 6}; 7 8typedef struct dlnode* dllist; 9 10void append_dllist(dllist d1, dllist d2) { 11 dllist n; 12 n = d1; 13 while(n->next != d1) { 14 n = n->next; 15 } 16 n->next = d2; 17 n = n->next; 18 while(n->next != d2) { 19 n = n->next; 20 } 21 n->next = d1; 22 delete(d2); 23 //free(d2);修正 24} 25 26void delete(dllist p) { 27 p->prev->next = p->next; 28 p->next->prev = p->prev; 29 free(p); 30} 31 32//nextで一巡するまで要素を[]で囲って出力し、prevで一巡するまで{}で囲って出力する 33void print_dllist(dllist d) { 34 dllist n; 35 n = d->next; 36 while(n != d) { 37 printf("[%d]", n->element); 38 n = n->next; 39 } 40 n = n->prev; 41 while(n != d) { 42 printf("{%d}", n->element); 43 n = n->prev; 44 } 45 printf("\n"); 46 47} 48 49
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
append_dllist 内に delete は不要です。
循環しているので、末尾を探すのに一周する必要もありません。
C
1#include <stdio.h> 2#include <stdlib.h> 3 4typedef int elementtype; 5 6struct dlnode { 7 elementtype element; 8 struct dlnode *prev, *next; 9}; 10 11typedef struct dlnode* dllist; 12 13dllist new_dllist(int element) 14{ 15 dllist result = malloc(sizeof(struct dlnode)); 16 result->element = element; 17 result->prev = result; 18 result->next = result; 19 return result; 20} 21 22void print_dllist(dllist list) 23{ 24 dllist ptr = list; 25 if (list == NULL) return; 26 printf("%s\n", "正順に表示します"); 27 do { 28 printf("%d ", ptr->element); 29 ptr = ptr->next; 30 } while (ptr != list); 31 printf("\n"); 32 printf("%s\n", "逆順に表示します"); 33 do { 34 printf("%d ", ptr->element); 35 ptr = ptr->prev; 36 } while (ptr != list); 37 printf("\n\n"); 38} 39 40void free_dllist(dllist list) 41{ 42 dllist ptr = list; 43 if (list == NULL) return; 44 do { 45 free(ptr); 46 ptr = ptr->next; 47 } while (ptr != list); 48} 49 50void append_dllist(dllist a, dllist b) 51{ 52 if (a == NULL || b == NULL) return; 53 a->prev->next = b; 54 b->prev->next = a; 55 dllist t = a->prev; 56 a->prev = b->prev; 57 b->prev = t; 58} 59 60void main() 61{ 62 dllist list = new_dllist(2); 63 append_dllist(list, new_dllist(4)); 64 65 dllist list2 = new_dllist(1); 66 append_dllist(list2, new_dllist(3)); 67 68 append_dllist(list, list2); 69 print_dllist(list); 70 free_dllist(list); 71}
投稿2018/10/22 07:13
編集2018/10/22 07:14総合スコア28660
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/22 08:12 編集
2018/10/22 08:17
2018/10/22 08:42
2018/10/22 08:48
0
ベストアンサー
このあたりの子が悪さしているように思えます。
C
1delete(d2); 2free(d2); 3 4void delete(dllist p) { 5 p->prev->next = p->next; // (4のノード).next = (3のノード) 6 // つまり、 (2)(4)(1)(3) が、(2)←→(4)←→(3) となります。 7 // ↑ ↑ 8 // (1)---┘ 9 p->next->prev = p->prev; // ここもおかしくなります。 10 free(p); // (1のノード)のメモリを解放する 11}
- dlistってdlnode*ですよね。ノードだと思うんですが、それを解放しちゃっていいのか?というのがfree(d2)の悪そうな点です。
- delete()は、その前に接続しなおしの処理があるのに、あらためてやることあるのかな?というのが悪そうな点です。
###変数やメンバ変数と、その中身のイメージ
きったない絵であれですが。
投稿2018/10/22 04:13
編集2018/10/22 06:15退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/22 05:05
退会済みユーザー
2018/10/22 05:08
2018/10/22 05:13
2018/10/22 05:14
退会済みユーザー
2018/10/22 05:22 編集
2018/10/22 05:34
退会済みユーザー
2018/10/22 05:40
2018/10/22 05:51
退会済みユーザー
2018/10/22 06:01
2018/10/22 06:53
退会済みユーザー
2018/10/22 07:03
退会済みユーザー
2018/10/22 07:37
2018/10/22 08:05
退会済みユーザー
2018/10/22 08:11
2018/10/22 08:13
退会済みユーザー
2018/10/22 08:20
2018/10/22 09:21
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。