リスト構造を使った問題でわからないのがあるので、もし分かる方居ましたら教えてほしいです。
問題[リスト構造を使って会員名簿を作成せよ]
○氏名に"quit"が入力されるまで氏名を入力し続けるものとする。
○numberは入力をした順序を表す自然数とする。
○ struct member *HEAD, *TAIL;
を大域変数として定義し、このリストの先頭と末尾のポインターを表すものとする。
struct member *allocBox(int number, char *name, struct member *tail);
の詳細
1)struct memberを1つ分割りつける。そのアドレスをnew_ptとおく。
2)引数で渡されたtailから、tail->next = new_pt;とする。(これまで一番最後にあった構造体のメンバー nextに新しく割り当てたstruct memberのアドレス new_ptを代入)
3)new_ptをreturnする。
void display_all(struct member *head);
の詳細
headからつながるすべてのstruct memberの中身を画面表示する。
これは、再帰的に定義することもできる。この場合とてもシンプルに定義可能。
つまり、display_all(head)はheadの中身のデータを表示して、display_all(head->next)を実行すれば良い。
ヒントを参考にして作ったのですが、セグメンテーションフォルトを起こしてしまいます。
直さなければいけない部分を教えていただけますでしょうか。
c
1 2#include<stdio.h> 3#include<malloc.h> 4struct member{ 5 int number; 6 char name[50]; 7 struct member *next; 8}; 9 10struct member *allocBox(int number,char *name,struct member *tail); 11void display_all(struct member *head); 12 13struct member *HEAD, *TAIL; 14 15int main(void) { 16 int i; 17 char name[50]; 18 struct member *HEAD, *TAIL; 19 HEAD = TAIL = NULL; 20 do { 21 printf("Input name >"); 22 scanf("%s", name); 23 if (strcmp(name, "quit") != 0) { 24 TAIL = allocBox(i, name, TAIL); 25 if (HEAD == NULL){ 26 HEAD = TAIL; 27 i++; 28 } 29 } 30 }while(strcmp(name, "quit")!=0); 31 display_all(HEAD); 32 return 0; 33} 34 35struct member *allocBox(int number,char *name,struct member *tail){ 36//多分ここから間違っている? 37 38 struct member *new_pt; 39 40 new_pt=(struct member *)malloc(sizeof(struct member)); 41 42 tail->next = new_pt; 43 tail = new_pt; 44 return new_pt; 45} 46 47void display_all(struct member *head){ 48 if(head != NULL){ 49 printf("%d:%s",head->number,head->name); 50 display_all(head->next); 51 } 52 return ; 53} 54 55
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/15 07:37
2020/07/15 07:45
2020/07/15 07:51
2020/07/15 22:11