【注解】正如我在线性表中基本操作中所叙述的所示,当你想定义一个自定义的新功能函数时,在头文件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);
}