2016-04-23 70 views
-1

我在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

這個問題實際上是許多其他問題的重複 - 列表和樹都遇到了「如何將信息返回到調用代碼」的基本問題。 –

回答

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無處不在),直到我去編輯... –