C中的二叉搜索树,分段错误

C中的二叉搜索树,分段错误,c,pointers,segmentation-fault,binary-search-tree,C,Pointers,Segmentation Fault,Binary Search Tree,我在用C写BST时遇到了一个问题。我一直遇到一个分段错误。我相信问题源于insertNode函数。我在函数中添加了printf()语句,并直接在函数调用之后添加,以查看是否添加了newNode。请忽略代码的其余部分,因为它还没有完成,只是尝试让insertNode函数工作 #include <stdio.h> #include <stdlib.h> //structure for node struct btNode { int data; struct

我在用C写BST时遇到了一个问题。我一直遇到一个分段错误。我相信问题源于insertNode函数。我在函数中添加了printf()语句,并直接在函数调用之后添加,以查看是否添加了newNode。请忽略代码的其余部分,因为它还没有完成,只是尝试让insertNode函数工作

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

//structure for node
struct btNode {
    int data;
    struct btNode *left;
    struct btNode *right;
};

//prototypes
struct btNode* createNode(int x);
void insertNode(struct btNode *tree, struct btNode *root);

int main(){
    int x,n=-1,i=0; //local variables

    struct btNode *head=NULL;

    while (n <= 0){
        printf("Enter the number of nodes in the Tree(>0): ");
        scanf("%i", &n);
    }


    while(i < n){
        printf("Enter an integer: ");
        scanf("%i", &x);
        struct btNode *newNode=createNode(x);
        insertNode(head,newNode);
        printf("%d",head->data); //breaks program here????

        i++;
    }

    while (x < 0){
        printf("Enter a integer from 0-5: ");
        scanf("%i",&x);

        if (x == 0){
            printf("Program Exit.\n");

            exit(0);

        }else if(x==1){


        }else if(x==2){


        }else if(x==3){

        }else if (x==4){

        }else if(x==5){

        }

        x=-1;
    }

    return 0;
}

//creates and returns a pointer to a new node
struct btNode* createNode(int x)
{
    struct btNode *newNode;
    newNode=(struct btNode*)malloc(sizeof(struct btNode));

    if (newNode == NULL){
        printf("Memory Allocation Failed./n");
        exit(20);
    }else{
        newNode->data=x;
        newNode->left=NULL;
        newNode->right=NULL;
        return newNode;
    }
}


void insertNode(struct btNode *tree, struct btNode *newNode){
    if (tree==NULL){
        tree=newNode;
        printf("%d",tree->data); //works fine here!
    }else if(tree->data <= newNode->data){
        insertNode(tree->right, newNode);
    }else if(tree->data > newNode->data){
        insertNode(tree->left, newNode);
    }
}
#包括
#包括
//节点结构
结构btNode{
int数据;
结构btNode*左;
结构btNode*右;
};
//原型
结构btNode*createNode(int x);
void insertNode(struct btNode*树,struct btNode*根);
int main(){
int x,n=-1,i=0;//局部变量
结构btNode*head=NULL;
while(n数据);//在这里中断程序????
i++;
}
而(x<0){
printf(“输入0-5之间的整数:”);
scanf(“%i”和“&x”);
如果(x==0){
printf(“程序退出。\n”);
出口(0);
}else如果(x==1){
}else如果(x==2){
}else如果(x==3){
}else如果(x==4){
}else如果(x==5){
}
x=-1;
}
返回0;
}
//创建并返回指向新节点的指针
结构btNode*createNode(int x)
{
结构btNode*newNode;
newNode=(struct btNode*)malloc(sizeof(struct btNode));
if(newNode==NULL){
printf(“内存分配失败。/n”);
出口(20);
}否则{
newNode->data=x;
newNode->left=NULL;
newNode->right=NULL;
返回newNode;
}
}
void insertNode(结构btNode*树,结构btNode*新节点){
if(tree==NULL){
tree=newNode;
printf(“%d”,tree->data);//在这里工作正常!
}else if(树->数据){
insertNode(树->右侧,新建节点);
}else if(树->数据->新节点->数据){
insertNode(树->左,新建节点);
}
}

节点插入树结构后,必须返回该节点。因此,正确的功能是:

struct btNode *insertNode(struct btNode *tree, struct btNode *newNode){
    if (tree==NULL){
        tree=newNode;
        printf("%d", tree->data); //works fine here!
        return tree;
    }else if(tree->data <= newNode->data){
        tree->right = insertNode(tree->right, newNode);
        return tree;
    }else if(tree->data > newNode->data){
        tree->left = insertNode(tree->left, newNode);
        return tree;      
    }
}

或者让函数take
struct btNode**tree
如@OldProgrammer所暗示的那样。@JonathanLeffler我有我的朋友。我明白了;它没有出现(对我来说,因为我在任何地方都使用HTTPS),直到我去编辑…你应该测试
scanf()
中的返回值;如果程序在第一个循环中获得EOF或非数字(例如
a
),则程序不会停止。始终从
scanf()
等测试结果。如果您期望一个值,请测试它是否返回
1
;它可能返回
0
(表示输入的不是数字)或
EOF
。这个问题实际上是许多其他问题的重复-列表和树都遇到了“如何将信息返回调用代码”的基本问题。
head = insertNode(head, newNode);