学园天堂漫画中岛:请帮忙看一下,程序哪里有错误

来源:百度文库 编辑:高校问答 时间:2024/05/12 05:28:24
就是最后一个链表排序函数有错,请大侠们帮帮小弟

#include<malloc.h>
#include<stdio.h>
#define NULL 0
#define COUNT 3
#define LEN sizeof(struct person)

struct person
{char name[20];
char no[20];
char sex;
float in,out;
struct person *next;
};

//int n=0;
struct person *creat(int n) //创建链表并读取文件中的数据
{
struct person *head=NULL,*p1=NULL,*p2=NULL;
int i;
FILE *fp;
fp=fopen("c:\\record.txt","rb");
for (i=1;i<=n;i++)
{
p1=(struct person *)malloc(LEN);
fscanf(fp,"%s %s %c %f %f",&p1->name,&p1->no,&p1->sex,&p1->in,&p1->out);
//fread(p1,sizeof(struct person),1,fp);
p1->next=NULL;
if(i==1) head=p1;
else p2->next=p1;
p2=p1;
}
return(head);
}
struct person *order(struct person *head)//按上班时间对链表进行排序
{
struct person *temp,*p1,*p2;
p1=head;
temp=NULL;
while(p1->next!=NULL)
{p2=p1->next;
while(p2->next!=NULL)

{if(p1->in>p2->in)
{
*temp=*p1;
*p1=*p2;
*p2=*temp;
}
p2=p2->next;
}
p1=p1->next;
}
return(head);
}

作数据交换时应该只交换结点的值,而不能包括next域的值,否则就破坏了结点之间的链接关系。你直接使用*temp=*p1,这样做连带着把next域的值也赋值过去了。