队列类的取消排队方法"Aborted (core dumped)"错误
"Aborted (core dumped)" error in dequeue method of queue class
这个队列类的脱口字方法无法正常工作,我不确定为什么。当我运行它时,它说" *错误中的错误":d double free或Droblastion(fasttop):0x0000000000018DFE50 * > ",然后进行回溯,然后"中止(core dustped)"。
首先,我直接删除底部节点,但我认为这可能是问题,所以我切换了以另一种方式删除它们。
这是Dequeue方法:
int Queue::dequeue() {
if (isEmpty()) {
cout << "ERROR: Can't dequeue from empty Queue"<< endl;
return -1;
} else {
Node* n = top;
if (n == NULL){
bottom = top;
return 0;
}
if (n->next == NULL){
delete n;
bottom = top;
return 0;
}
while(n->next->next != NULL){
n = n->next;
}
bottom = n;
n = n->next;
delete n;
return 0;
}
}
这是整个文件:
#include <iostream>
using namespace std;
struct Node {
int data;
Node *next;
};
class Queue {
public:
Queue(); //constructor
~Queue(); //destructor
void enqueue(int d); //enqueues node onto top of Queue
int dequeue(); //dequeues bottom node off of Queue -- returns integer dequeued
bool isEmpty(); //checks if Queue is empty
void print(); //print contents of Queue from top to bottom
private:
Node* top; //points to top node in Queue
Node* bottom; //points to bottom node in Queue
};
Queue::Queue() {
top = NULL;
bottom = NULL;
}
Queue::~Queue() {
while (!isEmpty())
dequeue();
}
void Queue::enqueue(int d) {
Node* temp = new Node;
temp->data = d;
temp->next = top;
top = temp;
if (temp->next == NULL){
delete bottom;
bottom = temp;
}
}
int Queue::dequeue() {
if (isEmpty()) {
cout << "ERROR: Can't dequeue from empty Queue"<< endl;
return -1; //error
} else {
Node* n = top;
if (n == NULL){
bottom = top;
return 0;
}
if (n->next == NULL){
delete n;
bottom = top;
return 0;
}
while(n->next->next != NULL){
n = n->next;
}
bottom = n;
n = n->next;
delete n;
return 0;
}
}
bool Queue::isEmpty() {
return (top==NULL);
}
//Print Queue from top to bottom
void Queue::print(){
Node* n = top;
while(n != NULL){
cout << n->data << endl;
n = n->next;
}
cout << endl;
}
int main(){
Queue* s = new Queue();
s->print();
s->enqueue(20);
s->enqueue(30);
s->print();
s->enqueue(40);
s->enqueue(12);
s->print();
s->dequeue();
s->print();
s->dequeue();
s->print();
s->dequeue();
delete s;
return 0;
}
每当删除节点时,都需要更新所有指向删除节点的指示。您需要在两个地方进行此操作。
首先,在n->next == NULL
情况下,Queue
只有一个节点。调用delete n
后,top
仍指向现在已删除的节点,并且您需要在更改bottom
的值之前更新top
(null或nullptr
)。
在列表中有多个节点的最后一个情况下,您删除了最后一个节点,但是上一个节点的next
指针仍指向它。在n = n->next
表达式之后,您需要设置bottom->next
以指向n->next
现在指向的节点(因为n
是Queue
中的最后一个节点,为null)。
相关文章:
- 示例外壳应用程序显示的 V8 "segmentation fault (core dumped)"错误
- 为什么此代码中显示"*** stack smashing detected ***: <unknown> terminated Aborted (core dumped) "错误?
- 如何修复访问动态数组中结构中的字符串变量时"segmentation fault (core dumped)"错误
- 创建一个简单的类及其变量和函数不断返回" segmentation fault (core dumped)"、C++
- C++ 在类中删除动态 2D 数组时不断"Aborted (core dumped)"
- 尝试读取包含 ints 并存储在 int vector 中的文件,但我不断收到错误"Segmentation fault (core dumped)"
- (C++)在按位 OR 操作时获取错误"Illegal instruction (core dumped)"
- 队列类的取消排队方法"Aborted (core dumped)"错误
- 无法读取 Ubuntu "Segmentation fault (core dumped)"中的.dat或.bin文件
- C++ 链接列表队列实现和析构函数错误:"Aborted (Core Dumped)"
- qt app.exec() segmentation fault core dumped
- llvm pass segmentation fault:(Core dumped)
- 从构造函数引发异常-Core Dumped
- 为什么最后一行的运行结果是"Segmentation fault (core dumped)"
- 为什么 C++ 程序运行结果为 "Segmentation fault (core dumped)"
- 间歇性"Aborted Core Dumped" .也许是static_cast错?
- Segmentation Fault (core dumped) C++
- 动态初始化字符的 2D 数组时"Segmentation Fault [Core Dumped]"
- 运算符后"core dumped"错误 reinterpret_cast<const uint8_t*>
- 购物清单程序:在 VIM "Segmentation fault (core dumped)" 中,但代码块工作