本を読んでみて、リストのイメージは分かってきたような気がするのですが、書き方が全くわかりません。
課題は、
一方向線形リストを構築し、そのデータ全体を先頭からディスプレイに表示するプログラムを作成せよ。
データ:ID 名前
1 Sapporo
2 Sendai
3 Tokyo
4 Nagoya
5 Kyoto
6 Osaka
7 Hiroshima
8 Fukuoka
ということなんですが、他にも、データを挿入したり削除したり、IDもしくは名前を指定してそこのデータだけ表示するという課題が続くのですが、教えて下さい。
リストの課題で困っています。
Re:リストの課題で困っています。
追加と表示のみです。
[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:リストの課題で困っています。
一箇所ミス
は
こうして下さい。
そうしないとCでコンパイル通らない。(C++、C99は通るけど、今回はCで書いたつもりだったので)
// 追加 [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で書いたつもりだったので)