egyre szegmentációs hiba keresésében egy elem bináris keresési fa c ++

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

A fenti program, csak a 4. eset nem működik megfelelően, ha megpróbálom megtalálni az adott elem fa. Én is kereső elem tag függvény tetején a fő program. Amikor hibakereső program, Kezdtem szegmentációs hiba a keresési elem elem funkció különösen, ha a feltétel. Igazán nem tudom, mit kell tennie, hogy jön ki ez a probléma. Tud valaki kérem, segítsen nekem, hogy megtudja, miért szegmentációs hiba történik belül kereső elem tag függvény. Hadd tudja, ha bármilyen kérdése van a programban.

A kérdést 15/04/2011 17:23
a forrás felhasználó
Más nyelveken...                            


4 válasz

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

Kellene

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

Ha *treevalóban van null te visszahivatkozási null pointer az első csekket. Csere őket körül biztosítani fogja, hogy *treenem NULL, ha ellenőrizni (*tree)->datamiatt - Short Circuit szervíz

Továbbá, &(*tmp)kell írni, mint csaktmp

Válaszolt 15/04/2011 17:28
a forrás felhasználó

szavazat
0

Te visszahivatkozási egy nem inicializált mutató (tmp). Akkor vagy memóriát kiosztani, vagy csak hagyja ez használat (én tényleg nem tud rájönni, hogy miért van szükség egy ideiglenes CSOMÓPONT ** itt.)

Válaszolt 15/04/2011 17:28
a forrás felhasználó

szavazat
0

Itt van egy pár kritikák:
Mivel csak keres egy csomópont, akkor nem kell mutatókat-to-mutatók. Az egyetlen alkalommal, amikor szükség mutató pointerek ha valóban szükség van, hogy módosítsa a paramétert. Továbbá, mivel az Ön által használt C ++, ahelyett, hogy továbbítaná a pp, akkor át kell mennie a referencia: node * & fa. Ez teszi, így a munka a fa változó anélkül, hogy dereference, hiszen a fordító vigyázni, hogy az Ön számára.

Az Ön utasításból, ha nem ellenőrzi, ha a bal vagy a jobb mutató null mutató. Nem vagyok benne biztos, ha van sentinel csomópontok erre, de felteszem, hogy nem. Azzal, hogy azt megváltoztatni a módszer, hogy ezt:

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
}
Válaszolt 15/04/2011 17:40
a forrás felhasználó

szavazat
0

Igen. Valóban Erik már kifüggesztett meg kell írni

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

ahelyett

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

Mert ha itemnincs már egy fa a kódot biztosan vezet a segfault amikor megpróbálja dereference NULL pointer.

Van még egy (nem annyira nyilvánvaló) probléma - teljesen felesleges rekurziót. Ha nem csinál gondos mérlegelése, amikor betét vagy eltávolítása facsomópontok akkor legfeljebb lineáris fa magassága, és így legfeljebb lineáris rekurzív mélység, könnyen vezethet verem túlcsordulás. Így kell átalakítani searchElementa funkciót

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;
}
Válaszolt 15/04/2011 20:37
a forrás felhasználó

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