题目:将两个有序顺序表合并为一个新的顺序表,并由函数返回结果顺序表
(非常典型的算法方法)
算法思想:
第一步:按顺序不断取下两个顺序表中表头较小的结点,存到新的顺序表中
第二步:看哪个顺序表有剩余,将剩余结点加到新的顺序表后面
代码:
bool Merge(SqList A.SqList B, SqList &C)
{
if (A.length + B.length > C.MaxSize)//大于新的顺序表的最大长度
return false; //显示错误信息false,并返回
int i = 0, j = 0, k = 0; //分别对应顺序表A,B,C的下标
while (i < A.length && j < B.length)//循环,两两比较,小的存入结果表
if (A.data[i] <= B.data[j])
C.data[k++] = A.data[i++];
else
C.data[k++] = B.data[j++];
//还有一个顺序表还有剩余部分
while (i < A.length)
C.data[k++] = A.data[i++];
while (j < B.length)
C.data[k++] = B.data[j++];
C.length = k;
return true;
}
注:
(1)区分顺序表的位序和顺序表的下标:
顺序表的位序:从1开始(第1位,第2位,第3位,…)
顺序表的下标:即数组的下标,从0开始
(2)为什么要考虑C.maxSize?
(与一个顺序表的存储结构定义有关)
静态分配一维数组:
#define MaxSize 50 //定义顺序表的最大长度
typedef struct{
ElemType data[MaxSize]; //顺序表的元素
int length; //顺序表的当前长度
}SqList; //顺序表的结构定义
动态分配一维数组:
#define InitSize 100 //表长度的初始定义
typedef struct{
ElemType *data; //指示动态分配数组的指针
int MaxSize,length; //数组的最大容量和当前个数
}SeqList; //动态分配数组顺序表的结构定义