να πάρει σφάλμα κατάτμησης σε αναζήτηση ενός στοιχείου σε δυαδικό δέντρο αναζήτησης σε C ++

ψήφοι
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
    }
}

Στο παραπάνω πρόγραμμα, μόνο την περίπτωση 4 δεν λειτουργεί σωστά, όταν προσπαθώ να βρείτε το συγκεκριμένο στοιχείο στο δέντρο. Έχω συμπεριλάβει συνάρτηση-μέλος στοιχείο αναζήτησης στο επάνω μέρος του κύριου προγράμματος. Όταν ήμουν αποσφαλμάτωση του προγράμματος, έπαιρνα σφάλμα κατάτμησης σε συνάρτηση-μέλος στοιχείο αναζήτησης, ιδίως σε περίπτωση κατάστασης. Πραγματικά δεν ξέρω τι πρέπει να κάνω για να βγει από αυτό το πρόβλημα. Μπορεί κάποιος παρακαλώ να με βοηθήσει να μάθετε γιατί σφάλμα κατάτμησης συμβαίνει στο εσωτερικό συνάρτηση-μέλος στοιχείο αναζήτησης. Επιτρέψτε μου να ξέρω αν έχετε οποιεσδήποτε ερωτήσεις σχετικά με αυτό το πρόγραμμα.

Δημοσιεύθηκε 15/04/2011 στις 17:23
πηγή χρήστη
Σε άλλες γλώσσες...                            


4 απαντήσεις

ψήφοι
3
if( ((*tree)->data == item) || ( (*tree) == NULL) )

πρέπει να είναι

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

Αν *treeπραγματικά είναι μηδενική είστε εύρεση τιμών μηδενική δείκτη στο πρώτο έλεγχο. Εναλλαγή τους γύρω θα εξασφαλίσει ότι *treeδεν είναι NULL όταν κάνετε check (*tree)->data- λόγω της αξιολόγησης βραχυκυκλώματος

Επιπλέον, &(*tmp)θα πρέπει να γραφτεί όπως ακριβώςtmp

Απαντήθηκε 15/04/2011 στις 17:28
πηγή χρήστη

ψήφοι
0

Είσαι εύρεση τιμών σε προετοιμαστεί δείκτη (tmp). Θα πρέπει είτε να εκχωρήσει μνήμη για αυτό ή απλά παραλείψτε την χρήση της (πραγματικά δεν μπορώ να καταλάβω γιατί θα πρέπει να έχετε μια προσωρινή ΝΟΔΕ ** εδώ.)

Απαντήθηκε 15/04/2011 στις 17:28
πηγή χρήστη

ψήφοι
0

Εδώ είναι μερικές κριτικές:
Από ψάχνετε μόνο για έναν κόμβο, δεν χρειάζεται δείκτες-to-δείκτες. Η μόνη φορά που θα χρειαστεί δείκτες σε δείκτες είναι όταν πραγματικά πρέπει να τροποποιήσετε την παράμετρο. Επίσης, από τη στιγμή που χρησιμοποιείτε C ++, αντί να περάσει ένα σελ, θα πρέπει να περάσει μια αναφορά: κόμβου * & δέντρου. Αυτό το κάνει, έτσι ώστε να μπορεί να λειτουργήσει με τη μεταβλητή δέντρο, χωρίς να χρειάζεται να dereference αυτό, δεδομένου ότι ο compiler θα φροντίσει αυτό για σας.

Σε περίπτωση δηλώσεις σας, δεν έχετε τον έλεγχο, αν το αριστερό ή το δεξί δείκτες σας βρίσκονται null δείκτες. Δεν είμαι σίγουρος αν έχετε φρουροί γι 'αυτό, αλλά υποθέτω ότι δεν το κάνουν. Με αυτό, θα ήθελα να αλλάξει τη μέθοδο σας σε αυτό:

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
}
Απαντήθηκε 15/04/2011 στις 17:40
πηγή χρήστη

ψήφοι
0

Ναί. Πράγματι, όπως Erik ήδη αναρτηθεί πρέπει να γράψετε

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

αντί

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

Διότι, αν itemδεν είναι ήδη σε ένα δέντρο κωδικό σας θα οδηγήσει σίγουρα σε segfault όταν προσπαθούν να δείκτη dereference NULL.

Υπάρχει επίσης ένα άλλο (όχι και τόσο προφανής) πρόβλημα - είναι απολύτως αναγκαία αναδρομή. Αν δεν κάνετε προσεκτική στάθμιση όταν εισάγετε ή αφαιρέσετε κόμβους του δέντρου θα έχουν πιο γραμμική ύψος δένδρων και έτσι σε πιο γραμμική βάθος αναδρομής που μπορεί εύκολα να οδηγήσει σε υπερχείλιση στοίβας. Έτσι θα πρέπει να μετατρέψει searchElementτη λειτουργία για να

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;
}
Απαντήθηκε 15/04/2011 στις 20:37
πηγή χρήστη

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