3

当我调用该函数时,底部的两行代码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++;
    }
4

1 回答 1

3

你的else条款被打破了。如果prev为 null,则您尝试在第一个元素之前插入。

else {
  cell *oldHead = head;
  head = newOne;
  head->next = oldHead;
  logSize++;
}

设定tail->next = NULL是核心错误。

于 2013-01-14T22:17:03.970 回答