鱼生富贵 2022-01-23 00:48 采纳率: 97.4%
浏览 13
已结题

两个链表的排序问题,如何解决?

题:将a,b两个链表连接起来并按升序排列。


#include<stdio.h>
#include<malloc.h>
#define LEN sizeof(struct Student)
struct Student
{
    long num;
    int score;
    struct Student* next;
};
int main()
{
    struct Student* Creat_List(void);
    struct Student* Insert(struct Student* ahead, struct Student* bhead);
    void Print(struct Student* ahead);
    struct Student* ahead, * bhead, * abhead;
    printf("list a:\n");
    ahead = Creat_List();
    printf("list b:\n");
    bhead = Creat_List();
    abhead = Insert(ahead, bhead);
    Print(abhead);
    return 0;
}
struct Student* Creat_List(void)
{
    int n = 0;
    struct Student* p1, * p2, * head=NULL;
    p1 = p2 = (struct Student*)malloc(LEN);
    scanf_s("%ld %d", &p1->num, &p1->score);
    while (p1->num != 0)
    {
        n = n + 1;
        if (n == 1)
            head = p1;
        else
            p2->next = p1;
        p2 = p1;
        p1 = (struct Student*)malloc(LEN);
        scanf_s("%ld %d", &p1->num, &p1->score);
    }
    p2->next = NULL;
    return head;
}
struct Student* Insert(struct Student* ahead, struct Student* bhead)
{
    struct Student* pa1, * pa2, * pb1, * pb2;
    pa1 = pa2 = ahead;
    pb1 = pb2 = bhead;
    do
    {
        while ((pa1->num < pb1->num) && (pa1->next != NULL))
        {
            pa2 = pa1;
            pa1 = pa1->next;
        }
        if (pa1->num >= pb1->num)
        {
            if (pa1 == ahead)
                ahead = pb1;
            else
                pb2->next = pb1;
            pb1 = pb1->next;
            pb2->next = pa1;
            pa2 = pb2;
            pb2 = pb1;
        }
    } while ((pa1->next != NULL) || (pa1 == NULL && pb1 != NULL));
    if ((pb1 != NULL) && (pb1->num > pa1->num) && (pa1->next == NULL))
        pa1->next = pb1;
    return ahead;
}
void Print(struct Student* ahead)
{
    struct Student* p;
    p = ahead;
    while (p != NULL)
    {
        printf("%ld %d\n", p->num, p->score);
        p = p->next;
    }
}

结果为什么这样了?

img


另外:有无hxd梳理一下它这个Insert函数的思路,大脑有点混乱。尤其没明白那个do.while.循环条件。

  • 写回答

1条回答 默认 最新

  • Hann Yang 全栈领域优质创作者 2022-01-23 07:06
    关注

    将a,b两个链表连接起来,【并按升序排列】
    不仅是插入,而是两个链表接元素的大小交替合并
    并且:
    a,b本身也是升序链表,否则Insert()也完成不任务的

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 2月1日
  • 已采纳回答 1月24日
  • 创建了问题 1月23日

悬赏问题

  • ¥15 2024-五一综合模拟赛
  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭