krijgen segmentation fault in het zoeken van een element in binaire zoekboom in c ++

stemmen
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 het bovenstaande programma, is enige geval 4 niet goed werkt wanneer ik probeer om de bijzondere element in de boom te vinden. Ik heb zoekelement lid functie op de top van de belangrijkste programma omvatte. Toen ik het debuggen van het programma, kreeg ik segmentation fault in zoekelement lid functie vooral in als voorwaarde. Ik weet echt niet wat ik moet doen om uit dit probleem te komen. Kan iemand me helpen om erachter te komen waarom segmentation fault gebeurt binnen zoekelement lid functie. Laat me weten als je vragen hebt over dit programma.

De vraag is gesteld op 15/04/2011 om 17:23
bron van user
In andere talen...                            


4 antwoorden

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

Zou moeten zijn

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

Als *treeeigenlijk is null je dereferentie een null pointer in de eerste controle. Het ruilen ze rond zal ervoor zorgen dat *treeniet NULL is wanneer u incheckt (*tree)->data- als gevolg van Short Circuit Evaluation

Bovendien &(*tmp)moet worden geschreven als gewoontmp

antwoordde op 15/04/2011 om 17:28
bron van user

stemmen
0

Je dereferentie een niet-geïnitialiseerde pointer (TMP). Je moet ofwel geheugen toe te wijzen voor het of gewoon overslaan het gebruik (Ik kan echt niet achterhalen waarom je een tijdelijke NODE ** hier nodig hebben.)

antwoordde op 15/04/2011 om 17:28
bron van user

stemmen
0

Hier zijn een paar kritieken:
Aangezien u alleen op zoek bent naar een knooppunt, hoeft u niet pointers-to-pointers. De enige keer dat je verwijzingen naar pointers nodig zijn wanneer u daadwerkelijk nodig hebt om de parameter te wijzigen. Ook, omdat u gebruik maakt van C ++, in plaats van het passeren van een pp, moet u een verwijzing passeren: knooppunt * & boom. Dit maakt het zodat u kunt werken met de boom variabele zonder dereference het, omdat de compiler zorg dat zal duren voor u.

In je if-statements, bent u niet controleren of je links of rechts pointers null pointers. Ik weet niet zeker of u sentinel nodes van dit, maar ik neem aan dat je dat niet doen. Met dat, zou ik je wijzigen om dit:

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
}
antwoordde op 15/04/2011 om 17:40
bron van user

stemmen
0

Ja. Inderdaad zoals Erik al gepost je moet schrijven

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

in plaats van

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

Want als itemniet reeds in een boom zal je code zeker leiden tot segfault wanneer het proberen om dereference NULL pointer.

Er is ook een andere (niet zo voor de hand liggend) probleem - absoluut onnodige recursie. Als u geen zorgvuldige afweging doen als insert of verwijderen boom nodes zult u zich de meeste lineaire boom hoogte te hebben en dus op de meeste lineaire recursiediepte die gemakkelijk kunnen leiden tot overloop stapelen. Dus je moet transformeren searchElementfunctie

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;
}
antwoordde op 15/04/2011 om 20:37
bron van user

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