数据结构两个有序顺序表的合并操作
预期输入输出:
代码实现:
#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上运行成功
有序顺序表合并操作详解
1万+

被折叠的 条评论
为什么被折叠?



