C中的二叉搜索树,分割错误错误
我在C中编写BST时遇到问题。我不断收到分段错误错误。我相信这个问题来自insertNode函数。我在函数中添加了printf()语句,并直接在函数调用后查看是否添加了newNode。请忽略其余的代码,因为它没有完成,只是试图让insertNode函数工作。C中的二叉搜索树,分割错误错误
#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);
}
}
您必须在将node
插入树形结构后返回node
。所以,你的正确功能是:
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;
}
}
还可以修改您的来电:
head = insertNode(head, newNode);
或者只是让函数把'struct btNode ** tree'作为@OldProgrammer的暗示。 –
@JonathanLeffler我有我的朋友。 –
所以我明白了;它没有出现(对我来说,因为我使用HTTPS无处不在),直到我去编辑... –
你应该从'scanf函数测试返回值()';如果程序在第一个循环中得到EOF或者非数字(例如'a'),程序就不会停止。总是测试'scanf()'的结果等。如果你期待一个值,测试它返回'1';它可能会返回'0'(表明输入的内容不是数字)或'EOF'。 –
这个问题实际上是许多其他问题的重复 - 列表和树都遇到了“如何将信息返回到调用代码”的基本问题。 –