我正在开发一个在堆栈上执行基本推送和弹出的程序。我已经完成了GDB中的程序,一切正常,直到程序在freeTheMemory函数中遇到第五行。每次程序到达那里,它都会给我一个核心转储:
#include<iostream>
using namespace std;
class linkedList{
public:
int content;
linkedList* pointerToBelow;
};
void freeTheMemory(linkedList *above){
if(above!=nullptr){
linkedList* temp;
temp=above;
above=above->pointerToBelow;
delete temp;
freeTheMemory(above);
}
}
void push(linkedList* above, linkedList* below, int x){
below->content=x;
above->pointerToBelow=below;
below=above;
above=new linkedList;
return;
}
void pop(linkedList* above, linkedList* below){
linkedList* temp;
temp=above;
above=below;
below=below->pointerToBelow;
delete temp;
return;
}
void printList(linkedList *above){
linkedList* temp;
temp=above;
above=above->pointerToBelow;
while(above!=nullptr){
cout<<above->content<<" ";
above=above->pointerToBelow;
}
above=temp;
}
int main(){
linkedList *above, *below;
int x;
above=new linkedList;
below=new linkedList;
below->pointerToBelow=nullptr;
cout<<"Enter the elements of your list: ";
while(x!=-9){
cin>>x;
if(x!=-9){
if(x>0){
push(above, below, x);
}
else{
pop(above, below);
}
}
}
printList(above);
freeTheMemory(above);
return 0;
}
如果我在哪里获得核心转储,我的代码中的问题是什么?如果是这样,有没有人知道这里出了什么问题?感谢
答案 0 :(得分:2)
您的解决方案存在逻辑缺陷。它实际上并不保留堆栈中的所有元素,因为您正在创建节点并将其指针分配给局部变量,因此不会逐字地添加到链接列表中。此外,您的代码不必要地复杂,部分原因是使用了两个指针。因此你很难调试。由于您使用链表实现堆栈,我认为只有一个指针就足够了。
下面我修改了你的解决方案。我保留一个名为top
的指针,它是一个指向堆栈顶部的虚拟节点。它的pointerToBelow
指向堆栈的真正顶部元素。
在push
执行以下操作:
content
设置为x
。 pointerToBelow
设置为堆栈的上一个顶部元素pointerToBelow
top
指向此新节点。 在pop
执行以下操作:
pointerToBelow
的{{1}}指向堆栈顶部元素下方的元素。 在top
,您不一定需要递归。但那没关系。
pointerToBelow