[英]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.