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
时,你有一个无限循环,因为你不再改变e
和count
了。换句话说,执行将不断地采用if语句的真实路径,并永远继续下去。
您应该添加一个break
语句,如:
if(count==pos)
{
temp->link=e->link;
e->link=temp;
break; // Break out of the while-loop as we are done
}
你的代码没有else部分的原因是count
和e
在每个循环中都被更改了。因此,你迟早会到达列表的末尾,循环终止。
但是,为了性能考虑,最好使用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
永远不会改变。为了将来更好地理解这些错误,请使用调试器。