
ダミーノードを先頭に、双方向連結リストを作成したいのですがなかなかうまくできません。とりあえず、ダミーノード無しのものはなんとか出来ましたが、循環連結がうまくいっていない次第です。
どうかお力添え願います。
#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個出力で改行したいのですが...
-
4の倍数を論理演算で表す。。
-
コマンドラインに出力した文字...
-
入力したお金の金額からお札の...
-
scanfに文字が入力されたときに...
-
unsigned int型について
-
C言語 じゃんけんゲーム 非常...
-
勝率をプログラムに
-
C言語の勉強しています。すみま...
-
C言語のじゃんけんゲームのプロ...
-
printfの出力内の文字をdefine...
-
strcmp
-
標準出力先を変える
-
error C2143: 構文エラー : ';'...
-
2進数の乗算と除算
-
Visual Sutdio 2017 でのC言語...
-
2の累乗を計算するプログラム...
-
C言語について
-
C言語で入力した変数の値から三...
-
cshの文字列操作(0埋め)
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10個出力で改行したいのですが...
-
c言語で2000年以降カレンダーを...
-
c言語でAからZまでを表示する...
-
【C】fizzbuzzのトリッキーなコ...
-
strcmp
-
printf で二進表示を行いたい。
-
【C言語教えてください】sin波...
-
コマンドラインに出力した文字...
-
8人分のテストの点数を入力し、...
-
コンパイルエラーについて
-
CTRL+Dでループを抜けるには
-
(C言語)めちゃくちゃな値にな...
-
cshの文字列操作(0埋め)
-
テキストカーソル位置の取得
-
コマンドプロンプトがすぐ消える
-
printfの出力内の文字をdefine...
-
scanfに文字が入力されたときに...
-
台形の面積を求めるプログラム
-
改行について 1行に何個かづ...
-
WM_CLOSEで閉じれないウィンド...
おすすめ情報