obtinerea de eroare de segmentare în căutarea unui element în arbore binar de căutare în C ++

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

În programul de mai sus, numai cazul în care 4 nu funcționează corect atunci când încerc să găsesc elementul special în copac. Am inclus funcția de membru al elementului de căutare din partea de sus a programului principal. Când am fost depanarea programului, am fost obtinerea de eroare de segmentare în funcție de membru element de căutare mai ales în cazul în care starea. Eu chiar nu știu ce trebuie să fac pentru a ieși din această problemă. Poate cineva te rog ajută-mă să afle de ce eroare de segmentare se întâmplă în interiorul funcția de membru al elementului de căutare. Lasă-mă să știu dacă aveți întrebări referitoare la acest program.

Întrebat 15/04/2011 la 17:23
sursa de către utilizator
În alte limbi...                            


4 răspunsuri

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

Ar trebui să fie

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

În cazul în care de *treefapt este nulă te dereferencing un pointer nul în prima verificare. Pompare - le în jurul valorii se va asigura că *treenu este NULL atunci când verificați (*tree)->data- din cauza Evaluare Short Circuit

În plus, &(*tmp)ar trebui să fie scris ca doartmp

Publicat 15/04/2011 la 17:28
sursa de către utilizator

voturi
0

Ești dereferencing un indicator neinițializate (tmp). Ar trebui să fie aloca memorie pentru ea sau să săriți este utilizarea (eu chiar nu pot da seama de ce ai nevoie de un NOD ** temporar aici.)

Publicat 15/04/2011 la 17:28
sursa de către utilizator

voturi
0

Iată câteva critici:
Din moment ce sunt în căutarea doar pentru un nod, nu aveți nevoie de indicii-la-pointer. Singura dată când aveți nevoie de indicii pentru indicii sunt atunci când de fapt , trebuie să modificați parametrul. De asemenea, din moment ce sunt utilizați C ++, în loc de a trece printr- un pp, ar trebui să treacă o referință: nod * & copac. Acest lucru face astfel încât să puteți lucra cu variabila de copac , fără a fi nevoie să - l dereference, deoarece compilatorul va avea grijă de asta pentru tine.

În cazul în care situațiile, nu vi se verifica dacă indicii stânga sau la dreapta sunt indicii nule. Nu sunt sigur dacă aveți noduri santinelă pentru acest lucru, dar eu sunt presupunând că nu. Cu asta, mi-ar schimba metoda de la acest lucru:

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
}
Publicat 15/04/2011 la 17:40
sursa de către utilizator

voturi
0

Da. Într-adevăr, așa cum Erik postat deja TREBUIE scrie

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

in loc de

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

Pentru că , dacă itemnu este deja într - un copac cod va duce cu siguranta la segfault atunci când încearcă să pointer dereference NULL.

Există , de asemenea , un alt (nu atât de evident) problemă - absolut inutilă recursivitate. Daca nu faci de echilibrare atentă atunci când se introduce sau elimina noduri de arbore va avea cel mult înălțime arbore liniar și , astfel , cel mai adancime recursie liniar care poate duce cu ușurință la stiva de preaplin. Deci ar trebui să transforme searchElementfuncția de a

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;
}
Publicat 15/04/2011 la 20:37
sursa de către utilizator

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