while循环中的if else语句.(我试着在链表的给定位置插入一个节点)


void insertM(struct node **s,int pos,int n)
   {    
   struct node *temp,*e;
   temp=(struct node *)malloc(sizeof(struct node));
   temp->x=n;
   temp->link=NULL;
   int count=1;
   e=*s;
   while(e!=NULL)
   {
       if(count==pos)
       {
           temp->link=e->link;
           e->link=temp;
       }          
       else
       {
           e=e->link;
           count++;
       }
   }
}

如果我删除上面的else语句,并将其内容放在If语句之后的while循环中,程序就可以工作了。但是用else语句就行不通了。为什么?else语句有什么问题?

问题是当count==pos得到true时,你有一个无限循环,因为你不再改变ecount了。换句话说,执行将不断地采用if语句的真实路径,并永远继续下去。

您应该添加一个break语句,如:

   if(count==pos)
   {
       temp->link=e->link;
       e->link=temp;
       break;  // Break out of the while-loop as we are done
   }          

你的代码没有else部分的原因是counte在每个循环中都被更改了。因此,你迟早会到达列表的末尾,循环终止。

但是,为了性能考虑,最好使用break语句。

还需要注意的是,当调用pos = 1时,您的代码有一个bug。您需要将其作为特殊情况处理并更新*s

else语句导致错误的原因是当您最终找到目标时,count没有增加。因此,count将始终等于pos,循环永远不会中断。为了更好地可视化这个错误,想象一下尝试在while循环开始的第一个节点

处添加一个节点
e is not null so loop body is executed
count == pos evaluates to true so temp is inserted after e
else statement gets skipped so count stays at 1 and e stays at the first node
e is not null so loop body is executed
count == pos evaluates to true so temp is inserted after e

正如你所看到的,你不断地在前面无限次地添加temp,因为当你找到目标节点时,count永远不会改变。为了将来更好地理解这些错误,请使用调试器。

相关内容

  • 没有找到相关文章

最新更新