基于c语言严蔚敏版的数据结构—非递减线性表的合并

本文介绍了一种将两个已排序的线性表合并为一个新的非递减排列的线性表的方法,并提供了完整的C语言实现代码。通过遍历两个输入线性表并将较小元素依次插入到新表中,直至所有元素被处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【注解】正如我在线性表中基本操作中所叙述的所示,当你想定义一个自定义的新功能函数时,在头文件ADT.H中添加函数的声明,最后在自己的source代码中定义该函数即可实现函数的全局使用。我把void MergeList(List L1,List L2,List &L3);在头文件中声明,同时在最终的一个项目下写个源代码文件实现该功能并用main函数测试;

【技巧】用到while((L1没有结束)&&(L2没有结束)){GetElem(L1,i,e1)取出位置为i的值e1,GetElem(L2,j,e2)取出位置为j的e2;

比较e1,e2,较小的值赋给线性表L3,L3的位置后移一位,同时较小值所在的线性表也后移一位;

ListInsert(L1,L2,L3);

取出L3指针,作为ListTravers()的实参;最终输出L3的数据;

}

【前提】两个线性表均是非递减的线性表,若想拓展乱序的线性表排序,可以再内部定义个排序函数,然后同步骤即可。

【代码示例】

#include"ADT.H"
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>


//假设线性表都是按照非递减的顺序排列
void MergeList(List L1,List L2,List &L3){
int e1,e2;
int len1=ListLength(L1);
int len2=ListLength(L2);
InitList(L3);
int i =1;
int j=1;
int k=0;
while((i<=len1)&&(j<=len2)){
GetElem(L1,i,e1);
GetElem(L2,j,e2);//注意参数的格式引用格式的参数对全局有效(当前是此函数)
if(e1<e2)
{
  ListInsert(L3,++k,e1);
  i++;
}
else {
  ListInsert(L3,++k,e2);
  j++;
}
}
//当线性表中有一个到尽头时,while循环体就结束循环
/*
*当线性表L1没结束时,直接在L3末尾补全L1的数据
*当线性表L2没结束时,直接在L3末尾补全L2的数据
*/
while(i<=len1){
//等于时候恰巧在最后一个位置也有效
GetElem(L1,i++,e1);
ListInsert(L3,++k,e1);
}


while(j<=len2){
//等于时候恰巧在最后一个位置也有效
GetElem(L2,j++,e2);
ListInsert(L3,++k,e2);
}
}
void main(){
List L1;
List L2;
List L3;
int j=0;
int k=0;
int flag;
int value;
InitList(L1);
InitList(L2);
InitList(L3);
printf("输入线性表一的初始化长度:");
scanf("%d",&flag);
while(flag>0){
scanf("%d",&value);
ListInsert(L1,++j,value);
flag--;
}
printf("输入线性表二的初始化长度:");
scanf("%d",&flag);
while(flag>0){
scanf("%d",&value);
ListInsert(L2,++k,value);
flag--;
}
MergeList(L1,L2,L3);
ListTravers(L3);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值