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!请问这是那个地方出问题呢?麻烦各位指点一下。 展开
#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!请问这是那个地方出问题呢?麻烦各位指点一下。 展开
1个回答
展开全部
问题出现在这里:
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)了。
有的时候这也是非法的,容易引起异常。
希望有用,谢谢采纳 ^_^
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)了。
有的时候这也是非法的,容易引起异常。
希望有用,谢谢采纳 ^_^
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询