ページ 1 / 1
リストの課題で困っています。
Posted: 2006年10月26日(木) 20:05
by オス豚
本を読んでみて、リストのイメージは分かってきたような気がするのですが、書き方が全くわかりません。
課題は、
一方向線形リストを構築し、そのデータ全体を先頭からディスプレイに表示するプログラムを作成せよ。
データ:ID 名前
1 Sapporo
2 Sendai
3 Tokyo
4 Nagoya
5 Kyoto
6 Osaka
7 Hiroshima
8 Fukuoka
ということなんですが、他にも、データを挿入したり削除したり、IDもしくは名前を指定してそこのデータだけ表示するという課題が続くのですが、教えて下さい。
Re:リストの課題で困っています。
Posted: 2006年10月26日(木) 21:32
by GPGA
追加と表示のみです。
[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:リストの課題で困っています。
Posted: 2006年10月26日(木) 22:01
by オス豚
ご丁寧な回答どうもありがとうございます。
参考にして派生課題は考えてみます。
Re:リストの課題で困っています。
Posted: 2006年10月27日(金) 18:02
by GPGA
一箇所ミス
// 追加
[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:リストの課題で困っています。
Posted: 2006年10月29日(日) 17:06
by オス豚
ありがとうございます。実は困ってました。