c语言,排序断链问题,求解!!

使用排序功能运行一遍后会断链,数据受损,用显示功能显示所有链表,发现4个链表变2个????(但能正确排序),再用一次排序功能就2个变1个????

如图所示

img

img

排序部分代码如下:

void sort(struct student *head)//按时间顺序由小到大排序(p->date)并输出
{
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->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);

如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!

img

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632