får segmentering feil i å søke et element i binært søketre i c ++

stemmer
1
node ** BST :: searchElement(node **tree, int item)
{
    if( ((*tree)->data == item) || ( (*tree) == NULL) )
        return tree;
    else if( item < (*tree)->data)
        return searchElement( &(*tree)->left, item);
    else
       return searchElement( &(*tree)->right, item);
}

int main(){
    BST obj;
    int choice;
    int height=0,total=0,n,item;
    node **tmp;
    system(cls);

    while(1){
        //clrscr();
        cout<<*****BINARY SEARCH TREE OPERATIONS*****\n\n;
        cout<<1) Create Tree\n;
        cout<<2) Traversal\n;
        cout<<3)  Insert Node\n;
        cout<<4)  Search Node\n;
        cout<<5 Find Smallest Node\n;
        cout<<6) Find Largest Node\n;
        cout<<7) Exit\n;
        cout<<Enter your choice : ;
        cin>>choice;
        switch(choice){
            case 1 : //Create Tree
                cout<<\n\n--Creating Tree--;
                cout<<\nHow many nodes u want to enter : ;
                cin>>n;
                for(int i=0;i<n;i++){
                    cout<<Enter value : ;
                    cin>>item;
                    obj.createTree(&obj.tree,item);
                }
                break;

            case 2 : //All Traversals
                cout<<\n\nInorder Traversal : ;
                obj.inOrder(obj.tree);

                cout<<\n\nPre-order Traversal : ;
                obj.preOrder(obj.tree);

                cout<<\n\nPost-order Traversal : ;
                obj.postOrder(obj.tree);
                getch();
                break;

            case 3 : //Inserting a node in a tree
                cout<<\n\n--Inserting Node in a tree--\n;
                cout<<Enter value : ;
                cin>>item;
                obj.createTree(&obj.tree,item);
                cout<<\nItem is inserted\n;
                getch();
                break;

            case 4 : //Search element
                cout<<\n\n--Search Element--\n;
                cout<<Enter item to searched : ;
                cin>>item;
                &(*tmp) = obj.searchElement(&obj.tree,item);
                if( (*tmp) == NULL)
                cout<<\nSearch Element was not Found;
                else
                    cout<<\nSearch Element was Found;
                getch();
                break;
            case 5 : //Find Smallest Node
                cout<<\n\nSmallest Node is :  ;
                obj.findSmallestNode(obj.tree);
                getch();
                break;

            case 6 : //Find Largest Node
                cout<<\n\nLargest Node is :  ;
                obj.findLargestNode(obj.tree);
                getch();
                break;



            case 7: exit(1);
        }//end of switch
    }
}

I programmet ovenfor, er eneste tilfellet fire ikke fungerer som den skal når jeg prøver å finne den spesielle element i treet. Jeg har tatt med ditt element medlem funksjonen på toppen av hovedprogrammet. Da jeg var debugging program, ble jeg får segmentering feil i søke element medlem funksjon spesielt hvis tilstanden. Jeg vet virkelig ikke hva jeg må gjøre for å komme ut av dette problemet. Kan noen vennligst hjelpe meg å finne ut hvorfor segmentering feil som skjer inne søk element medlem funksjon. Gi meg beskjed hvis du har noen spørsmål angående dette programmet.

Publisert på 15/04/2011 klokken 16:23
kilden bruker
På andre språk...                            


4 svar

stemmer
3
if( ((*tree)->data == item) || ( (*tree) == NULL) )

Bør være

if ( ( (*tree) == NULL) || ((*tree)->data == item) )

Hvis *treefaktisk er null du dereferencing en nullpeker i første sjekk. Bytte dem rundt vil sikre at *treeikke er NULL når du sjekker (*tree)->data- på grunn av Short Circuit Evaluering

I tillegg &(*tmp)bør skrives som baretmp

Svarte 15/04/2011 kl. 16:28
kilden bruker

stemmer
0

Du dereferencing en initialisert peker (TMP). Du bør enten tildele minne for det eller bare hoppe over det er bruk (jeg virkelig ikke kan finne ut hvorfor du trenger en midlertidig NODE ** her.)

Svarte 15/04/2011 kl. 16:28
kilden bruker

stemmer
0

Her er et par kritikk:
Siden du bare søker etter en node, trenger du ikke pekere til pekere. Den eneste gangen du trenger pekere til pekere er når du faktisk trenger å endre parameter. Også, siden du bruker C ++, i stedet for å sende en pp, bør du passere en referanse: node * & treet. Dette gjør det slik at du kan arbeide med treet variabel uten å måtte deferanseoperasjon det, siden kompilatoren vil ta vare på det for deg.

I din hvis uttalelser, er du ikke sjekke om venstre eller høyre pekere er nullpekere. Jeg er ikke sikker på om du har fast punkt noder til dette, men jeg antar du ikke. Med det vil jeg endre metode til dette:

node * BST :: searchElement(node *tree, int item)
{
    if(tree->data == item)
        return tree;
    //short circuit if statements
    else if( (tree->left != NULL) && (item < tree->data) )
        return searchElement( tree->left, item );
    else if( (tree->right != NULL) && (item > tree->data) ) //>= for duplicates
        return searchElement( tree->right, item );

    return NULL; //if it isn't found
}
Svarte 15/04/2011 kl. 16:40
kilden bruker

stemmer
0

Ja. Faktisk så Erik allerede postet du MÅ skrive

if ( ( (*tree) == NULL) || ((*tree)->data == item) )

i stedet for

if( ((*tree)->data == item) || ( (*tree) == NULL) )

Fordi hvis itemikke allerede er i et tre koden din vil definitivt føre til segfault når du prøver å dereference NULL-peker.

Det er også en annen (ikke så opplagt) problem - helt unødvendig rekursjon. Hvis du ikke gjør forsiktig balansering når sette inn eller ta tre noder du vil ha på det meste lineær trehøyden og dermed høyst lineær rekursjon dybde som kan lett føre til stakkoverflyt. Så du bør forandre searchElementfunksjonen til

node** BST::searchElement( node** tree, int item )
{
    while(  ( (*tree) != NULL)  &&  ( (*tree)->data != item )  )
    {
        if( item < (*tree)->data )
        {
            tree = &(*tree)->left;
        }
        else
        {
            tree = &(*tree)->right;
        }
    }

    return tree;
}
Svarte 15/04/2011 kl. 19:37
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more