簡體   English   中英

在查找錯誤時需要幫助(與指向堆棧上變量的指針有關)

[英]Need help in finding the bug (related to pointers to variable on stack)

有人可以告訴我程序中有什么問題嗎? 基本上,這是一個在二進制搜索樹中插入新節點的程序。

事實是我的插入功能正常工作,並且正在插入節點,這是我在主程序中通過行驗證的

     cout<<a.left->right->right->data;

輸出正確,即5

但是,當我嘗試打印二進制樹的級別順序遍歷時,某些垃圾值已被傳遞來代替新節點,並且程序崩潰了

可以請一個人看看並向我解釋我做錯了什么,以及如何在主程序中顯示正確的值。

#include<iostream>
#include<string>
#include<conio.h>
#include<array>
#include<stack>
#include<sstream>
#include<algorithm>
#include<vector>
#include<ctype.h>//isdigit
#include<deque>
#include<queue>
#include<map>
using namespace::std;
struct BST
{
    int data;
    BST *left;
    BST *right;
    BST(int d,struct BST* l,BST *r):data(d) , left(l) ,right(r)
    {
    }
};

void levelOrder(struct BST *root)
{
    struct BST *temp=NULL;
    int count =0;
    deque<struct BST*> dq;
    if(!root)
    {
        return;
    }
    dq.push_back(root);
    count=dq.size();
    while(!dq.empty())
    {
        temp=dq.front();
        cout<<temp->data<<" ";
        if(temp->left)
        {
            dq.push_back(temp->left);
        }
        if(temp->right)
        {
            dq.push_back(temp->right);
        }
        dq.pop_front();
        if(--count==0)
        {
            cout<<endl;
            count=dq.size();
        }
    }
}
void Insert(struct BST*root,int data)
{
    struct BST temp(data,NULL,NULL);
    if(!root)
    {
        return;
    }
    while(root)
    {
        if((root)->data >data)
        {
            (root)=(root)->left;
            if(!(root)->left)
            {
                (root)->left=&temp;
                break;
            }
        }
        else
        {
            (root)=(root)->right;
            if(!(root)->right)
            {
                (root)->right=&temp;
                break;
            }
        }
    }
}
int main()
{
    deque<struct BST> dq1,dq2;
    BST e(4,NULL,NULL);
    BST f(3,NULL,NULL);
    BST d(1,&f,NULL);
    //BST g(4,NULL,NULL);
    BST b(2,&d,&e);
    BST c(8,NULL,NULL);
    BST a(6,&b,&c);
    levelOrder(&a);
    Insert(&a,5);
    cout<<a.left->right->right->data;
    cout<<endl;
    levelOrder(&a);
    _getch();
    return 0;
}

原因是因為您要在Insert函數的樹中放入指向局部變量的指針。

當函數返回時,其所有局部變量不再“活動”,並且訪問這些局部變量之一的指針是未定義的行為 實際上,無論您調用哪個函數,這些變量一旦被占用的內存都可能被下一個函數調用覆蓋。

如果要添加新節點,則需要使用例如new在堆上分配它。 但是,由於樹的設計,這將導致內存泄漏,因為您沒有釋放任何子節點。 實際上,當您在main函數中使用指向局部變量的指針時(沒關系,因為這些變量的生命周期是在main的整個程序中),您不能簡單地delete Willy-nilly指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM