使用的数据结构:
- 线性表
- 非递减序列:123456555789
- 非递增排列:655553221
- 递增:123456
- 递减:654321
使用两种编程的方式,本质都一样的,具体可见 Data Structure - 基于realloc可自动扩展的顺序表 By C里面写到有关于,指针,地址,数组的关系。
- 第一个方式,里面的insert方式,也可以换成数组直接写进去。
- 第二个方式即纯指针操作
void MergeList_Sq(Sqlist La, Sqlist Lb, Sqlist& Lc) {
/*
已知顺序线性表La和Lb的元素按值非递减排列
归并La和Lb得到新的顺序表Lc
Lc的元素也按值非递减排列
*/
int LaLength = La.length;
int LbLength = Lb.length;
ElemType* LaP = La.elem;
ElemType* LbP = Lb.elem;
ElemType* LcP = Lc.elem;
int t = 0;
int k = 0;
for (int i = 0; i < LaLength; i++)
{
if (t+1==LbLength) //当b子串放置满时,将a追加在其后
{
for ( ;i < LaLength; i++)
{
ListInsert_sq(Lc, k++, LaP[i]);
}
return;
}
if (i+1 == LaLength) //当a子串放置完时,将b追加在其后
{
for (;t < LbLength; t++)
{
ListInsert_sq(Lc, k++, LaP[t]);
}
return;
}
if (LaP[i] <= LbP[t])
{
ListInsert_sq(Lc, k++, LaP[i]);
if (LaP[i] = LbP[t])
{
ListInsert_sq(Lc, k++, LbP[t++]);
}
}
else
{
ListInsert_sq(Lc, k++, LbP[t++]);
i--;
}
}
}
void MergeList_Sq_Second(Sqlist La, Sqlist Lb, Sqlist& Lc) {
Lc.listsize = Lc.length = La.length + Lb.length;
ElemType* pc = Lc.elem = (ElemType*)malloc(Lc.length * sizeof(ElemType));
if (!pc)
{
exit (OVERFLOW);
}
ElemType* pa = La.elem, * pb = Lb.elem;
ElemType* pa_last = pa + La.length, *pb_last = pb + Lb.length;
while (pa<pa_last&&pb<pb_last)
{
if (*pa>*pb)
{
*pc++ = *pb++;
}
else if(*pa==*pb)
{
*pc++ = *pa++;
*pc++ = *pb++;
}
else
{
*pc++ = *pa++;
}
}
while (pa<pa_last)
{
*pc++ = *pa++;
}
while (pb<pb_last)
{
*pc++ = *pb++;
}
}
- 前两行,为输入的第一个线性表
- 中两行,第二个
- 后四,结果