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

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

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

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

Q&A

解決済

3回答

4272閲覧

C言語リスト構造体の登録・参照について

bob_heuer0925

総合スコア30

C

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

0グッド

1クリップ

投稿2016/03/08 05:39

編集2016/03/10 06:17

C言語 リスト構造体の勉強しているのですが、
一日半悩みに悩んだ末、答えが出なかったので質問を聞いてください。

情報を構造体へ任意の回数分登録した後に単方向リストで繋げた構造体を
参照するプログラムを組んでいるのですが、構造体領域の確保をmallocで行った部分で
エラーが発生し進まなくなりました。

・主なエラー場所は自作関数内での領域確保の部分でエラーが発生し
構造体の情報が扱えていない事だと自分は考えていてデバッグ作業にとりかかっていたのですが
もう1日半も前に進まなくなったのでヒントだけでも頂ければと・・・

宜しくお願い致します。

以下ソースになります。


#include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct _LIST{ int key; char name[100 +1]; struct _LIST *next; }LIST; struct LIST *input_str(); struct LIST *show_str(); int main(void) { //まずはリスト構造体へ登録 input_str(); //次に参照 show_str(); return 0; } struct LIST *input_str() { LIST *head; struct LIST *temp; //先頭ポインタの初期化 int tkey; char tname[100+1]; int i;** //入力繰り返し判定用 //head->dummy用構造体の作成 if ((head = (LIST *) malloc(sizeof(LIST))) == NULL) { //error printf("malloc error\n"); exit(EXIT_FAILURE); } head->key = -99; //error strcpy(head->name,"dummy"); //error do{ LIST *tmp = head; //1回目のループにはdummy構造体のheadポインタが入っている printf("番号:"); scanf("%d",&tkey); printf("名前:"); scanf("%s",tname); //一つの構造体の領域を確保! if ((head = (LIST *) malloc(sizeof(LIST))) == NULL) { //error printf("malloc error\n"); exit(EXIT_FAILURE); } //入力されたデータを構造体へ head->key = tkey; //error strcpy(head->name,tname); //error head->next = tmp; //error printf("繰り返し入力しますか? Yes(1)/NO(0):\n"); scanf("%d",&i);}} }while(i == 1); return (head); } struct LIST *show_str() { //未完成 }

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

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

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

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

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

ikuwow

2016/03/08 13:58

シンタックスハイライトしないとコードが非常に読みづらいので、Markdown記法で見やすくしていただけますか。
bob_heuer0925

2016/03/10 01:03

元々見にくいソースで申し訳ないですm(__)m 一応見やすくしたつもりなので、これでご勘弁下さい。
ikuwow

2016/03/10 02:05

Markdown記法ですと、```と```でコードを囲むことで全体がシンタックスハイライトされるようになります。
bob_heuer0925

2016/03/10 06:18

勘違いして関数や変数毎に` `で囲むものと思っておりました。失礼致しました。ご指摘ありがとうございます!
guest

回答3

0

ベストアンサー

こんにちは。

structキーワードの付け方を間違ってます。

typedef struct _List {略} List;
の時は、下記のどちらかで変数宣言します。

struct _List bar; // _List構造体
List boo; // typedefしたList型

struct Listと言う型は存在しないのでコンパイラが混乱しているようです。

投稿2016/03/08 05:49

編集2016/03/08 05:49
Chironian

総合スコア23272

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

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

bob_heuer0925

2016/03/08 06:50

回答ありがとうございます。 丁寧な解説までしていただきまして、ありがとうございます。 根本的な部分でケアレスミスしてたとはお恥ずかしい・・・ 一番最初に回答して頂きましたのでBAにさせて頂きます。
guest

0

struct LIST でなく、LIST でOK

diff strlist.org strlist.cpp 5c5 < typedef struct _LIST{ --- > typedef struct _LIST { 9c9 < }LIST; --- > } LIST; 11,12c11,12 < struct LIST *input_str(); < struct LIST *show_str(); --- > LIST *input_str(); > LIST *show_str(); 25c25 < struct LIST *input_str() --- > LIST *input_str() 28c28 < struct LIST *temp; //先頭ポインタの初期化 --- > LIST *temp; //先頭ポインタの初期化 66c66 < struct LIST *show_str() --- > LIST *show_str()

投稿2016/03/08 05:55

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

bob_heuer0925

2016/03/08 06:59

回答ありがとうございます。 私のC言語習熟度合が低い為、上記ソースが何なんか理解できなくて 申し訳ないのですが、terionさんの仰る通りLIST型で全てを定義したら エラーが消えました。 ありがとうございました。
guest

0

何をしたいソースなのかよく分かりませんが、
typedefしたので
struct LIST→LIST
でコンパイルは通ると思いますが。

投稿2016/03/08 05:53

pochi0701

総合スコア208

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

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

bob_heuer0925

2016/03/08 06:56

回答ありがとうございます。 ソースが分かりにくくて申し訳ないです。。。 一応自分が作成しようとしてたのが 番号・名前を入力⇒その値を構造体へ格納⇒連続して入力する場合は、単方向リスト構造体として値を順次格納していく⇒リスト構造体の中身を表示 というイメージで作成しておりました。 pochi0701さんのおっしゃる通り、LISTで全てのエラーが消えました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問