链接列表中的pop()函数实现(C ++)

时间:2014-02-27 18:01:37

标签: c++ linked-list pop c++98

我总是对链接列表的想法感到困惑。所以我正在尝试实现一些功能来帮助我理解。

struct Node {
  string val;
  Node* next;
  Node* prev;
};

struct Stew {
  Node* first;
  Node* last;
};

所以在这里,Stew有前面元素和最后一个元素的特殊指针。

我正在尝试删除第一个元素(pop)。

所以我尝试了如下,我似乎无法找到它中的错误:

void pop (Stew& q) {
  assert (!isEmpty(q));
  q.first = q.first->next;
  q.first -> prev = NULL;
}

任何帮助将不胜感激,谢谢!

顺便说一下,我目前正在使用C ++ 98,而不是C ++ 11。

2 个答案:

答案 0 :(得分:1)

您忘记使用delete释放已删除节点的内存,并且您没有注意列表恰好是一个元素长的情况。因为如果是这样的话,那么

之后
q.first = q.first->next;

q.firstNULL。然后,您尝试在下一行中取消引用q.first

q.first -> prev = NULL;

如果列表是原始的一个元素长并且之后为空,则不要执行该步骤。而是处理不再指向已分配内存的q.last

q.first = q.first->next;
if(q.first)
    q.first->prev = NULL;
else
    q.last = NULL;

(虽然取决于链接列表其余部分的实现,但是不需要else块,因为列表为空的信息完全包含在q.lastq.first

pop通常还会返回已删除的值。您的pop不会这样做。

答案 1 :(得分:0)

我刚刚意识到您已经为last课程实施了Stew pontier,因此您可以:

struct Node {
  string val;
  Node* next;
  Node* prev;
};

struct Stew {
  Node* first;
  Node* last;
};


typedef struct Node node_t;
typedef struct Stew stew_t;

node_t* pop(stew_t& q)
{
    node_t* last = q->last;
    if (q->last == q->first)        // List is empty or has only one element.
    {
        q->first = NULL;
        q->last = NULL;
    }
    else
    {
         q->last = last->prev;     // Update the last pointer.
    }

    return last;
}