我们的教练已经显示有这个进程链表功能的几个例子(显示所有项目,删除在,插入头部,插入为尾..)C++链表遍历
现在,我注意到这些例子他正在使用不同的遍历方法。 在某些情况下,他会用
while(head !=0)
{
head=head->link;
}
在他使用从一个节点移动到其他节点的实例。
while(head->link !=0)
{
head=head->link;
}
这让我感到困惑。是否有理由在某些操作上使用某个操作?
我们的教练已经显示有这个进程链表功能的几个例子(显示所有项目,删除在,插入头部,插入为尾..)C++链表遍历
现在,我注意到这些例子他正在使用不同的遍历方法。 在某些情况下,他会用
while(head !=0)
{
head=head->link;
}
在他使用从一个节点移动到其他节点的实例。
while(head->link !=0)
{
head=head->link;
}
这让我感到困惑。是否有理由在某些操作上使用某个操作?
的第二变型将导致段错误如果head
最初NULL
。
除此之外,第一个变体将迭代N
次(其中N
是列表中的项目数)。第二个变体只会迭代N-1
次。
第一个变体在遍历后会使“head”指向一个“null”值。第二个变体假定头必须指向一个好的(非NULL)头值,并且头将指向一个空值为link
的元素。因此,第二个变体对于查找列表的最后一个元素很有用,而第一个变体对于计算列表中项目的数量很有用。
在第一种情况下,他是覆盖在名单可能是初始为空的情况下(头=无)。您通常会在循环内部执行任何处理,然后再执行
head = head->link
行。
在第二种情况下,想必他知道名单是不是最初是空的。在这种情况下,你通常会做任何处理的
head = head->link
线之后,虽然你可以,如果有一个理由,之前也做了一些。当然,它也有可能,这不是一个明智的决定,因为教授也是人;-)
第二个例子其实有两个问题。始终使用第一个。
第一个问题是如奥利查尔斯沃思说,因为它会造成一个空指针(段错误)如果环路与头部是NULL输入。
的第二个问题是,不会在链表中的最后一个节点上出现循环顶部和head=head->link;
声明之间的任何代码。所以如果这个更新语句在循环结尾(这是通常的做法),那么最后一个节点将被完全绕过。所以,如果你的代码是这样的:
while(head->link !=0)
{
dostufftoNode(head);
head=head->link;
}
然后dostufftoNode()函数将被要求除最后一个每一个节点。
while(head !=0)
{
head=head->link;
}
这将
这将遍历一个全氮次
while(head->link !=0)
{
head=head->link;
}
这将
这将遍历总数为n-1次
谢谢你的回应。现在它更有意义。 – user1290709 2012-04-03 20:27:29
如果您对回复感到满意,请将最佳答案标记为答案 – 2012-04-06 04:46:56