小李子637 2023-04-18 18:36 采纳率: 60%
浏览 16
已结题

数据结构,链表的操作

题目:如何将两个有序链表合成为一个有序链表?
问题:如图,合并后好像是乱序的,不是有序,这是哪里错了啊?求改正

img

#include<stdio.h>
#include<stdlib.h>

#define ElemType int

//单链表结构
typedef struct LNode {
    ElemType data;
    struct LNode* next;
}LNode,*LinkList;

//初始化
void InitList(LinkList& L)
{
    L = (LinkList)malloc(sizeof(LNode));
    if (L == NULL)
        printf("ERROR!");
    L->next = NULL;
}

//头插法
void HeadCreate_L(LinkList& L, int n)
{
    for (int i = n; i > 0; i--)
    {
        LinkList newNode = (LinkList)malloc(sizeof(LNode));
        printf("请输入第%d个元素:", n - i + 1);
        scanf_s("%d", &newNode->data);
        newNode->next = L->next;
        L->next = newNode;
    }
}

//打印链表
void PrintList(LinkList L)
{
    LinkList p = L->next;
    while (p != NULL)
    {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}


//合并算法
void MergeList_L(LinkList& La, LinkList& Lb)
{
    LinkList pa = La->next;
    LinkList pb = Lb->next;
    LinkList pc = La;
    while (pa && pb )
    {
        if (pa->data <= pb->data)
        {
            pc->next = pa;
            pc = pa;
            pa = pa->next;
        }
        else {
            pc->next = pb;
            pc = pb;
            pb = pb->next;
        }
    }
        pc->next = pa ? pa : pb;
        free(Lb);
}
int main()
{
    int num;
    LinkList La, Lb;
    InitList(La);
    InitList(Lb);
    //创建链表La
    printf("请输入创建链表La元素个数:");
    scanf_s("%d", &num);
    HeadCreate_L(La, num);
    printf("链表La为:");
    PrintList(La);
    //创建链表Lb
    printf("请输入创建链表Lb元素个数:");
    scanf_s("%d", &num);
    HeadCreate_L(Lb, num);
    printf("链表Lb为:");
    PrintList(Lb);
    //合并到Lc
    MergeList_L(La, Lb);
    printf("合并后的链表为:");
    PrintList(La);
}

  • 写回答

3条回答 默认 最新

  • qzjhjxj 2023-04-18 20:30
    关注

    因为链表是降序的,所以将void MergeList_L(LinkList& La, LinkList& Lb)函数里第55行:if (pa->data <= pb->data) 修改为:if (pa->data > pb->data)j即可,供参考:

    #include<stdio.h>
    #include<stdlib.h>
    
    #define ElemType int
    
    //单链表结构
    typedef struct LNode {
        ElemType data;
        struct LNode* next;
    }LNode,*LinkList;
    
    //初始化
    void InitList(LinkList& L)
    {
        L = (LinkList)malloc(sizeof(LNode));
        if (L == NULL)
            printf("ERROR!");
        L->next = NULL;
    }
    
    //头插法
    void HeadCreate_L(LinkList& L, int n)
    {
        for (int i = n; i > 0; i--)
        {
            LinkList newNode = (LinkList)malloc(sizeof(LNode));
            printf("请输入第%d个元素:", n - i + 1);
            scanf_s("%d", &newNode->data);
            newNode->next = L->next;
            L->next = newNode;
        }
    }
    
    //打印链表
    void PrintList(LinkList L)
    {
        LinkList p = L->next;
        while (p != NULL)
        {
            printf("%d ", p->data);
            p = p->next;
        }
        printf("\n");
    }
     
     
    //合并算法
    void MergeList_L(LinkList& La, LinkList& Lb)
    {
        LinkList pa = La->next;
        LinkList pb = Lb->next;
        LinkList pc = La;
        while (pa && pb )
        {
            if (pa->data > pb->data)  //if (pa->data <= pb->data) 修改
            {
                pc->next = pa;
                pc = pa;
                pa = pa->next;
            }
            else {
                pc->next = pb;
                pc = pb;
                pb = pb->next;
            }
        }
        pc->next = pa ? pa : pb;
        free(Lb);
    }
    int main()
    {
        int num;
        LinkList La, Lb;
        InitList(La);
        InitList(Lb);
    
        //创建链表La
        printf("请输入创建链表La元素个数:");
        scanf_s("%d", &num);
        HeadCreate_L(La, num);
        printf("链表La为:");
        PrintList(La);
    
        //创建链表Lb
        printf("请输入创建链表Lb元素个数:");
        scanf_s("%d", &num);
        HeadCreate_L(Lb, num);
        printf("链表Lb为:");
        PrintList(Lb);
    
        //合并到Lc
        MergeList_L(La, Lb);
        printf("合并后的链表为:");
        PrintList(La);
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 4月30日
  • 已采纳回答 4月22日
  • 创建了问题 4月18日

悬赏问题

  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥30 关于<main>标签页面跳转的问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加
  • ¥15 用ns3仿真出5G核心网网元
  • ¥15 matlab答疑 关于海上风电的爬坡事件检测