我总是对链接列表的想法感到困惑。所以我正在尝试实现一些功能来帮助我理解。
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。
答案 0 :(得分:1)
您忘记使用delete
释放已删除节点的内存,并且您没有注意列表恰好是一个元素长的情况。因为如果是这样的话,那么
q.first = q.first->next;
q.first
是NULL
。然后,您尝试在下一行中取消引用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.last
或q.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;
}