当我多次拨打extractMin()
时,此代码崩溃了。我认为这应该是显而易见的
你们中的一些问题在于函数,因为我是指针新手,可能是一个明显的错误。因此,除了函数应该使用<
运算符检索字典最小值,然后从链表中删除该值之外,您应该知道它是链接列表而不进行详细说明就足够了。
string LinkedListPQueue::extractMin() {
if (this->isEmpty()) throw ErrorException("Empty queue.");
string front = LEX_HIGH;
cell *old;
for (int i = 0; i < this->size(); i++) {
if (this->head->value < front) {
front = this->head->value;
old = this->head;
}
old = this->head;
this->head = this->head->next;
}
logSize--;
delete old;
return front;
}
void LinkedListPQueue::enqueue(const string& elem) {
cell *newCell = new cell;
newCell->value = elem;
newCell->next = NULL;
if(this->isEmpty()) {
this->head = this->tail = newCell;
logSize++;
} else {
recurSort(newCell);
this->tail->next = newCell;
this->tail = newCell;
logSize++;
}
}
答案 0 :(得分:1)
您的head
被修改但在运行后从未重置
您应该只使用iterators
或只是添加一个以head
开头的指针并移动此指针而不是“破坏”列表的head
答案 1 :(得分:1)
您正在修改extractMin()
中的头部成员,这会使列表中断。
答案 2 :(得分:1)
问题在于这个循环:
for (int i = 0; i < this->size(); i++) {
if (this->head->value < front) {
front = this->head->value;
old = this->head;
}
old = this->head;
this->head = this->head->next;
}
对我来说似乎过时了,但它也会导致内存泄漏,导致列表在执行后只有一个元素。
对我来说这两行:
old = this->head;
this->head = this->head->next;
不应该在循环中。函数逻辑应该有点复杂 - 你找到一个指向最小元素的指针,然后你用头交换它的值,然后你移除头。