immer Segmentation fault in ein Element in binärer Suchbaum in c ++ Suche

stimmen
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
    }
}

In dem obigen Programm Fall nur 4 funktioniert nicht richtig, wenn ich versuche, das bestimmte Element im Baum zu finden. Ich habe auf der Oberseite des Hauptprogramms Suchelement Memberfunktion enthalten. Als ich Programm debuggen, ich war immer Segmentierungsfehler in Funktionselement Suchelement vor allem in, wenn die Bedingung. Ich weiß wirklich nicht, was ich zu tun, um aus diesem Problem zu kommen. Kann jemand bitte helfen Sie mir, warum Segmentation fault, um herauszufinden, innerhalb Suche Element Elementfunktion geschieht. Lassen Sie uns wissen, wenn Sie Fragen zu diesem Programm.

Veröffentlicht am 15/04/2011 um 17:23
quelle vom benutzer
In anderen Sprachen...                            


4 antworten

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

Sollte sein

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

Wenn *treetatsächlich ist null sind dereferencing Sie einen Null - Zeiger in der ersten Prüfung. Vertauschen sie herum wird sichergestellt , dass *treenicht NULL ist , wenn Sie überprüfen (*tree)->data- aufgrund Short Circuit Bewertung

Darüber hinaus &(*tmp)soll nur geschrieben werdentmp

Beantwortet am 15/04/2011 um 17:28
quelle vom benutzer

stimmen
0

Sie dereferencing einen nicht initialisierten Zeiger (tmp). Sie sollten entweder Speicher für es zuweisen oder einfach nur überspringen es Benutzung (Ich kann wirklich nicht verstehen, warum Sie eine temporäre NODE brauchen ** hier.)

Beantwortet am 15/04/2011 um 17:28
quelle vom benutzer

stimmen
0

Hier sind ein paar Kritik:
Da Sie nur für einen Knoten suchen, die Sie nicht brauchen Zeiger-to-Zeiger. Das einzige Mal , wenn Sie Zeiger auf Zeiger benötigen, wenn Sie tatsächlich die Parameter ändern müssen. Knoten * & Baum: Auch da Sie C ++ verwenden, anstatt eine pp zugeben, sollten Sie einen Verweis übergeben. Das macht es so dass Sie mit dem Baum Variable arbeiten zu dereferenzieren , ohne dass, da der Compiler kümmern , dass für Sie brauchen.

In Ihrem if-Anweisungen werden überprüft Sie nicht, wenn Ihre linke oder rechte Zeiger Null-Zeiger sind. Ich bin mir nicht sicher, ob Sie Sentinel-Lymphknoten für diese, aber ich nehme an, Sie dies nicht tun. Damit würde ich Ihre Methode dies ändern:

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
}
Beantwortet am 15/04/2011 um 17:40
quelle vom benutzer

stimmen
0

Ja. In der Tat, wie Erik bereits gebucht MÜSSEN Sie schreiben

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

Anstatt von

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

Denn wenn itemnicht bereits in einem Baum wird Ihr Code führt DEFINITIV zu segfault wenn zu dereferenzieren NULL - Zeiger zu versuchen.

Es gibt auch eine andere (nicht so offensichtlich) Problem - absolut unnötige Rekursion. Wenn Sie nicht zu tun , wenn ein sorgfältiges Abwägen Einsatz oder Baumknoten entfernen Sie bei den meisten linearen Baumhöhe haben werden und somit bei den meisten linearen Rekursionstiefe , die leicht Überlauf zu stapeln führen kann. So sollten Sie verwandeln searchElementFunktion

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;
}
Beantwortet am 15/04/2011 um 20:37
quelle vom benutzer

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