• ベストアンサー

リスト構造を使ってSortとSearchをするプログラム

タイトルのとおりのプログラムを組んでみました ----------himajin.c----------- #include <stdio.h> #include <string.h> #include <stdlib.h> // 参考:http://www9.plala.or.jp/sgwr-t/c/sec15-5.html // コンパイラ:BCC 5.5 // アイテムの加え方が違う。 struct Item { int data; /* データ */ struct Item *next; /* 次のデータへのポインタ */ }; struct Item *head; struct Item *tail; struct Item *addItem(struct Item *p,int newdata){ struct Item *t; t->data = newdata; t->next = tail; p->next = t; return t; } int main(){ struct Item *item; int inputdata; head = item; item->next = tail; while (scanf("%d", &inputdata) != EOF) { item = addItem(item,inputdata); } /* search(5); sort(); */ return 0; } int sort(){ struct Item *j; struct Item *p; struct Item *t; p = head; t = head; while (p->next != tail){ while (p->data > t->data){ j = t; t = t->next; } j->next = p; p->next = t; p = p->next; } } int search(int searchdata){ struct Item *t; t = head; tail->data = searchdata; while (searchdata != t->data){ t = t->next; } if(t == tail){ printf("Not Found"); } else{ printf("Found"); /*後で考える*/ } return 0; } ---- ...が、コマンドラインで himajin.exe 5 と入力してみたところ、いきなりプログラムが落ちました。何がいけないのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • ganzou
  • ベストアンサー率29% (25/85)
回答No.1

int main(){ struct Item *item; int inputdata; head = item; のところで、itemには何も入っていません。 なので、 item = (struct Item*)malloc( sizeof(struct Item) ) という一文が必要です。

noname#20378
質問者

補足

皆様の回答、非常に参考になります。失礼ながら、もう少しお付き合いいただけますでしょうか?なお、ソースが長いので、皆様の補足欄を大量に使わせていただきます。 searchの方は(多分)うまく作成できました。 #include <stdio.h> #include <string.h> #include <stdlib.h> // 参考:http://www9.plala.or.jp/sgwr-t/c/sec15-5.html // コンパイラ:BCC 5.5, Cygwin + GCC // アイテムの加え方が違う。 struct Item { int data; /* データ */ struct Item *next; /* 次のデータへのポインタ */ }; struct Item *head; struct Item *tail; struct Item *addItem(struct Item *p,int newdata){ struct Item *t; t = (struct Item*)malloc( sizeof(struct Item) ); t->data = newdata; t->next = tail; p->next = t; return t; } int main(){ struct Item *item; int inputdata; int number; item = (struct Item*)malloc( sizeof(struct Item) ); head = (struct Item*)malloc( sizeof(struct Item) ); tail = (struct Item*)malloc( sizeof(struct Item) ); head = item; item->next = tail; while (scanf("%d", &inputdata) != EOF) { item = addItem(item,inputdata); } search(5); /*5を探す場合*/ show(); return 0; } int search(int searchdata){ struct Item *t; int num; num = 1; t = (struct Item*)malloc( sizeof(struct Item) ); t = head->next; tail->data = searchdata; while (t != tail){ printf("%d\n",t->data); if(t->data == searchdata){ printf("Found. Line %d\n",num); } t = t->next; num = num + 1; } return 0; } int show(){ struct Item *t; t = (struct Item*)malloc( sizeof(struct Item) ); t = head->next; while(t != tail){ printf("%d\n",t->data); t = t->next; } printf("\n"); return 0; }

その他の回答 (2)

回答No.3

>// 参考:http://www9.plala.or.jp/sgwr-t/c/sec15-5.html ここの下の方に関数 add_list の流れの説明がありますが、 himajin2009のプログラムには、2. と3. が抜けてますね。 同じサイトの第10章ポインタを参照して下さい。 わかりやすく説明されていると思います。

参考URL:
http://www9.plala.or.jp/sgwr-t/c/sec10.html
noname#20378
質問者

お礼

すごく汚いソースになりましたが、何とか完成しました!

  • ganzou
  • ベストアンサー率29% (25/85)
回答No.2

struct Item *addItem(struct Item *p,int newdata){ struct Item *t; t->data = newdata; t->next = tail; p->next = t; return t; } のところもNo.1と同じ問題を抱えています。

noname#20378
質問者

補足

Sortが全然うまくいかない。 #include <stdio.h> #include <string.h> #include <stdlib.h> // 参考:http://www9.plala.or.jp/sgwr-t/c/sec15-5.html // コンパイラ:BCC 5.5, Cygwin + GCC // アイテムの加え方が違う。 struct Item { int data; /* データ */ struct Item *next; /* 次のデータへのポインタ */ }; struct Item *head; struct Item *tail; struct Item *addItem(struct Item *p,int newdata){ struct Item *t; t = (struct Item*)malloc( sizeof(struct Item) ); t->data = newdata; t->next = tail; p->next = t; return t; } int main(){ struct Item *item; int inputdata; int number; item = (struct Item*)malloc( sizeof(struct Item) ); head = (struct Item*)malloc( sizeof(struct Item) ); tail = (struct Item*)malloc( sizeof(struct Item) ); head = item; item->next = tail; while (scanf("%d", &inputdata) != EOF) { item = addItem(item,inputdata); } sorts(); show(); return 0; } int sorts(){ struct Item *j; struct Item *p; struct Item *t; struct Item *k; struct Item *z; int c; c = 0; j = (struct Item*)malloc( sizeof(struct Item) ); p = (struct Item*)malloc( sizeof(struct Item) ); t = (struct Item*)malloc( sizeof(struct Item) ); k = (struct Item*)malloc( sizeof(struct Item) ); z = (struct Item*)malloc( sizeof(struct Item) ); r = head; j = head; k = head->next; p = k; t = k->next; while (k->next != tail){ printf("処理中\n"); tail->data = p->data; while ((p->data) > (t->data)){ j = t; t = t->next; c = 1; } printf("%d\n",j->data); k = k->next; if (c == 1){ j->next = p; p->next = t; } p = k; t = p->next; c = 0; show(); } printf("完了\n"); } int show(){ struct Item *t; t = (struct Item*)malloc( sizeof(struct Item) ); t = head->next; while(t != tail){ printf("%d\n",t->data); t = t->next; } printf("\n"); return 0; } これで作成したsort.exeに対し、 1 5 2 3 7 9 6 4 1 2 というテキストファイルを実験的にかましたところ 完了という文字が出る前に出力されたのは 1 5 7 9 でした。

関連するQ&A