2012-04-03 94 views
1

我们的教练已经显示有这个进程链表功能的几个例子(显示所有项目,删除在,插入头部,插入为尾..)C++链表遍历

现在,我注意到这些例子他正在使用不同的遍历方法。 在某些情况下,他会用

while(head !=0) 
{ 
    head=head->link; 
} 

在他使用从一个节点移动到其他节点的实例。

while(head->link !=0) 
{ 
    head=head->link; 
} 

这让我感到困惑。是否有理由在某些操作上使用某个操作?

回答

1

的第二变型将导致段错误如果head最初NULL

除此之外,第一个变体将迭代N次(其中N是列表中的项目数)。第二个变体只会迭代N-1次。

1

第一个变体在遍历后会使“head”指向一个“null”值。第二个变体假定头必须指向一个好的(非NULL)头值,并且头将指向一个空值为link的元素。因此,第二个变体对于查找列表的最后一个元素很有用,而第一个变体对于计算列表中项目的数量很有用。

0

在第一种情况下,他是覆盖在名单可能是初始为空的情况下(头=无)。您通常会在循环内部执行任何处理,然后再执行

head = head->link 

行。

在第二种情况下,想必他知道名单是不是最初是空的。在这种情况下,你通常会做任何处理的

head = head->link 

线之后,虽然你可以,如果有一个理由,之前也做了一些。当然,它也有可能,这不是一个明智的决定,因为教授也是人;-)

0

第二个例子其实有两个问题。始终使用第一个。

第一个问题是如奥利查尔斯沃思说,因为它会造成一个空指针(段错误)如果环路与头部是NULL输入。

的第二个问题是,不会在链表中的最后一个节点上出现循环顶部和head=head->link;声明之间的任何代码。所以如果这个更新语句在循环结尾(这是通常的做法),那么最后一个节点将被完全绕过。所以,如果你的代码是这样的:

while(head->link !=0) 
{ 
    dostufftoNode(head); 
    head=head->link; 
} 

然后dostufftoNode()函数将被要求除最后一个每一个节点。

0
while(head !=0) 
{ 
    head=head->link; 
} 

这将

  1. 检查,如果头部不为空
  2. 组头头戴式>链接
  3. 去一个

这将遍历一个全氮次

while(head->link !=0) 
{ 
    head=head->link; 
} 

这将

  1. 检查,如果头戴式>链接不为空
  2. 组头头戴式>链接
  3. 去一个

这将遍历总数为n-1次

+0

谢谢你的回应。现在它更有意义。 – user1290709 2012-04-03 20:27:29

+0

如果您对回复感到满意,请将最佳答案标记为答案 – 2012-04-06 04:46:56