C语言链表的问题

#include<stdio.h>#include<malloc.h>typedefintElemType;typedefstructNodeType{ElemTyped... #include<stdio.h>
#include<malloc.h>
typedef int ElemType;
typedef struct NodeType
{
ElemType data;
struct NodeType *next;
} NodeType,*LinkType;

LinkType create()
{//建立链表,返回链表的首地址,头结点没有数据
LinkType head,p1,p2;
head=(LinkType)malloc(sizeof(NodeType));
p1=head;

while(p1->data!=0)//当data=0时链表结束
{
p2=p1;
p1=(LinkType)malloc(sizeof(NodeType));
printf("Enter student's information:\ndata=");
scanf("%d",&p1->data);
p2->next=p1;
}

p2->next=NULL;
free(p1);
return(head);
}

void output(LinkType head)
{//链表的输出,接收链表的首地址
head=head->next;

while(head!=NULL)
{
printf("data=%d\n",head->data);
head=head->next;
}
}

LinkType sort(LinkType head)
{//链表排序,接收链表首地址,返回链表首地址
LinkType ph,p1;
ElemType temp;
ph=head->next;
p1=head->next;

while(p1->next!=NULL)//冒泡法
{
ph=head;
while(ph->next!=NULL)
{
if(ph->data>ph->next->data)//按data由小到大排序
{
temp=ph->data;
ph->data=ph->next->data;
ph->next->data=temp;
}
ph=ph->next;
}
p1=p1->next;
}

return(head);
}

LinkType del(LinkType head)
{//删除结点,接收链表的首地址,返回链表的首地址
ElemType DelData;
LinkType ph,p;
ph=head->next;
printf("Enter the data you want to del:\nDelData=");
scanf("%d",&DelData);

while(ph->data!=DelData && ph!=NULL)//寻找要删除的结点
{
p=ph;
ph=ph->next;
}

if(ph==NULL)//没有找到要删除的结点
{
printf("Enter error!\n");
}
else
{
if(ph==head->next)//删除头结点
{
head->next=ph->next;
}
else//删除其它结点
{
p->next=ph->next;
}
}
free(ph);

return(head);

}

void main()
{
LinkType head;
head=create();
output(head);
printf("\n\n");

head=sort(head);
output(head);
printf("\n\n");

head=del(head);
output(head);
printf("\n\n");
}
其它的都没问题,只有del()这个函数有问题。可以实现删除结点,但是我输入一个并不存在的数据时并不像设计的那样输出Enter error!请问这是那个地方出问题呢?麻烦各位指点一下。
展开
 我来答
小鱼1979117
2011-03-22 · TA获得超过1.1万个赞
知道大有可为答主
回答量:1905
采纳率:0%
帮助的人:1127万
展开全部
问题出现在这里:

while(ph->data!=DelData && ph!=NULL)//寻找要删除的结点

应该交换比较条件,写成:

while(ph!= NULL && ph->data!=DelData)//寻找要删除的结点

因为当输入一个不存在的data时,链表遍历到最后,ph一定会走到NULL的,
如果先判断ph->data的话,相当于NULL->data,就会报错中断了。
所以需要先判断ph是不是NULL,如果是, while就中断退出,不再判断ph->data了。

另外,我建议while之后的
if(ph==NULL)//没有找到要删除的结点
{
printf("Enter error!\n");
}
在printf之后加上return head;
否则程序会继续向下走到free(ph),也就是free(NULL)了。
有的时候这也是非法的,容易引起异常。

希望有用,谢谢采纳 ^_^
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式