概要
2つの頭(ダミー)がある双方向循環リストにおいて
(1)入力順と同じ順番にリストを作成する
(2)1つ目のリストは要素が奇数、2つ目のリストは要素が偶数のものを消去する
(3)1つめのリストの末尾に2つ目のリストを繋げ、2つ目のリストの末尾に1つ目のリストの先頭ダミーにつなぐ。尚、2つ目の先頭のダミーは消去する。
というものをプログラムをしたいのですが、2つ目のリスト内の要素が偶数のものを消去を行なった後にリストを出力するときに時間超過で中断されてしまいます。複雑なことは行っていないはずなのに、何がいけないにでしょうか?
実行例
>1 >2 >3 [1][2][3]{3}{2}{1} [1][2][3]{3}{2}{1} [2]{2} [1][3]{3}{1} [2][1][3]{3}{1}{2}
発生している問題・エラーメッセージ
>1 >2 >3 [1][2][3]{3}{2}{1} [1][2][3]{3}{2}{1} この先が行われない
該当のソースコード
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 13void print_dllist(dllist d) {/*d の指しているダミーの節点から、next を順にたどって自分自身に戻るまで element を [と] で挟ん 14で標準出力に出力し続けたのち、prev を順にたどって自分自身に戻るまで element を{と}で挟んで標 15準出力に出力し続ける関数 (最後に改行)。 */ 16 dllist n; 17 n = d->next; 18 while(n != d) { 19 printf("[%d]", n->element); 20 n = n->next; 21 } 22 n = n->prev; 23 while(n != d) { 24 printf("{%d}", n->element); 25 n = n->prev; 26 } 27 printf("\n"); 28 29} 30 31void insert(dllist p, elementtype e) { /*p の指している節点の prev に、element として e を含む節点を挿入する関数。 */ 32 dllist n; 33 n = (struct dlnode *) malloc (sizeof (struct dlnode)); 34 n->element = e; 35 36 if(p->next == NULL && p->prev == NULL) { 37 p->prev = n; 38 n->next = p; 39 n->prev = p; 40 p->next = n; 41 } else { 42 n->next = p; 43 n->prev = p->prev; 44 p->prev->next = n; 45 p->prev = n; 46 } 47} 48 49void delete(dllist p) { /*p の指している節点のみを削除する関数 (p の前後のポインタを繋ぎ変えて、free 関数により削除した 50節点のメモリを解放する)。*/ 51struct dlnode *next, *prev; 52 prev = p->prev; 53 next= p->next; 54 if (prev != NULL) 55 prev->next = next; 56 if (next != NULL) 57 next ->prev = prev; 58 free(p); 59} 60void append_dllist(dllist d1, dllist d2) {/*d1、d2 の指している節点をダミーの節点とする 2 つの双方向リストを連結する関数 (d1 から next をた 61どっていくと、1 つめの双方向リストの要素に続いて 2 つめの双方向リストの要素が現れ、d1 に戻っ 62てくるように定義し、2 つめのダミーの節点 d2 のメモリは free 関数によって解放する)*/ 63 dllist n; 64 n = d1; 65 while(n->next != d1) { 66 n = n->next; 67 } 68 n->next = d2; 69 70 while(n->next != d2) { 71 n = n->next; 72 } 73 n->next = d1; 74 free(d2); 75} 76 77int main(void) { 78 int i; 79 char buf[128]; 80 dllist d1, d2, p; 81 82 d1 = (struct dlnode *)malloc(sizeof(struct dlnode)); 83 d1->prev = NULL; 84 d1->next = NULL; 85 86 d2 = (struct dlnode *)malloc(sizeof(struct dlnode)); 87 d2->prev = NULL; 88 d2->next = NULL; 89 90 91 while(fgets(buf,sizeof(buf),stdin) != NULL) { 92 sscanf(buf,"%d", &i); 93 insert(d1, i); 94 insert(d2, i); 95 } 96 print_dllist(d1); 97 print_dllist(d2); 98 99 p = d1; 100 do { 101 if(p->element % 2) { 102 p = p->next; 103 delete(p->prev); 104 105 } 106 p = p->next; 107 }while(p!=d1||p->next!=d1); 108 109 p = d2; 110 do{ 111 if(!(p->element % 2)){ 112 p = p->next; 113 delete(p->prev); 114 115 } 116 p = p->next; 117 }while(p!=d2||p->next!=d2); 118 119 print_dllist(d1); 120 print_dllist(d2); 121 122 append_dllist(d1, d2); 123 print_dllist(d1); 124 return 0; 125}
回答4件
あなたの回答
tips
プレビュー