当我调用tail = head;
tail->next= NULL;
函数时,底部extractMin()
的两行代码会导致程序崩溃。如果我发表评论,一切都按照假设发生。这是否正在发生,因为它们指向已释放的内存中的地址?
编译器给我的唯一线索是:EXC_BAD_ACCESS (code=2, address=0x0)
。我立即注意到地址是0x0所以那里有一个问题,但究竟是什么?
string LinkedListPQueue::extractMin() {
if (isEmpty())
error("Tried to dequeue from epmpty queue!");
cell *toBeDeleted = head; //pointer to this head
string value = head->value; //get value of this head
head = head->next; //move so this head is not the same as the one to be deleted
delete toBeDeleted; //delete previous head.
return value;
}
/* Implementation notes: enqueue
* -----------------------------
* We have to search to find the proper position, which can be a bit tricky with
* a singly-linked list. We walk two parallel pointers, one a step behind the other,
* until we find the correct position to insert the new cell, which we then splice
* into place. Note the special case of inserting at the head. Alternatively, this
* operation could work recursively.
*/
void LinkedListPQueue::enqueue(const string& elem) {
cell *cur, *prev, *newOne = new cell;
newOne->value = elem;
for (prev = NULL, cur = head; cur != NULL; prev=cur, cur = cur->next) {
if (elem > cur->value) break;
}
newOne->next = cur;
if (prev) {
prev->next = newOne;
logSize++;
} else {
head = newOne;
tail = head;
tail->next= NULL;
logSize++;
}
答案 0 :(得分:3)
您的else
条款已损坏。如果prev
为null,那么您尝试在第一个元素之前插入。
else {
cell *oldHead = head;
head = newOne;
head->next = oldHead;
logSize++;
}
设置tail->next = NULL
是核心错误。