weixin_65342675 2022-01-22 17:59 采纳率: 33.3%
浏览 41
已结题

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;
}
}

  • 写回答

2条回答 默认 最新

  • 关注

    排序代码没什么问题,只是当头节点交换后, 链表头指针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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月31日
  • 已采纳回答 1月23日
  • 修改了问题 1月22日
  • 创建了问题 1月22日

悬赏问题

  • ¥15 如何在炒股软件中,爬到我想看的日k线
  • ¥15 51单片机中C语言怎么做到下面类似的功能的函数(相关搜索:c语言)
  • ¥15 seatunnel 怎么配置Elasticsearch
  • ¥15 PSCAD安装问题 ERROR: Visual Studio 2013, 2015, 2017 or 2019 is not found in the system.
  • ¥15 (标签-MATLAB|关键词-多址)
  • ¥15 关于#MATLAB#的问题,如何解决?(相关搜索:信噪比,系统容量)
  • ¥500 52810做蓝牙接受端
  • ¥15 基于PLC的三轴机械手程序
  • ¥15 多址通信方式的抗噪声性能和系统容量对比
  • ¥15 winform的chart曲线生成时有凸起