#include<iostream>
#include<vector>
#include<stdexcept>
using namespace std;
typedef struct node* treePointer;
typedef struct node{
int data;
treePointer leftChild, rightChild;
};
class stack{
private:
int top;
public:
vector<treePointer> st;
stack() : top(-1)
{
}
void push(treePointer ptr){
st.push_back(ptr);
top++;
}
treePointer pop(){
if(st.empty())
throw out_of_range("Stack<>::pop(): empty stack");
treePointer temp = st.back();
top--;
st.pop_back();
return temp;
}
};
void iterInorder(treePointer ptr)
{
stack st;
for( ; ;) {
for( ; ptr ; ptr = ptr->leftChild)
st.push(ptr);
ptr = st.pop();
if(!ptr) break;
cout << ptr->data;
ptr = ptr->rightChild;
}
}
int main()
{
node a1, a2, a3, a4, a5, a6, a7;
treePointer ptr;
a1.data = 1, a2.data = 2, a3.data = 3, a4.data = 4, a5.data = 5;
a6.data = 6, a7.data = 7;
a1.leftChild = &a2; a1.rightChild = &a7;
a2.leftChild = &a3; a2.rightChild = &a6;
a3.rightChild = &a4;
a4.leftChild = &a5;
iterInorder(&a1);
}
我已经通过迭代进行树遍历遍历。 但是当我打电话给iterInorder(&amp; a1)时,会出现分段错误! 在主要功能中,&#34; cout&lt;&lt; a1.data&#34;印得很好。 但是在iterInorder函数中,&#34; cout&lt;&lt; ptr-&GT;数据&#34;导致分段错误! 请帮我!我不知道为什么会发生这种情况
答案 0 :(得分:1)
即使没有std::cout << ptr->data
,我对Coliru也有段错误。所以你的问题来自其他部分。但是当我评论所有iterInorder
函数时,不再有错误。因此,您在iterInorder
内的通话中遇到了段错误。
当只执行以下代码时,我遇到了段错误。
for( ; ptr ; ptr = ptr->leftChild)
{
st.push(ptr);
}
如果我打印所有内存地址怎么办,所以我知道哪一个会失败。
所以在main
中,它给出了:
std::cout << "&a1 == " << &a1 << std::endl;
std::cout << "&a2 == " << &a2 << std::endl;
std::cout << "&a3 == " << &a3 << std::endl;
std::cout << "&a4 == " << &a4 << std::endl << std::endl;
在iterInorder
:
for( ; ptr ; ptr = ptr->leftChild)
{
std::cout << "ptr == " << ptr << std::endl;
st.push(ptr);
}
在随机执行时,它给出了这个:
&a1 == 0x7ffe4ac6b750
&a2 == 0x7ffe4ac6b730
&a3 == 0x7ffe4ac6b710
&a4 == 0x7ffe4ac6b6f0
ptr == 0x7ffe4ac6b750
ptr == 0x7ffe4ac6b730
ptr == 0x7ffe4ac6b710
ptr == 0x10000ffff
bash: line 7: 5531 Segmentation fault (core dumped) ./a.out
因此,我发现a3
存在问题,a3->leftChild
未提供与其他已知地址的对应关系。所以让我们来看看它的定义。
a3.rightChild = &a4;
当然,a3
没有为左孩子做初始化。所以我们进入一个随机地址,它会导致段错误。 CQFD。
亲爱的juhong,我通过这篇文章向你展示(或者至少试图向你展示)的是调试艺术。到目前为止,有很多非常好用的软件可以帮助我们这样做。所以去教自己如何使用它们,这将节省你的时间,这么多时间。
顺便说一下,using namespace std;
是一种不好的做法。正如Pierre Antoine Guillaume
所述,如果它在头文件中使用,它将在源文件中使用,并可能导致名称冲突。