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

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

ただいまの
回答率

89.10%

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,473

bob_heuer0925

score 30

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()
{
    //未完成
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • ikuwow

    2016/03/08 22:58

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

    キャンセル

  • bob_heuer0925

    2016/03/10 10:03

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

    キャンセル

  • ikuwow

    2016/03/10 11:05

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

    キャンセル

  • bob_heuer0925

    2016/03/10 15:18

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

    キャンセル

回答 3

checkベストアンサー

+6

こんにちは。

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

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/08 15:50

    回答ありがとうございます。

    丁寧な解説までしていただきまして、ありがとうございます。
    根本的な部分でケアレスミスしてたとはお恥ずかしい・・・

    一番最初に回答して頂きましたのでBAにさせて頂きます。

    キャンセル

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/08 15:56

    回答ありがとうございます。

    ソースが分かりにくくて申し訳ないです。。。
    一応自分が作成しようとしてたのが
    番号・名前を入力⇒その値を構造体へ格納⇒連続して入力する場合は、単方向リスト構造体として値を順次格納していく⇒リスト構造体の中身を表示
    というイメージで作成しておりました。

    pochi0701さんのおっしゃる通り、LISTで全てのエラーが消えました。
    ありがとうございました。

    キャンセル

+1

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 15:59

    回答ありがとうございます。

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

    ありがとうございました。

    キャンセル

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

  • ただいまの回答率 89.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる