• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:リスト構造がうまく動きません!!)

リスト構造がうまく動かないC言語のプログラムの原因と対策

このQ&Aのポイント
  • C言語でリスト構造を使用したプログラムのループがうまく動作しない原因と対策について解説します。
  • プログラムはコンパイルは通るが、2人目以降のデータを表示できない問題が発生しています。
  • 原因はリスト構造のfor文が正しくループしていないことです。対策として、ループの条件を修正する必要があります。

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

  • ベストアンサー
  • 0x131cc6e
  • ベストアンサー率36% (42/115)
回答No.1

>2人目以降のデータを表示させようとしても表示してくれません ということですが、とりあえずMacOS X + GCCで動かしたところ、二人目以降も表示してますね。 ただ、最後の人は絶対にヒットしないので修正する必要があります。ヒントは検索ループの継続条件。 あと、問題がもう一つ。 newperson()でmallocしているけど、プログラム中のどこにもfreeする箇所がない。 とりあえずはそれでも動作しますが、確保したメモリーはきちんと解放するようにしましょうね。

you-two
質問者

お礼

ヒントありがとうございます!! おかげで「LIST != NULL;」ってことに気づけました。あとfreeの注意にも感謝します!!

その他の回答 (2)

  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.3

バグがありました。 -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct _person { char *name; int height; int age; struct _person *next; } person; char * getline(void) { static char buf[BUFSIZ]; if (fgets(buf, BUFSIZ, stdin) == NULL) { exit(0); } buf[strlen(buf) - 1] = 0; return (buf); } int main(void) { int find; char *s, *name; person *head = NULL; person *list; person **nlist; nlist = &head; while (1) { printf("知りたい人の名前は?\n"); name = getline(); find = 0; for (list = head; list != NULL; list = list->next) { if (strcoll(name, list->name) == 0) { printf("%s\t%d\t%d\n", list->name, list->height, list->age); find++; break; } } if (find == 0) { name = strdup(name); printf("見つかりません\n"); printf("データを入れますか? (y/n) "); s = getline(); if (s[0] != 'n') { list = (person *) malloc(sizeof(person)); list->next = NULL; list->name = name; printf("身長:"); list->height = atoi(getline()); printf("年齢:"); list->age = atoi(getline()); *nlist = list; nlist = &list->next; } else { free(name); } } } return (0); }

  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.2

#include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct data { char *name; int height; int age; struct data *next; } person; person * newperson() { person *dummy; dummy = (person *) malloc(sizeof(person)); dummy->next = NULL; return (dummy); } char * getline(void) { static char buf[BUFSIZ]; if (fgets(buf, BUFSIZ, stdin) == NULL) { exit(0); } buf[strlen(buf) - 1] = 0; return (buf); } int main(void) { int find; char *s, *name; person *head = NULL; person *list; person **nlist; person *LIST; nlist = &head; while (1) { printf("知りたい人の名前は?\n"); name = getline(); find = 0; for (LIST = head; head != NULL && LIST != NULL; LIST = LIST->next) { if (strcoll(name, LIST->name) == 0) { printf("%s\t%d\t%d\n", LIST->name, LIST->height, LIST->age); find++; break; } } if (find == 0) { name = strdup(name); printf("見つかりません\n"); printf("データを入れますか? (y/n) "); s = getline(); if (s[0] != 'n') { list = newperson(); list->name = name; printf("身長:"); list->height = atoi(getline()); printf("年齢:"); list->age = atoi(getline()); *nlist = list; nlist = &list->next; } else { free(name); } } } return (0); }

you-two
質問者

お礼

ありがとうございます!! 該当者を検索するプログラムの訂正だけじゃなく、データの追加まで組み込んでもらって助かりました。

関連するQ&A