合并顺序表
例2.3
有两个顺序表LA和LB,其元素均为非递减有序排列,编写算法,将它们合并成一个顺序表LC,要求LC也是非递减有序排列。
例如,LA=(2,2,3),LB=(1,3,3,4),则LC=(1,2,2,3,3,3,4)。
【算法思想】设表LC是一个空表,为使LC也是非递减有序排列,可设两个指针i、j分别指向表LA和LB中的元素,若LA.elem[i]>LB.elem[j],则当前先将LB.elem[j]插入到表LC
中,若LA.elem[i]≤LB.elem[j],则当前先将LA.elem[]插入到表LC中,如此进行下去,直到其中一个表被扫描完毕,然后再将未扫描完的表中剩余的所有元素放到表LC中。
我的代码:
#include <stdio.h>
#define MAX 100
typedef struct
{
int element[MAX];
int last;
} SeqList;
void initSeqList(SeqList *list)
{
list->last = -1;
}
void insertList(SeqList *list, int value)
{
if (list->last <= MAX - 1)
{
list->last++;
list->element[list->last] = value;
}
else
printf("顺序表已满,无法继续存储");
}
void printList(SeqList list)
{
if (list.last == -1)
printf("顺序表为空");
else
{
printf("该表元素为:");
for (int i = 0; i <= list.last; i++)
printf("%d ", list.element[i]);
}
}
void mergeList(SeqList LA, SeqList LB, SeqList *LC)
{
int j = 0, k = 0;
LC->last = LA.last + LB.last + 1;
for (int i = 0; i <= LC->last; i++)
{
if (LA.element[j] < LB.element[k])
LC->element[i] = LA.element[j++];
else
LC->element[i] = LB.element[k++];
}
}
int main()
{
SeqList LA, LB, LC;
initSeqList(&LA);
initSeqList(&LB);
initSeqList(&LC);
insertList(&LA, 2);
insertList(&LA, 2);
insertList(&LA, 3);
insertList(&LB, 1);
insertList(&LB, 3);
insertList(&LB, 3);
insertList(&LB, 4);
mergeList(LA, LB, &LC);
printList(LC);
return 0;
}
结果错误:
原因:
未考虑到当某个顺序表被遍历完之后,之后存取的随机数依旧小于另一个顺序表的情况。(未初始化的情况下,顺序表其他位置存取的随机数)
增加判断:
void mergeList(SeqList LA, SeqList LB, SeqList *LC)
{
int j = 0, k = 0;
LC->last = LA.last + LB.last + 1;
for (int i = 0; i <= LC->last; i++)
{
if (j <= LA.last && k <= LB.last)
{
if (LA.element[j] < LB.element[k])
LC->element[i] = LA.element[j++];
else
LC->element[i] = LB.element[k++];
}
else
{
if (j <= LA.last)
LC->element[i] = LA.element[j++];
else
LC->element[i] = LB.element[k++];
}
}
}
总结:
1.这里比较关键的一点是理解LC->last = LA.last + LB.last + 1;
可以理解为在LA顺序表的基础上加上了LB元素的个数,元素个数=下标+1
2.注意这里你设置的是MAX 100,所以实际上你定义这些数组时,这些对应的存储空间都存上了随机数
而不是说只有你自己存进去的数,所以要限制遍历顺序表元素的个数