C语言已知单链表LA=(a1,a2,…,am)和LB=(b1,b2,…,bn),编写程序按以下规则将它们合并成一个单链表LC,

 LC=(a1,b1,…,am,bm,bm+1,…,bn),m<=n

或者

LC=(a1,b1,…,bn,an,an+1,…,am),m>n

/*

开发者:慢蜗牛 开发时间:2020.6.11

程序功能:合并链表

*/

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define LEN sizeof(struct L)

void print(struct L* head);
void insert(struct L* p1, struct L* p2);

struct L//创建结构体
{
int a;

struct L* next;
};

int n;

struct L* creat()//建立链表
{
struct L* head;

struct L* p1, * p2;

n = 0;

p1 = p2 = (struct L*)malloc(LEN);

scanf_s("%d", &p1->a);

head = NULL;

while (p1->a != -1)
{
    n = n + 1;

    if (n == 1) head = p1;

    else p2->next = p1;

    p2 = p1;

    p1 = (struct L*)malloc(LEN);

    scanf_s("%d", &p1->a);
}

p2->next = NULL;

return(head);
}

void print(struct L* head)//输出具有头结点的列表
{
struct L* p;

p = head->next;

if (head != NULL)
    do
    {
        printf("--%d ", p->a);

        p = p->next;
    } while (p != NULL);
}

void insert(struct L* p1, struct L* p2)//从小到大合并递增链表
{
struct L* LC, * r;

LC = (struct L*)malloc(LEN);

LC->next = p1;

r = LC;

while (p1 && p2)
{
    if (p1->a <= p2->a)
    {
        r->next = p1;

        r = p1;

        p1 = p1->next;
    }

    else
    {
        r->next = p2;

        r = p2;
    
        p2 = p2->next;
    }

}
if (p1 == NULL) r->next = p2;

else r->next = p1;

print(LC);
}

void main()//主函数
{
struct L* LA, * LB;

printf("请输入LA的数据:");

LA = creat();

printf("请输入LB的数据:");

LB = creat();

printf("LC=");

insert(LA, LB);
}

 

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是用C语言实现将两个单链表合并一个的程序: ```c #include <stdio.h> #include <stdlib.h> // 定义单链表节点结构体 struct ListNode { int val; struct ListNode *next; }; // 定义函数将两个单链表合并一个 struct ListNode* mergeLists(struct ListNode* LA, struct ListNode* LB) { struct ListNode *p = LA->next; // LA的第一个节点 struct ListNode *q = LB->next; // LB的第一个节点 struct ListNode *pre = LA; // pre表示LC的前驱节点 while (p && q) { // p和q都不为空时 if (p->val <= q->val) { pre->next = p; p = p->next; } else { pre->next = q; q = q->next; } pre = pre->next; // LC的前驱节点指向当前节点 } pre->next = p ? p : q; // 将未遍历完的链表连接到LC末尾 free(LB); // 释放LB的头节点 return LA; } int main() { // 初始化LALB struct ListNode *LA = (struct ListNode*)malloc(sizeof(struct ListNode)); LA->next = NULL; struct ListNode *LB = (struct ListNode*)malloc(sizeof(struct ListNode)); LB->next = NULL; // 生LALB的节点 struct ListNode *p = LA; for (int i = 1; i <= 5; i++) { struct ListNode *node = (struct ListNode*)malloc(sizeof(struct ListNode)); node->val = i; node->next = NULL; p->next = node; p = node; } p = LB; for (int i = 6; i <= 10; i++) { struct ListNode *node = (struct ListNode*)malloc(sizeof(struct ListNode)); node->val = i; node->next = NULL; p->next = node; p = node; } // 将LALB合并LC struct ListNode *LC = mergeLists(LA, LB); // 输出LC的值 p = LC->next; while (p) { printf("%d ", p->val); p = p->next; } printf("\n"); // 释放LALBLC的所有节点 p = LA; while (p) { struct ListNode *node = p; p = p->next; free(node); } p = LB; while (p) { struct ListNode *node = p; p = p->next; free(node); } p = LC; while (p) { struct ListNode *node = p; p = p->next; free(node); } return 0; } ``` 程序的核心就是一个`mergeLists`函数,它将两个单链表合并一个并返回合并后的链表的头节点指针。在函数中,我们先定义三个指针`p`、`q`和`pre`,分别指向LA的第一个节点、LB的第一个节点和LC的前驱节点。然后从链表的头开始,比较p和q节点的值,将较小的节点连接到LC的末尾。最后将未遍历完的链表连接到LC的末尾即可。最后别忘了释放LB的头节点和所有的节点。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

放氮气的蜗牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值