2017-05-28 73 views
4

我創建了以下庫以在二叉樹中插入,刪除,搜索和打印節點。在二叉樹中插入節點時程序崩潰

#include <stdlib.h> 

struct NODE 
{ 
    int code; 
    char subject[20]; 
    struct NODE *left; 
    struct NODE *right; 
}; 


void InOrder(struct NODE *R) 
{ 
    if (R==NULL) 
    return; 
    InOrder(R->left); 
    printf("%d %s\n",R->code,R->subject); 
    InOrder(R->right); 
} 

void PreOrder(struct NODE *R) 
{ 
    if (R==NULL) 
    return; 
    printf("%d %s\n",R->code,R->subject); 
    InOrder(R->left); 
    InOrder(R->right); 
} 

void PostOrder(struct NODE *R) 
{ 
    if (R==NULL) 
    return; 
    InOrder(R->left); 
    InOrder(R->right); 
    printf("%d %s\n",R->code,R->subject); 
} 

struct NODE *Search(struct NODE *R,int CODE,struct NODE **father) 
{ 
    if(R==NULL) 
    return NULL; 
    if(R->code==CODE) 
    { 
     *father=R; 
     return R; 
    } 
    if (CODE<R->code) 
    return Search(R->left,CODE,father); 
    else 
    return Search(R->right,CODE,father); 
} 

struct NODE * CreateNode(struct NODE T) 
{ 
    struct NODE *tmp; 
    tmp=(struct NODE *)malloc(sizeof(T)); 
    *tmp=T; 
    tmp->left=tmp->right=NULL; 
    return tmp; 
} 

int Insert(struct NODE **R,struct NODE ND) 
{ 
    struct NODE *cur,*fath=NULL; 
    cur=Search(*R,ND.code,&fath); 
    if (cur) 
    return 0; 
    cur=CreateNode(ND); 
    if(fath==NULL) 
    *R=cur; 
    else 
    if(fath->code>ND.code) 
    fath->left=cur; 
    else 
    fath->right=cur; 
    return 1; 
} 

struct NODE *MinOfMax (struct NODE *ND) 
{ 
    struct NODE *tmp; 
    if (ND==NULL) 
    return NULL; 
    if(ND->right==NULL) 
    return NULL; 
    tmp=ND->right; 
    while(tmp->left!=NULL) 
    tmp=tmp->left; 
    return tmp; 
} 

struct NODE* Delete(struct NODE *R, int code) 
{ 
    if (R==NULL) 
    return R; 
    if (code<R->code) 
    R->left=Delete(R->left,code); 
    else if (code>R->code) 
    R->right=Delete(R->right,code); 
    else 
    { 
     if (R->left==NULL) 
     { 
      struct NODE *temp=R->right; 
      free(R); 
      return temp; 
     } 
     else if (R->right==NULL) 
     { 
      struct NODE *temp=R->left; 
      free(R); 
      return temp; 
     } 
     struct NODE *temp=MinOfMax(R->right); 
     R->code=temp->code; 
     R->right=Delete(R->right,temp->code); 
    } 
    return R; 
} 

當我嘗試插入在二進制樹中的節點,該程序crashes.Here是我的主要:

int main(int argc,char* argv[]) 
{ 
    typedef struct NODE NODE; 
    NODE *root=NULL; 
    NODE tmp; 
    Insert(&root,tmp); 
    return 0; 
} 

我試圖分配靜態值(例如代碼= 100和主題= 「物理」),但仍然程序崩潰。我應該malloc的東西,改變任何東西在我的頭文件或做一些完全不同的東西?我卡在這裏幾個小時沒有找到任何解決方案。大多數插入功能假設我只有一個整數作爲節點中的數據,但我需要傳遞整個節點。

+2

在main'root'中未初始化。 (以及tmp) – wildplasser

+0

請添加程序的輸出,人們可以幫助您獲得更好的信息:) – captainepoch

+0

@wildplasser我應該如何初始化它?我應該malloc根節點? –

回答

1

你的代碼基本上什麼都不做。看起來你是從某處複製粘貼的。我試圖弄清楚這裏是一個代碼示例。基本上,當你嘗試插入它時,你必須在主體中初始化一個新節點。 請注意,這只是一個例子,我沒有完整的測試。

int main(int argc,char* argv[]) 
{ 
    typedef struct NODE NODE; 
    NODE *root=NULL; 
    NODE *tmp = malloc(sizeof(struct NODE)); 
    tmp->code = 1; /*Just a number*/ 
    strcpy(tmp->subject,"prova"); /*Put something in it*/ 
    Insert(&root,*tmp); /* Try to insert it*/ 
    PreOrder(root); /*Try to see if it has been inserted*/ 
    return 0; 
} 
+0

感謝您的回答,這是我的錯,我沒有初始化根指針爲NULL。現在我的程序正常工作。 –

+0

@JohnM。你應該把答案標記爲正確的傢伙。 – BetaRunner

1

您的tmp節點即將用作新插入的節點未初始化的在您的main()中。如果您使用了-Wall標誌,您的編譯器可能會爲此警告您。

因此,讓我們在你插入功能一看:

int Insert(struct NODE **R, struct NODE ND) 
{ 
    struct NODE *cur,*fath=NULL; 
    cur = Search(*R, ND.code, &fath); // ND.code is junk, since ND is uninitialized 
    ... 
    return 1; 
} 

這可能會導致分段錯誤。

root也是,你可以將它初始化爲NULLmain()


不是你的問題的原因,但Do I cast the result of malloc?

+0

編譯器通常不會診斷未初始化值的使用(我總是在Valgrind中找到這些值) –

+0

我明白,但我想我需要在Insert函數之外初始化它,對吧? –

+0

@PaulStelian正確,看我更新的答案!是的,約翰。 – gsamaras