合并两个顺序表
已知有两个顺序表LA和LB(代码如下所示),并且两个表的储存的两个相邻元素,后者要大于或等于前者。合并这两个表。
LA,LB的初始化
#include <stdio.h>
#define MaxSize 100
typedef struct {
int data[MaxSize];
int length;
}Sqlist;
int main(){
Sqlist LA, LB;
LA.data[0] = 1;
LA.data[1] = 1;
LA.data[2] = 5;
LA.data[3] = 7;
LA.data[4] = 9;
LA.length = 5;
LB.data[0] = 1;
LB.data[1] = 4;
LB.data[2] = 4;
LB.data[3] = 5;
LB.length = 4;
return 0;
}
1.创建表LC 在LC中和并LA和LB。
1.1算法思想
设表LC为一个空表,分别用两个指示器i,j指向LA和LB中的元素,如果LA.data[i]>=LB.data[j],就将LB.data[j]插入LC中,反之
就把LA.data[i]插入LC中。如果LA,LB中有一个表全部插入LC中 ,但另外一个表还有剩余,直接将剩余的部分直接插入LC中
1.2算法设计
void mergeList(Sqlist LA,Sqlist LB,Sqlist &LC)
/*从下标为零开始比较LA,LB中元素的大小,小的先赋值给LC*/
{
int i, j,k;//分别记录表LA,LB,LC中数据的下标。
i = 0; j = 0; k = 0;
while (i <= LA.length - 1 && j <= LB.length - 1)
{
if (LA.data[i] >= LB.data[j])
{
LC.data[k] = LB.data[j];
j++;
}
else
{
LC.data[k] = LA.data[i];
i++;
}
k++;
}
while (i <= LA.length-1)
/*已经将LB表中的所有值都赋值给 LC 但LA中还有剩余*/
{
LC.data[k] = LA.data[i];
k++;
i++;
}
while (j <= LB.length-1)
/*已经将LA表中的所有值都赋值给 LC 但LB中还有剩余*/
{
LC.data[k] = LB.data[j];
k++;
j++;
}
LC.length = LA.length + LB.length;
}
2.在表LB中插入LA的各个元素
2.1算法思想
分别用两个指示器i,j指向LA和LB中的元素,如果LA.data[i]<=LB.data[j],就将LA.data[i]插入到LB.data[j]之前,反之就比较
LA.data[i+1]和LB.data[j]。如果LA从i个元素开始,后面每个元素都大于LB的最后一个元素,直接将LA剩余的部分直接插入LB的后面。
2.2算法设计
int InsList(Sqlist& L, int i, int e)标签:顺序,LB,LC,LA,++,合并,length,两个,data From: https://www.cnblogs.com/wlb429/p/16725151.html
/*插入函数*/
{
int k;
for (k = L.length; k >= i; k--) /*为插入元素而移动位置*/
L.data[k + 1] = L.data[k];
L.data[i] = e;
L.length++;//LB表长+1
return true;
}
void merge(Sqlist LA, Sqlist& LB)
{
int i, j;
for (i = 0, j = 0; i < LA.length; j++)
{
if (LA.data[i] <= LB.data[j])
{
InsList(LB, j, LA.data[i]);//调用函数InsLIst 将LA.data[i]插入到LB.data[j]前
i++;
}
if (j == LB.length - 1)
{
//从LA.data[i]开始之后 LA每个元素都大于LB表的最后一个元素
for (; i < LA.length; i++, j++)
{
LB.length++;//LB表长+1
LB.data[j + 1] = LA.data[i]; //将LA从LA.data[i]开始每个元素都依次插入LB表的最后面
}
break;//结束最外层循环
}
}
}