2016-11-04 1 views
-2

Hier schrieb ich einen Code zur Implementierung der binären Suche tree.it gibt keinen Fehler beim Einfügen von Root-Knoten.Aber wenn ich versuche, Kindknoten einfügen, erhalte ich die folgenden WarnungenProgramm stürzt beim Einfügen zweiten Knoten im binären Suchbaum ab

Gabe des Arguments 1 von Push-inkompatiblen Zeigertyp

erwartet struct Knoten ** aber Argument ist der struct node *

Argument übergeben 1 von Push-inkompatiblen Zeigertyp

und dann stürzt das Programm ab.Was könnte mit diesem Code schief gehen?

#include<stdio.h> 
struct node { 

    int data; 
    struct node *left; 
    struct node *right; 
}; 
void insert(int value); 
void push(struct node **root_node,struct node *newNode); 
void search(struct node *root_node,int value); 

struct node *root; 
int main(){ 
    root= NULL; 
    int option,value; 
    for(;;){ 
     printf("Please select an option from below : \n"); 
     printf("1 for insert\n"); 
     printf("2 for search\n"); 
     printf("please enter your option : "); 
     scanf("%d",&option); 
     printf("\n"); 
     switch(option){ 
      case 1: 
       printf("you choose to insert\n"); 
       printf("input your value :"); 
       scanf("%d",&value); 
       insert(value); 
       printf("\n"); 
       break; 

      default: 
       break; 

     } 
    } 
} 

void insert(int value){ 
    struct node newNode ; 

    newNode.data = value; 
    newNode.left = NULL; 
    newNode.right = NULL; 


    push(&root,&newNode); 

} 
void push(struct node **root_node,struct node *newNode){ 

    if(*root_node==NULL){ 
     *root_node = newNode; 
     printf("inserted\n\n\n"); 
    }else{ 
     if((*root_node)->data > newNode->data){ 
       push((*root_node)->left,newNode); 
       printf("left\n"); 
     }else{ 
      push((*root_node)->right,newNode); 
      printf("right\n"); 
     } 

    } 

} 
+2

1) 'struct node newNode;': Die Lebensdauer von 'newNode' liegt im lokalen Bereich. 2) 'push ((root_node) -> left, newNode);' -> 'push (& (* root_node) -> links, newNode);' – BLUEPIXY

Antwort

0
struct node* search(struct node* root, int key) 
{ 
    // Base Cases: root is null or key is present at root 
    if (root == NULL || root->key == key) 
     return root; 

    // Key is greater than root's key 
    if (root->key < key) 
     return search(root->right, key); 

    // Key is smaller than root's key 
    return search(root->left, key); 
} 
+0

Willkommen bei Stack Overflow. Das ist netter Code, aber es ist nicht wirklich relevant für die Frage, warum die 'insert()' Operation fehlschlägt. –

2

Das Problem ist, diese Art der Zeile:

push((*root_node)->left,newNode); 

(*root_node)->left ist ein struct node* aber Ihre Funktion erwartet struct node** (Doppelzeiger). So haben Sie eine Änderung wie müssen:

push(&((*root_node)->left),newNode); 
    ^
    Notice 

Abgesehen davon, können Sie nicht auf lokale Variablen in den Baum setzen, wie Sie hier tun:

void insert(int value){ 
    struct node newNode ; // Local variable 

Verwenden malloc statt

void insert(int value){ 
    struct node* newNode = malloc(sizeof(struct node)); 
+0

Warum kann ich nicht lokale Variable in Baum .. Ich benutze Zeiger, um darauf zu zeigen .. können Sie bitte erklären –

+1

Die lokale Variable ist verloren (aka außerhalb des Bereichs), wenn die Funktion zurück, so dass Ihr Zeiger auf einige zeigen wird "ungültiger" Speicher, dh Speicher, der die lokale Variable nicht mehr enthält. – 4386427