- ベストアンサー
リスト構造がうまく動かないC言語のプログラムの原因と対策
- C言語でリスト構造を使用したプログラムのループがうまく動作しない原因と対策について解説します。
- プログラムはコンパイルは通るが、2人目以降のデータを表示できない問題が発生しています。
- 原因はリスト構造のfor文が正しくループしていないことです。対策として、ループの条件を修正する必要があります。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>2人目以降のデータを表示させようとしても表示してくれません ということですが、とりあえずMacOS X + GCCで動かしたところ、二人目以降も表示してますね。 ただ、最後の人は絶対にヒットしないので修正する必要があります。ヒントは検索ループの継続条件。 あと、問題がもう一つ。 newperson()でmallocしているけど、プログラム中のどこにもfreeする箇所がない。 とりあえずはそれでも動作しますが、確保したメモリーはきちんと解放するようにしましょうね。
その他の回答 (2)
- mac_res
- ベストアンサー率36% (568/1571)
バグがありました。 -- 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)
#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); }
お礼
ありがとうございます!! 該当者を検索するプログラムの訂正だけじゃなく、データの追加まで組み込んでもらって助かりました。
お礼
ヒントありがとうございます!! おかげで「LIST != NULL;」ってことに気づけました。あとfreeの注意にも感謝します!!