数据结构两个有序顺序表的合并操作

有序顺序表合并操作详解

数据结构两个有序顺序表的合并操作

预期输入输出:
在这里插入图片描述代码实现:

#define _CRT_SECURE_NO_WARNINGS
/*************************************************************
    顺序表的基本操作
    date: 2025 9 30
    Sonnet(水门)
**************************************************************/


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

#define MaxSize 50
typedef int ElemType;
typedef struct {
    ElemType data[MaxSize];
    int length;
} SqList;

void CreateList(SqList** L, ElemType a[], int n) //整体建立顺序表
{

    for (int i = 0; i < n; i++)
        (*L)->data[i] = a[i];
    (*L)->length = n;
}

void InitList(SqList** L)    //初始化线性表
{
    (*L) = (SqList*)malloc(sizeof(SqList));
    (*L)->length = 0;
}

void DestroyList(SqList* L)   //销毁线性表
{
    free(L);
}

int ListEmpty(SqList* L)    //判线性表是否为空表
{
    return (L->length == 0);
}

void DispList(SqList* L)    //输出线性表
{
    for (int i = 0; i < L->length; i++) {
        printf("%d ", L->data[i]);
    }
    printf("\n");
}

int MergeList(SqList* La, SqList* Lb, SqList** Lc)
{
    // 已知顺序线性表La和Lb的元素按值非递减排列。
    // 归并La和Lb得到新的顺序线性表Lc,Lc的元素也按值非递减排列。
    /********** Begin **********/
    int judge, f, k = 0, i = 0, j = 0;
    for (; i < La->length && j < Lb->length;)
    {
        if (La->data[i] < Lb->data[j])
        {
            (*Lc)->data[k] = La->data[i];
            k++;
            i++;
        }
        else
        {
            (*Lc)->data[k] = Lb->data[j];
            k++;
            j++;
        }
    }
    if (i == La->length)
    {
        judge = 0;
        f = j;
    }

    else
    {
        judge = 1;
        f = i;
    }
    if (judge)
    {
        for (; f < La->length; )
        {
            (*Lc)->data[k] = La->data[f];
            k++;
            f++;
        }
    }
    else
        for (; f < Lb->length; )
        {
            (*Lc)->data[k] = Lb->data[f];
            k++;
            f++;
        }
    (*Lc)->length = La->length + Lb->length;


    /********** End **********/
}

int main() {
    int a[MaxSize], n, k, e;
    SqList* La, * Lb, * Lc;
    InitList(&La);
    InitList(&Lb);
    InitList(&Lc);
    scanf("%d", &n);//输入线性表元素个数
    for (int i = 0; i < n; i++)
        scanf("%d", &a[i]);//输入线性表元素值
    CreateList(&La, a, n);//将上述输入元素创建成顺序表La
    scanf("%d", &n);//输入线性表元素个数
    for (int i = 0; i < n; i++)
        scanf("%d", &a[i]);//输入线性表元素值
    CreateList(&Lb, a, n);//将上述输入元素创建成顺序表Lb

    MergeList(La, Lb, &Lc);
    printf("合并两个有序顺序表:\n");
    DispList(Lc);

    DestroyList(Lc);
    return 0;
}

此代码在vs2022上运行成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值