我到目前为止粘贴了我的作品: http://codepad.org/WhJuujRm
链接列表的概念让我大开眼界,所以我想我会练习。我知道如何添加节点和编辑节点,但我不知道如何在我的特定场景中删除节点。
我的伪代码:
previous == now - 1;
if(stdid == now->getID());
previous->setNext(now->getNext);
delete now;
return;
我怎么能实现这个?
答案 0 :(得分:1)
这应该有用,但我没有测试过。
删除第一个节点时有一种特殊情况。第一次迭代时previous
设置为NULL
,在这种情况下必须调整top
。
我没有使用bottom
,因为这不是我的方式。如果您使用bottom
,则在删除最后一位学生时会有第二种特殊情况。我会将next
指针设置为NULL
来标记列表的末尾,因为这样可以消除这种特殊情况。
bool deleteStudent(int id)
{
student* now = top;
student* prev = NULL;
while(now != NULL) {
student* next = now->getNext();
if(id == now->getID()) {
delete now;
if(prev) prev->setNext(next);
else top = next;
return true;
}
prev = now;
now = next;
}
return false;
}
答案 1 :(得分:1)
从链表中删除元素时的思维方式是更新首先将元素带到元素的指针。在您的列表案例中,可能是top
(和/或可能bottom
),它可能是某个节点的next
。当您使用cur
指针遍历列表搜索时,请保留一个prev
指针,在您枚举时向前推进一步。假设你找到了受害者节点(如果你没有,那就什么都不做,那就去!),prev
将处于以下两种状态之一:
top
是指向受害节点的指针,top
必须更新,或者...... next
成员需要更新以反映受害者节点的next
成员值。< / LI>
在两个案例bottom
中也可能需要更新。在第一种情况下,如果列表只有一个节点并且您要删除它,则需要更改bottom
。即完成后你将有一个空列表。很容易分辨,因为top
在分离cur
并将top
设置为cur->next
之后将为NULL。对您来说更容易,因为您在列表容器中保留了一个大小成员;如果是1
,则您知道head
和bottom
在第二种情况下, last 节点可能是受害节点。在这种情况下,bottom
必须更新以反映列表的新结尾(恰好在prev
中,如果列表只有一个,则可能是NULL
如何判断受害者是否是列表中的最后一个节点?如果next
成员为NULL,则必须是最后一个节点,bottom
必须待更新。
这样的东西,一个基于ID搜索的删除功能
void deleteStudent(int id)
{
student *cur = top, *prev = nullptr;
while (cur && cur->getID() != id)
{
prev = cur;
cur = cur->getNext();
}
// found a node?
if (cur)
{
student *pNext = cur->getNext();
// set new next pointer for prev, or new top
if (prev)
prev->setNext(pNext);
else
top = pNext;
// update bottom if needed
if (!pNext)
bottom = prev;
delete cur;
--scnt;
}
}
我留给您的其他删除选项和条件。
祝你好运。
答案 2 :(得分:0)
我没有使用你的符号,但我认为你可以明白这一点。
prev = NULL;
current = top;
while (current != NULL && !isfound(current)){
prev = current;
current = current->next;
}
// current point to the element you want to delete (if not NULL)
if(current != NULL) {
if(previous != NULL) {
previous->next = current->next;
}
else {
top = current->next;
}
delete current;
}