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); 
    } 
} 
+0

你应该从'scanf函数测试返回值()';如果程序在第一个循环中得到EOF或者非数字(例如'a'),程序就不会停止。总是测试'scanf()'的结果等。如果你期待一个值,测试它返回'1';它可能会返回'0'(表明输入的内容不是数字)或'EOF'。 –

+1

这个问题实际上是许多其他问题的重复 - 列表和树都遇到了“如何将信息返回到调用代码”的基本问题。 –

您必须在将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); 
+0

或者只是让函数把'struct btNode ** tree'作为@OldProgrammer的暗示。 –

+0

@JonathanLeffler我有我的朋友。 –

+0

所以我明白了;它没有出现(对我来说,因为我使用HTTPS无处不在),直到我去编辑... –