リストの課題で困っています。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
オス豚

リストの課題で困っています。

#1

投稿記事 by オス豚 » 17年前

本を読んでみて、リストのイメージは分かってきたような気がするのですが、書き方が全くわかりません。
課題は、

一方向線形リストを構築し、そのデータ全体を先頭からディスプレイに表示するプログラムを作成せよ。
データ:ID   名前
    1   Sapporo
    2   Sendai
    3   Tokyo
    4   Nagoya
    5   Kyoto
    6   Osaka
    7   Hiroshima
    8   Fukuoka

ということなんですが、他にも、データを挿入したり削除したり、IDもしくは名前を指定してそこのデータだけ表示するという課題が続くのですが、教えて下さい。

GPGA

Re:リストの課題で困っています。

#2

投稿記事 by GPGA » 17年前

追加と表示のみです。
[color=00B0FF]#include[/color] <stdio.h>
[color=00B0FF]#include[/color] <stdlib.h>
[color=00B0FF]#include[/color] <string.h>

// リスト構造体
[color=00B0FF">typedef[/color] [color=00B0FF]struct[/color] tagListData
{
    [color=00B0FF]int[/color]                 id;             // ID
    [color=00B0FF]char[/color]                name[80];       // 名前
    [color=00B0FF]struct[/color] tagListData* next;           // 次のリストのポインタ
} ListData;

// ---------------------------------------
// ★ リスト追加
//
// 引数 ppData [in] リストの先頭のアドレス
//      szName [in] 名前
//
// 戻り値  0 成功
//        -1 失敗
// ---------------------------------------
[color=00B0FF">int[/color] Add(ListData** ppData, [color=00B0FF">const[/color] [color=00B0FF]char[/color]* szName)
{
    ListData* pNew = NULL;

    pNew = (ListData*)malloc([color=00B0FF]sizeof[/color](ListData));     // 領域確保
    // エラーチェック
    [color=00B0FF]if[/color] (pNew == NULL) {
        [color=00B0FF]return[/color] -1;
    }
    strcpy(pNew->name, szName);     // 名前コピー
    pNew->next = NULL;              // 次のリストをなしに設定

    [color=00B0FF]if[/color] (*ppData == NULL) {
        // データがまったくない場合
        *ppData = pNew;
        pNew->id = 0;               // IDセット
    } [color=00B0FF]else[/color] {
        // データが一つでも存在する場合
        ListData* p = *ppData;
        [color=00B0FF]int[/color] i;

        // リストの最後までポインタをずらす
        [color=00B0FF]for[/color] (i = 0; p->next != NULL; p = p->next, i++);

        // リストの最後に作成したデータを入れる
        p->next = pNew;
        pNew->id = i + 1;           // IDセット
    }

    [color=00B0FF]return[/color] 0;
}

// ---------------------------------------
// ★ 表示
// ---------------------------------------
[color=00B0FF]void[/color] Draw(ListData* pData)
{
    [color=00B0FF]for[/color] (; pData != NULL; pData = pData->next) {
        printf("ID:%3d Name:%s\n", pData->id, pData->name);
    }
}

// ---------------------------------------
// ★ 全て開放
// ---------------------------------------
[color=00B0FF]void[/color] AllRelease(ListData* pData)
{
    [color=00B0FF]if[/color] (pData != NULL) {
        AllRelease(pData->next);
        free(pData);
        pData = NULL;
    }
}

// ---------------------------------------
// ★ メイン
// ---------------------------------------
[color=00B0FF">int[/color] main([color=00B0FF]void[/color])
{
    ListData* p = NULL;
    [color=00B0FF]char[/color]* name[/url] = 
    {
        "Sapporo",
        "Sendai",
        "Tokyo",
        "Nagoya",
        "Kyoto",
        "Osaka",
        "Hiroshima",
        "Fukuoka",
    };

    // 追加
    [color=00B0FF">for[/color] ([color=00B0FF]int[/color] i = 0; i < 8; i++) {
        Add(&p, name);
    }

    // 表示
    Draw(p);

    // リスト開放
    AllRelease(p);

    [color=00B0FF]return[/color] 0;
}

オス豚

Re:リストの課題で困っています。

#3

投稿記事 by オス豚 » 17年前

ご丁寧な回答どうもありがとうございます。
参考にして派生課題は考えてみます。

GPGA

Re:リストの課題で困っています。

#4

投稿記事 by GPGA » 17年前

一箇所ミス
// 追加
    [color=00B0FF">for[/color] ([color=00B0FF]int[/color] i = 0; i < 8; i++) {
        Add(&p, name);
    }



[color=00B0FF]int[/color] i;

    // 追加
    [color=00B0FF]for[/color] (i = 0; i < 8; i++) {
        Add(&p, name);
    }


こうして下さい。
そうしないとCでコンパイル通らない。(C++、C99は通るけど、今回はCで書いたつもりだったので)

オス豚

Re:リストの課題で困っています。

#5

投稿記事 by オス豚 » 17年前

ありがとうございます。実は困ってました。

閉鎖

“C言語何でも質問掲示板” へ戻る