2016-08-27 8 views
1

私はc.Iを初めて使用しています。ダブルリンクリストを作成する次のコードがあります。ウィンドウ内で単純なcプログラムがクラッシュする

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <conio.h> 
typedef struct Dnode 
{ 
    char c; 
    struct Dnode *left; 
    struct Dnode *right; 
}Dnode; 
void insert(Dnode *,char); 
void unshift(Dnode *,char); 
void travel(Dnode *); 
int main(){ 
    Dnode *cur = (Dnode *)malloc(sizeof(Dnode)); 
    Dnode *head = NULL; 
    head = cur; 

    cur -> c = 'a'; 
    printf("Cur -> c: %c\n",cur->c); 
    cur ->left = NULL; 
    cur -> right = (Dnode *)malloc(sizeof(Dnode)); 
    cur->right->c = 'b'; 
    cur->right->left = cur; 
    cur = cur->right; 
    travel(head); 
    system("pause"); 
    return 0; 
} 
void reset(Dnode *h){ 
    while(h->left) 
     h=h->left; 
} 
void travel(Dnode *head){ 
    printf("Traversing all nodes of list:\n"); 
    while(head->right){ 
     printf("Received char from node %c\n",head->c); 
     head = head->right; 
    } 
    //reset(head); 
} 
void insert(Dnode * d,char c){ 
    Dnode *t = d; 
    while(t ->right) 
     t=t->right; 
    t->right = (Dnode *)malloc(sizeof(Dnode)); 
    if(t->right){ 
     t->right->c = c; 
     t= t->right; 
     t->right = t->left = NULL; 
    } 
} 
void unshift(Dnode *d,char cc){ 
    Dnode *t =(Dnode *)malloc(sizeof(Dnode)); 
    t = d->right; 
    t->left =NULL; 
    d->left = t; 
    d = t; 
}  

問題は、travel()が呼び出された後、すべてのノードが出力されることです。 それは と「ノードBから受信した文字」

「ノードから文字を受信した」印刷しますが、その後Windowsが私のプログラムはcrashed.Anyのアイデアを持っていると言うエラーを与えているように?私は、詳細な回答をしたいと思います将来同様の問題を回避することができます。あなたが最初のループでX.cを印刷することにより開始し、第二のループで初期化されていないポインタを使用travel機能にそう

head ------> X ------> Y ------> uninitialized 
      /^  /
      /|  /
      / \  /
    null<---  ------- 

:あなたのリストを初期化後

+0

デバッガを使用してプログラムをステップ実行し、プログラムが失敗している箇所を確認します。 – Barmar

+2

'cur-> right-> right'は決して初期化していません。 – Barmar

+0

これは「シンプルな」プログラムのようには見えません。 :-P –

答えて

2

は次のようになります。そのため、プログラムがクラッシュします。

だから、追加する必要があります。

cur->right->c = 'b'; 
cur->right->left = cur; 
cur->right->right = NULL // Add this line 

初期化します。

割り当てられたリソースはfreeではありません。だから、(ちょうどreturn前)mainであなたが行う必要があります。

Dnode *tmp; 
while(head){ 
    tmp = head; 
    head = head->right; 
    free(tmp); 
} 

をBTW - mallocによって返された値をキャストしないでください。ただ、Dnode *cur = malloc(sizeof(Dnode));

はBTWん - この行:curはその後使用されないよう

cur = cur->right; 

を削除することができます。

+0

opには、ツリーではない二重リンクリストがあります。 – cssGEEK

+0

@cssGEEK - ありがとうございます。ポインタは左右に名前が混乱しています。回答が更新されました。 – 4386427

+0

どこに追加しますか? –