c ikili arama ağacında unsurunu aramanın segment hataya alma ++

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

Ben ağaçta özellikle eleman bulmaya Yukarıdaki programda, sadece dava 4 düzgün çalışmıyor. Ben ana programın üstünde bulunan arama elemanı üye işlev dahil ettik. Programa hata ayıklama zaman, özellikle durumda eğer arama eleman üyesi işlevinde segment hataya başlamıştı. Gerçekten bu sorunun çıkması için yapmanız gereken bilmiyorum. Herkes segmentasyon arıza arama eleman üyesi işlevi içinde neden oluyor öğrenmek için yardım edebilir. Bu programla ilgili herhangi bir sorunuz olursa bana bildirin.

Oluştur 15/04/2011 saat 17:23
kaynak kullanıcı
Diğer dillerde...                            


4 cevaplar

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

Olmalı

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

Eğer *treegerçekte ise boş ilk kontrol altında boş işaretçiyi kaldırma ediyoruz. Bunları etrafında takas sağlayacaktır *treene zaman check NULL değil (*tree)->datanedeniyle - Kısa Devre Değerlendirilmesi

Ayrıca, &(*tmp)tıpkı yazılmalıdırtmp

Cevap 15/04/2011 saat 17:28
kaynak kullanıcı

oy
0

Sen başlatılmamış işaretçi (tmp) dereferencing ediyoruz. Bunun için bellek ayrılamadı ya da sadece atlaması gereken ya kullanışındaki (burada geçici NODE'u ** ihtiyaç Gerçekten neden çözemiyorum.)

Cevap 15/04/2011 saat 17:28
kaynak kullanıcı

oy
0

İşte birkaç eleştiriler şunlardır:
Yalnızca bir düğüm arıyor olduğundan, işaretçileri-to-işaretçiler gerekmez. Aslında parametreyi değiştirmeniz gereken zaman işaretçiler işaretçileri gereken tek zamandır. Ayrıca, C ++ kullanılarak yerine s geçen olduğundan, bir referans geçmesi gerekir: düğüm * ve ağaç. Derleyici sizin için ilgilenir beri bunun KQUEUE kalmadan ağaç değişkeni ile çalışmak, böylece bu hale getirir.

Sol veya sağ işaretçiler boş noktalar şunlardır eğer varsa açıklamalarda için kontrol etmekte değildir. Ben bunun için sentinel lenf düğümlerinin varsa emin değilim, ama görüyorum ki yok farz ediyorum. Bunun üzerine, ben bu şekilde yöntemini değiştirmek olacaktır:

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
}
Cevap 15/04/2011 saat 17:40
kaynak kullanıcı

oy
0

Evet. Erik önceden gönderilmiş Nitekim olarak yazdığınız GEREKİR

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

yerine

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

Çünkü eğer itembir ağaç önceden bulunmadığından kodunuzu KESİNLİKLE KQUEUE NULL pointer çalışırken segfault yol açacaktır.

Kesinlikle gereksiz özyineleme - Başka (çok açık değil) Sorun da vardır. Insert veya kolayca taşması yığın yol açabilir çoğu doğrusal tekrarlama derinlikte böylece en doğrusal ağaç yükseklikte olacak ağaç düğümlerini kaldırmak ve ne zaman dikkatli dengeleme yapıyor değilseniz. Yani dönüştürmek gerekir searchElementfonksiyonu

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;
}
Cevap 15/04/2011 saat 20:37
kaynak kullanıcı

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