簡體   English   中英

C中的BST程序

[英]BST program in C

請幫我解決一下這個。 我不斷出現段錯誤! 我想使用遞歸來創建和插入一個新節點。 請幫我調試一下。

//Create a Binary Search Tree From an array.
struct Tree
{
        int data;
    struct Tree *lchild;
    struct Tree *rchild;
};
struct Tree *root = NULL;
struct Tree *node(int val)
{
    struct Tree *tempnode;
    tempnode = (struct Tree*)malloc(sizeof(struct Tree));
    tempnode->data = val;
    tempnode->rchild = NULL;
    tempnode->lchild = NULL;
    return tempnode;
}

void createTree(struct Tree *curr, int val)
{
    struct Tree *newnode = node(val);

    if (curr == NULL)
        curr = newnode;
    else if(val < curr->data)
    {
        createTree(curr->lchild,val);
    }
    else if(val > curr->data)
    {
        createTree(curr->rchild,val);

    }
    else
        printf("Error Similar data found\n");
}

void inorder(struct Tree *root)
{
    if (root->lchild != NULL)
        inorder(root->lchild);
    printf("[%d]    ",root->data);
    if (root->rchild != NULL)
        inorder(root->rchild);
}
int main()
{
//    root = NULL;
    int i = 0, arr[5] = {41,12,32,23,17};
    for(i;i<5;i++)
        createTree(root,arr[i]);
    inorder(root);
    return 0;
}

為什么我會不斷出現段錯誤。 有人可以解釋我嗎? 我在做我不應該做的事情嗎? 還是我在某個時候想念?

樹的根未分配到任何地方; 在函數createTree您可能認為它是在以下位置分配的:

if (curr == NULL)
    curr = newnode;

但是curr對函數而言是本地的,不會影響root 您需要將參數curr更改為指向指針的指針,否則該功能不適用於分配根節點或子節點。 樹的根未分配到任何地方; 在函數createTree您可能認為它是在以下位置分配的:

if (curr == NULL)
    curr = newnode;

但是curr是函數的局部函數,即使您將其作為參數curr也不會影響root 您需要將參數curr更改為指向指針的指針,否則該功能不適用於分配根節點或子節點。 也就是說,函數聲明變為:

void createTree(struct Tree **curr, int val)

當然,您必須相應地在函數內部更改curr的用法(即,指向的地址是*curr ,以前是curr ),函數的調用需要傳遞指針的地址,而不是值(例如, createTree(&root, arr[i]) )。

編輯 :或者,實際上,讓函數返回curr並始終在您調用createTree每個位置將返回值分配給相關的指針,這要感謝@JonathanLeffler的觀察。

學習使用調試器!

逐步執行main函數,您將看到每次調用createTree之后, root的值將保持為NULL

createTree函數不會修改root的值,而只會修改其root值的副本。

您的createTree函數需要采用struct Tree **curr ,即指向指針的指針。 這允許函數修改原始值,而不是本地副本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM