ग में द्विआधारी खोज वृक्ष में एक तत्व खोज में विभाजन गलती हो रही ++

वोट
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वास्तव में है अशक्त यदि आप पहली जांच में एक अशक्त सूचक dereferencing कर रहे हैं। उनके आसपास गमागमन यह सुनिश्चित करेंगे कि *treeशून्य है जब आप की जाँच नहीं है (*tree)->data- के कारण शॉर्ट सर्किट मूल्यांकन

साथ ही, &(*tmp)बस के रूप में लिखा जाना चाहिएtmp

15/04/2011 को 17:28
का स्रोत उपयोगकर्ता

वोट
0

आप एक गैर-आरंभिकृत सूचक (TMP) अपसंदर्भन रहे हैं। आप या तो इसे के लिए स्मृति को आबंटित करना चाहिए या बस छोड़ इसे उपयोग है (मैं वास्तव में समझ नहीं क्यों आप एक अस्थायी नोड ** यहाँ की जरूरत है।)

15/04/2011 को 17:28
का स्रोत उपयोगकर्ता

वोट
0

यहां पर कुछ आलोचनाओं हैं:
जब से तुम केवल एक नोड के लिए खोज रहे हैं, आप संकेत करने वाली संकेत की जरूरत नहीं है। केवल समय आप संकेत की ओर इशारा की जरूरत है जब आप वास्तव में पैरामीटर संशोधित करने की आवश्यकता है। साथ ही, आपको सी ++ का उपयोग कर रहे हैं, बजाय एक पीपी गुजर, आप एक संदर्भ पारित करना चाहिए: नोड * & पेड़। ताकि आप, यह भिन्नता के बिना पेड़ चर के साथ काम कर सकते हैं के बाद से संकलक आप के लिए इस बात का ध्यान रखना होगा यह बात बना देता है।

अपने अगर बयान में, आप की जाँच नहीं कर रहे हैं, तो आपके बाईं या दाईं ओर संकेत अशक्त संकेत दिए गए हैं। मुझे यकीन है कि अगर आप इस के लिए प्रहरी नोड्स नहीं हूँ, लेकिन मैं तुम नहीं मानते हुए हूँ। इसी के साथ, मैं इस के लिए अपने विधि बदल जाएगा:

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

हाँ। दरअसल के रूप में एरिक पहले से ही तैनात आप लिखना चाहिए

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

के बजाय

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

क्योंकि अगर itemएक पेड़ में पहले से ही नहीं है अपने कोड निश्चित रूप से जब भिन्नता शून्य सूचक की कोशिश कर रहा SEGFAULT को बढ़ावा मिलेगा।

बिल्कुल अनावश्यक प्रत्यावर्तन - वहाँ भी एक और (इतना स्पष्ट नहीं) समस्या है। आप सावधान संतुलन नहीं कर रहे हैं जब डालने या आसानी से अतिप्रवाह ढेर को जन्म दे सकती है कि ज्यादातर रैखिक प्रत्यावर्तन गहराई पर पेड़ नोड्स आप सबसे अधिक रैखिक पेड़ ऊंचाई पर होगा हटाने और इस तरह। तो अगर आप को बदलने चाहिए 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