ダミーノードを先頭に、双方向連結リストを作成したいのですがなかなかうまくできません。とりあえず、ダミーノード無しのものはなんとか出来ましたが、循環連結がうまくいっていない次第です。
どうかお力添え願います。
#include<stdio.h>
#include<malloc.h>
#include<process.h>
typedef struct node{
struct node *left;
char name[20];
int age;
struct node *right;
}NODE;
NODE *memalloc(void);
void main(void)
{
NODE *head, *tail, *p;
tail = NULL;
while(p = memalloc(), printf("名前 年齢入力(Ctrl + Zで終了)>"),
scanf("%s %d", p -> name, &p -> age) != EOF){
p -> left = tail;
tail = p;
}
p = tail;
head = NULL;
while(p != NULL){
p -> right = head;
head = p;
p = p -> left;
}
head -> left = tail;
p = head;
printf("リスト表示\n");
while(p != NULL){
printf("名前:%20s 年齢:%5d\n", p -> name, p -> age);
p = p -> right;
}
}
NODE *memalloc(void)
{
NODE *ptr;
if((ptr = (NODE *)malloc(sizeof(NODE))) != NULL){
return ptr;
}
printf("\n動的メモリ割当に失敗しました。\n");
exit(1);
return 0;
}
No.2ベストアンサー
- 回答日時:
No.1だとまったく入力がない時(いきなりCtrl+Zを入力した時)にheadが未定義、tailがNULLのままループ終了してしまうのでまずいですね。
参考まで、ダミーノード付きのプログラム(領域開放と入力文字数も考慮)を書いておきます。
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
struct node *left;
char name[20];
int age;
struct node *right;
}NODE;
NODE *memalloc(void);
void memfree(NODE *);
int main(void) {
NODE *head, *tail, *p;
char buf[80]; /* 1行入力用 */
/* ダミー作成 */
if ((p = memalloc())==NULL) exit(1);
head = tail = p->left = p->right = p;
/* ノード入力 */
while(printf("名前 年齢入力(Ctrl + Zで終了)>"),
fgets(buf, sizeof(buf), stdin) != NULL) {
if ((p = memalloc())==NULL) { memfree(head); exit(1);}
if (sscanf(buf,"%19s%5d", p->name, &p->age) != 2) { free(p); break;}
tail -> right = p; p -> left = tail; /* pをtailとつなぐ */
head -> left = p; p -> right = head; /* pをheadとつなぐ */
tail = p; /* pは次のtail */
}
/* 右回りに表示 */
p = head -> right;
printf("リスト表示(右回り)\n");
while (p != head) {
printf("名前:%20s 年齢:%5d\n", p -> name, p -> age);
p = p -> right;
}
/* 領域開放 */
memfree(head);
return 0;
}
/* メモリ領域を確保する */
NODE *memalloc(void) {
NODE *ptr;
if((ptr = (NODE *)malloc(sizeof(NODE))) == NULL){
printf("\n動的メモリ割当に失敗しました。\n");
}
return ptr;
}
/* 確保したメモリ領域を開放する */
void memfree(NODE *head) {
NODE *p, *pp;
p = head->right;
while ( p != head) {
pp = p->right; /* 次のノードを一時的に保存 */
free(p);
p = pp;
}
free(p); /* ダミーを開放 */
}
メモリの解放のメソッドまで作成して頂いてありがとうございます。No1の方は不都合があるようなのでこちらを優先して参考させてもらいます。
No.1
- 回答日時:
ノードを追加するごとに正しくleftとrightを設定すればいい。
こんな感じだと思う。
void main(void)
{
NODE *head, *tail, *p;
tail = NULL;
while(p = memalloc(), printf("名前 年齢入力(Ctrl + Zで終了)>"),
scanf("%s %d", p -> name, &p -> age) != EOF){
if (tail == NULL) {
p->left = p->right = p;
// 最初に作成したノードをheadにする。
head = tail = p;
} else {
// どんどん右に追加していく。新規ノードのleftはtailを指し、tailのrightは新規ノードを指す。
p->left = tail;
tail->right=p;
// tailを更新
tail = p;
}
}
// headとtailをつなげて循環参照にする
tail->right = head;
head->left = tail;
printf("リスト表示\n");
if (head) {
p = head;
do {
printf("名前:%20s 年齢:%5d\n", p -> name, p -> age);
p = p -> right;
}while(p != head);
}
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# C言語(構造体) 3 2022/07/05 20:08
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
10個出力で改行したいのですが...
-
c言語でAからZまでを表示する...
-
1秒で動くインターバルタイマ
-
C言語初心者です。次の問題で質...
-
printf で二進表示を行いたい。
-
ヘロンの公式を作ったプルグラ...
-
C言語での数字の花形表示
-
二つの整数値の大小比較
-
インクリメント演算子をprintf...
-
strcmp
-
球の体積と表面積を表示するプ...
-
printf( " %2d", p * q );
-
C言語 プログラミング
-
コンパイルエラーについて
-
エラーの意味が…
-
Cのdoubleの浮動小数点表示につ...
-
Cプログラムについて
-
C言語 関数
-
CTRL+Dでループを抜けるには
-
hit&bolwのプログラミングがで...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10個出力で改行したいのですが...
-
既約分数の表示プログラム
-
printf で二進表示を行いたい。
-
8人分のテストの点数を入力し、...
-
printf( " %2d", p * q );
-
strcmp
-
CTRL+Dでループを抜けるには
-
4の倍数を論理演算で表す。。
-
%P と %X の違い
-
【C言語教えてください】sin波...
-
c言語でAからZまでを表示する...
-
cshの文字列操作(0埋め)
-
万年カレンダーのC言語プログラ...
-
コマンドラインに出力した文字...
-
scanfに文字が入力されたときに...
-
コンパイルエラーについて
-
ホームページをC言語で作りたい...
-
改行について 1行に何個かづ...
-
台形の面積を求めるプログラム
-
なぜgccはstdio.hをインクルー...
おすすめ情報