使用排序功能运行一遍后会断链,数据受损,用显示功能显示所有链表,发现4个链表变2个????(但能正确排序),再用一次排序功能就2个变1个????
如图所示
排序部分代码如下:
void sort(struct student *head)//按时间顺序由小到大排序(p->date)并输出
{
struct student *p1,*p2,*p,*p3,p4;
int n=1,flag;
struct studentpt=NULL;
//排序
while(pt!=head->next)
{
flag=0;p1=p2=head;
while(p1->next!=pt)
{
p1=p1->next;
if (p1->datedate)
{
if(flag==0)
{p2->next=p1->next;p1->next=p2;
p=p1;p1=p2;p2=p;
head=p2;}
else
{p3=head;
while(p3->next!=p2){p3=p3->next;} p2->next=p1->next;p1->next=p2;p3->next=p1;
p=p1;p1=p2;p2=p;}
}
flag=1;p2=p1;
}
pt=p1;n++;
}
//显示
p4=head;
while(p4!=NULL)
{
printf("单号编号 交易日期 入账日期 交易额 交易后余额交易次数 交易类型||交易地点\n");
printf("%d,%d,%d,%d,%d,%d,%d,%s,%s\n",p4->hao,p4->num,p4->date,p4->incountdate,p4->money,p4->sum,p4->time,p4->type,p4->address);
p4=p4->next;
}
}
排序代码没什么问题,只是当头节点交换后, 链表头指针head指向的地址改变了,要 return head; 把新的头节点地址返回给主函数
你题目的解答代码如下:
struct student * sort(struct student *head) //返回值类型改成struct student *
{
struct student *p1, *p2, *p, *p3, *p4;
int n = 1, flag;
struct student *pt = NULL;
//排序
while (pt != head->next)
{
flag = 0;
p1 = p2 = head;
while (p1->next != pt)
{
p1 = p1->next;
if (p1->date<p2->date)
{
if (flag == 0)
{
p2->next = p1->next;
p1->next = p2;
p = p1;
p1 = p2;
p2 = p;
head = p2;
}
else
{
p3 = head;
while (p3->next != p2)
{
p3 = p3->next;
}
p2->next = p1->next;
p1->next = p2;
p3->next = p1;
p = p1;
p1 = p2;
p2 = p;
}
}
flag = 1;
p2 = p1;
}
pt = p1;
n++;
}
//显示
p4 = head;
while (p4 != NULL)
{
printf("单号编号 交易日期 入账日期 交易额 交易后余额交易次数 交易类型||交易地点\n");
printf("%d,%d,%d,%d,%d,%d,%d,%s,%s\n", p4->hao, p4->num, p4->date, p4->incountdate, p4->money, p4->sum, p4->time, p4->type, p4->address);
p4 = p4->next;
}
return head; // 把新的头节点地址返回给主函数
}
主函数调用
head = sort(head);
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!