问题出现在这个循环里
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,就会引起内存错误~!
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就可以了。
从第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;
}
}