質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

3716閲覧

C言語リスト構造について

hacch

総合スコア15

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

1クリップ

投稿2020/07/14 16:00

リスト構造を使った問題でわからないのがあるので、もし分かる方居ましたら教えてほしいです。
問題[リスト構造を使って会員名簿を作成せよ]
○氏名に"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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

エラー原因は他の方が回答されているので、別コメント。

最後にmallocした領域を解放する処理を入れましょう。
このプログラムの場合、main関数終了(プロセス終了時)に領域は解放されますが、
mallocした領域は不要となったら解放する習慣をつけておくことをお勧めします。

C

1/* サンプル */ 2void free_memory(struct member *head) { 3 If (head == NULL) { 4 return; 5 } 6 free_memory(head->next); 7 free(head); 8}

main関数のreturn 0;の前に上記関数を
free_memory(HEAD);
として呼び出せばOKです。

投稿2020/07/15 02:07

DreamTheater

総合スコア1095

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mattn

2020/07/15 07:37

リストが深いとスタックオーバーフローしそうな気もしますね。 while (head != NULL) { struct member *tmp = head; head = head->next; free(tmp); } が良い気がしました。
DreamTheater

2020/07/15 07:45

mattnさん 仰る通りループで解放するのが安全ですね。 まあリスト上限が数十件程度なら問題ないかと ^ ^
episteme

2020/07/15 07:51

それゆーたらdisplay_all()も同罪で。
guest

0

ベストアンサー

C

1#define _CRT_SECURE_NO_WARNINGS // disable warning only for Visual C++ 2#include <stdio.h> 3#include <malloc.h> 4#include <string.h> // 追加 5 6struct member { 7 int number; 8 char name[50]; 9 struct member* next; 10}; 11 12struct member* allocBox(int number, char* name, struct member* tail); 13void display_all(struct member* head); 14 15struct member* HEAD, * TAIL; 16 17int main(void) { 18 int i = 1; // 通し番号は初期値1とする 19 char name[50]; 20// struct member* HEAD, * TAIL; // マチガイ: グローバル変数と重複している 21 HEAD = TAIL = NULL; 22 while ( 1 ) { 23 printf("Input name >"); 24 scanf("%s", name); 25 if (strcmp(name, "quit") == 0) break; // loopを抜ける 26 TAIL = allocBox(i, name, TAIL); 27 if (HEAD == NULL) { 28 HEAD = TAIL; 29 } 30 i++; 31 } 32 display_all(HEAD); 33 return 0; 34} 35 36struct member* allocBox(int number, char* name, struct member* tail) { 37 struct member* new_pt = (struct member*)malloc(sizeof(struct member)); 38 39 if ( tail != NULL ) { // tailがNULLのとき 40 tail->next = new_pt; // tail->next を参照してはならない 41 } 42 new_pt->next = NULL; 43 new_pt->number = number; 44 strcpy(new_pt->name, name); 45 46 return new_pt; 47} 48 49void display_all(struct member* head) { 50 if (head != NULL) { 51 printf("%d:%s\n", head->number, head->name); 52 display_all(head->next); 53 } 54}

投稿2020/07/14 16:56

編集2020/07/14 17:07
episteme

総合スコア16612

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

初回は TAIL が NULL のはずなので NULL 除けしないと落ちます。

c

1struct member *allocBox(int number,char *name,struct member *tail){ 2 //多分ここから間違っている? 3 4 struct member *new_pt; 5 6 new_pt = (struct member *)malloc(sizeof(struct member)); 7 if (tail != NULL) 8 tail->next = new_pt; 9 tail = new_pt; 10 return new_pt; 11}

投稿2020/07/14 16:18

mattn

総合スコア5030

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問