顺序表合并
存储结构
typedef struct{
ElemType *elem;
int Length;
int ListSize;
}SqList;
1、初始化线性表La,Lb,Lc
2、设置变量,i,j,k。i控制La元素下标,j控制Lb的元素下标,k控制L
c
3、当其中某一线性表放入完成时,将另外线性表后面的直接放下去。
初始化
void InitList(SqList &L)//创建线性表函数
{
L.elem = (ElemType*)malloc(100 * sizeof(ElemType));
L.Length = 0;
L.ListSize = 100;
}
初始化数值
void InitData(SqList &L,int length)//初始化元素函数
{
printf("请输入%d个线性表的元素/有序的:\n",length);
for (int i = 0; i < length; i++)
{
scanf("%d", &L.elem[i]);
}
//更改线性表的长度
L.Length = length;
}
插入函数
void InsertList(SqList &lc,int location,int data)
{
/*
* 因为这里插入到lc线性表,这里lc是空的。
* 所以我就直接按照初始化lc数据的方式来插入
*
* 另一种情况是lc里面有数据,然后需要插入。当然这一题不是。
* 这种情况的话首先要把Location后面的数全部往后挪一个位置。循环次数为n-i+1
* 然后把Location处的值设置为data,就可以了
*/
lc.elem[location] = data;
}
合并函数
void MergeList(SqList la, SqList lb, SqList &lc)
{
int i, j,k;
/*
* 书上是初始化i,j=1
* 所以书上下面的while循环写的是i<=la.length
* 我从0开始,所以下面应该写i<length
* 思路都是一样的
*/
i = 0;
j = 0;
k = 0;
while (i < la.Length&&j < lb.Length)//当两个都不为空的时候才判断
{
if (la.elem[i] < lb.elem[j])
{
InsertList(lc, k, la.elem[i]);
i++;
//当前的k下标已经初始化完以后k自加,为后面的值做准备
k++;
}
else {
InsertList(lc, k, lb.elem[j]);
j++;
//当前的k下标已经初始化完以后k自加,为后面的值做准备
k++;
}
}
//la和lb的Length不等
//所以要区别情况
while (i < la.Length)
//如果i最后的值还是小于la的长度,且上面的while部分又结束了
//说明lb已经结束了
{
InsertList(lc, k, la.elem[i]);
i++;
k++;
}
while (j < lb.Length)
{
InsertList(lc, k, lb.elem[j]);
j++;
k++;
}
//这里!一定要记得更新lc.length!!!!!!!!!
lc.Length = k;
printf("k:%d", k);
}
注意点:
1、当lc添加元素了以后,最后要更新lc.length
2、如果i,j设置为1的起始值。while条件写成:while(i<=la.length&&j<=lb.length)