好好睡觉好好学习 2022-10-02 13:37 采纳率: 66.7%
浏览 330
已结题

关于#链表#的问题:c语言数据结构,将两个单链表合成一个单链表求集合(皆为非降序),希望给出可以在dev中运行的代码 并给出详细解释

c语言数据结构,将两个单链表合成一个单链表求集合(皆为非降序),希望给出可以在dev中运行的代码 并给出详细解释,请指教

  • 写回答

6条回答 默认 最新

  • 日向晚,声声慢 2022-10-02 14:15
    关注
    
    #include<stdio.h>
    #include<stdlib.h>
    typedef struct Node
    {
        int data;
        struct Node* next;
    }Node_t;
    
    //开辟节点并初始化
    Node_t* AollcNode(int x)
    {
        Node_t* p = (Node_t*)malloc(sizeof(Node_t));//新建一个节点
        //初始化
        p->data = x;
        p->next = NULL;
        return p;
    }
    //合并
    void MergeList(Node_t* head, Node_t* head1, Node_t* head2)
    {
        Node_t* p = head;
        Node_t* p1 = head1->next;//指向第一个节点
        Node_t* p2 = head2->next;//指向第一个节点
        while (p1 && p2)
        {
            if (p1->data <= p2->data)
            {
                p->next = p1;
                p1 = p1->next;
            }
            else
            {
                p->next = p2;         
                p2 = p2->next;
            }
            p = p->next;//指向新的节点,起到连接下一个节点的左右
        }
        //链表2还有数据
        if (p1 == NULL)
        {
            p->next = p2;
        }
        //链表1还有数据
        if (p2 == NULL)
        {
            p->next = p1;
        }
    }
    
    
    //尾插入创建链表
    void InintList(Node_t* head, Node_t** end)
    {
        int i = 0;
        int x = 0;
        Node_t* p = NULL;
        printf("输入链表长度:>");
        int n = 0;
        scanf("%d", &n);
        for (; i < n; i++)
        {
            scanf("%d", &x);
            p = AollcNode(x);
            (*end)->next = p;
            *end = p;
        }
    }
    
    void ShowNode(Node_t* head)
    {
        Node_t* p = head->next;
        while (p)
        {
            printf("%d->", p->data);
            p = p->next;
        }
        printf("NULL\n");
    }
    
    int main()
    {
        Node_t* head1 = AollcNode(0);
        Node_t* head2 = AollcNode(0);
        Node_t* head3 = AollcNode(0);//合并后的tou
        printf("初始化链表1\n");
        Node_t* end1 = head1;
        //因为要记录结尾,要改变尾指针的指向要传址调用
        InintList(head1, &end1);
        ShowNode(head1);
    
        printf("初始化链表2\n");
        Node_t* end2 = head2;
        //因为要记录结尾,要改变尾指针的指向要传址调用
        InintList(head2, &end2);
        ShowNode(head2);
    
        printf("合并后:>");
        MergeList(head3, head1, head2);
        ShowNode(head3);
    
        free(head1);
        free(head2);
        free(head3);
        head1 = NULL;
        head2 = NULL;
        head3 = NULL;
    
    
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 10月11日
  • 已采纳回答 10月3日
  • 创建了问题 10月2日

悬赏问题

  • ¥15 高德地图点聚合中Marker的位置无法实时更新
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办