• ベストアンサー
  • すぐに回答を!

双方向リスト

  • 質問No.6008618
  • 閲覧数235
  • ありがとう数1
  • 気になる数0
  • 回答数1
  • コメント数0

お礼率 73% (80/109)

双方向リスト

双方向リストについての質問です。
「入力された数値が昇順にリストに入力されるプログラムを、双方向リストを使って作成せよ。実行結果は以下のようになる。」

%./a.out
Insert:
10
8
2
7
(Ctrl+d)
Show:
2
7
8
10

私は次のようにプログラミングしました。

#include <stdio.h>
#include <stdlib.h>

struct numbers {
struct numbers *right;
struct numbers *left;
int num;
};

main() {
int x;
struct numbers *numtable, *np, *nq, *tmp, *s;

printf("Insert:\n");

numtable = (struct numbers *)malloc(sizeof(struct numbers));
numtable->left = NULL;
numtable->right = NULL;

while(scanf("%d", &x) > 0) {
tmp = (struct numbers *)malloc(sizeof (struct numbers));
tmp->num = x;
tmp->right = NULL;
tmp->left = NULL;

np = numtable->right;
nq = numtable;
while ( np != NULL) {
if ( np->num > x)
break;
nq = np;
np = np->right;
}
tmp->left = nq;
nq->right = tmp;
tmp->right = np;
np->left = tmp;
}

printf("Show:\n");
for (s = numtable; s != NULL; s = s->right)
printf("%d\n", s->num);
}


しかし、いざ実行しようとすると、2個目の数値を代入しようとしたときに動作が停止してしまいます。
どうしたらいいでしょうか、どなたか教えてください。

質問者が選んだベストアンサー

  • 回答No.1
  • ベストアンサー

ベストアンサー率 55% (1857/3366)

初期状態で
> np = numtable->right;
(= NULL)ですから
>np->left = tmp;
NUL->left=tmp
で不具合発生、となります。

nqが「最後」の場合、np= NULLになりますから

if ( nq->right != NULL ) {
np->left = tmp;
}
とするのがよいでしょう。

あと、このやりかただと、最初に確保された構造体がなんの値も不定の値を持ったゴミ要素として最後まで残ります。

> numtable = (struct numbers *)malloc(sizeof(struct numbers));
をnumtable=NULL ;
として、
>np = numtable->right;
>nq = numtable;
>while ( np != NULL) {
の前に
if (numtable==NULL) {
numtable = tmp;
continue;
}
とでも入れるのがいいのではないでしょうか。
補足コメント
tksmsysh

お礼率 73% (80/109)

すみません、解決しました。
貴重なアドバイス、本当にありがとうございました。
投稿日時:2010/07/01 21:49
お礼コメント
tksmsysh

お礼率 73% (80/109)

ご回答ありがとうございます。

tmp->left = nq;
nq->right = tmp;
tmp->right = np;
np->left = tmp;



tmp->left = nq;
nq->right = tmp;
tmp->right = np;
if ( nq->right != NULL)
np->left = tmp;

に変更しましたが、結果は変わりませんでした…。
投稿日時:2010/07/01 21:37
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ