我必须写一些代码来处理链表。我对所要询问的内容有些困惑。我正在使用deleteFront函数,该函数当然会删除前端节点。有3种情况需要注意:1)列表已经为空2)列表有1个节点,3)其他。我对方案2的处理感到困惑。这些指令说:“通过OldNum(通过引用传递)返回前节点元素,删除前节点并更新计数。这就是我所有的全部3种情况,有人可以帮助我理解每一行代码吗:
void llist::deleteFront(el_t& OldNum) {
if (isEmpty()) {
throw underflow()
}
else if (Count == 1) {
OldNum = Front->Elem;
Node *Second;
delete Front;
Count--;
}
else {
OldNum = Front->Elem;
Node *Second;
Second = Front->Next;
delete Front;
Front = Second;
Count--;
}
}
void llist::deleteFront(el_t& OldNum) {
if (isEmpty()) {
throw underflow()
}
如果列表为空,我们将抛出一个异常(它将通知开发人员,调用代码在已经为空的列表上错误地调用了deleteFront()
;]]
else if (Count == 1) {
如果有一个节点,我们将执行以下操作:
OldNum = Front->Elem;
我们将一个元素从刚删除的节点返回给调用者,因为
Oldnum
参数是一个引用(&
),我们可以将该元素存储在该引用中,并且函数结束后,调用者可以访问它;
Node *Second;
我们为新节点声明了一个指针,但未使用它,因此该行实际上不执行任何操作(可以将其删除);
delete Front; Front = NULL; //missing!!
我们删除了唯一的现有
Front
节点,并释放了它所占用的内存(以及elem
字段和所有其他(如有));请注意,必须添加Front = NULL;
才能正确使现在指向空的Front
指针无效;
Count--; }
我们将
Count
减1
(至0
并完成。
else {
在最后一种情况下,如果存在多个节点:
OldNum = Front->Elem;
我们完全按照上述情况返回元素;
Node *Second; Second = Front->Next;
我们需要暂时“记住”名称为
Second
的下一个节点(它将是现在的第一个节点;]]delete Front;
现在我们删除
First
节点,释放其内存;Front = Second;
因为
Front
指针必须始终指向第一个节点,所以我们用Second
重新分配了它(这就是我们记住它的原因;]]Count--; }
我们将
Count
减1
并完成;我希望它能有所帮助:)