c语言链表问题求解~当对表里最后一个结点删除的时候会出错

2024-12-16 16:54:10
推荐回答(3个)
回答1:

问题出现在这个循环里
while(p->next!=NULL)
{
while(p->next->data==e)
{
q=p->next;
p->next=q->next;
free(q);
count++;
}
p=p->next;
}
你的链表是有头结点的链表,假设表中只有头结点和一个节点X,这个节点等于e,现在来一步步分析:
首先,没进入循环之前,p->next就是那个节点X,不等于NULL,到循环内层
由于X节点等于e,所以 while(p->next->data==e) 成立,进入内层循环
在内层循环中把p->next删除,然后p->next就会等于NULL
然后跳出内层循环,执行 p=p->next;,之后p=NULL
这时再回去判断p->next!=NULL,就会引起内存错误~!

回答2:

  while(p->next!=NULL)
   {
   while(p->next->data==e)
   {
   q=p->next;
   p->next=q->next; <-----------如果最后一个结点数据为e,此时p->next为NULL
   free(q);
   count++;
   }
   p=p->next;
   }

第六行代码有问题。
假如要删除的结点是最后一个结点,代码执行到此段代码的第5行时,q以及p->next都指向最后一个节点,那么q->next的值为NULL,赋给了p-next(第六行代码),直到跳出此次内循环,再去判断循环条件会访问p->next->data的值,p->next已经是NULL了,再去访问p->next->data就会出错。

解决办法:其实用不到嵌套循环,把内部循环while改为条件判断if就可以了。

回答3:

从第5行(即p=L;处)开始可改为:
q=L;
p=L->next;
if(L->next==NULL)
{
printf("\n空表\n");
return 0;
}
while(p!=NULL)
{
if(p->data==e)
{
q->next=p->next;
p=p->next;
free(p);
count++;
}
else
{
q=p;
p=p->next;

}

}