算法2.2
已知线性表LA和LB中的数据元素按值非递减有序排列,现要求将LA和LB归并为一个新的线性表LC,且LC中的数据元素仍按值非递减有序排列
例如LA=(3, 5, 8, 11), LB=(2, 6, 8, 9, 11, 15, 20),则LC=(2, 3, 5, 6, 8, 8, 9, 11, 11, 15, 20)
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <malloc.h>
using namespace std;
#define LIST_INIT_SIZE 100//线性表存储空间初始分配量
#define LISTINCREMENT 10 //线性表存储空间的分配增量
#define OK 1
#define ERROR -1
#define TRUE 1
#define FALSE 0
#define MAX_SIZE 100
#define List int
typedef int Status;
typedef int ElemType;
typedef struct
{
ElemType *elem;//存储空间基址
int length; //当前长度
int listsize; //当前分配的存储容量(以sizeof(ElemType)为单位)
} SqList;
//初始化线性表
Status InitList(SqList &L)
{
//构造一个空的线性表L
L.elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L.elem)
{
printf("分配失败!\n");
return ERROR;//内存分配失败
}
L.length = 0; //空表长度为0
L.listsize = LIST_INIT_SIZE;//初始存储容量
return OK;
}
//获取线性表的长度
Status ListLength(SqList L)
{
if(L.elem)
{
return L.length;
}
return ERROR;
}
//获取第i个元素的值
Status GetElem(SqList L, int i, int &e)
{
if(L.elem && i >= 1 && i <= L.length)
{
e = *(L.elem + i - 1);
return OK;
}
return ERROR;
}
//将元素e插入到第i个位置
Status ListInsert(SqList &L, int i, ElemType e)
{
ElemType *newbase, *q, *p;
if(i<1 || i>L.length+1)
{
return ERROR;
}
if(L.length >= L.listsize)
{
newbase = (ElemType *)realloc(L.elem, (L.listsize + LISTINCREMENT)*sizeof(ElemType));
if(!newbase)
{
return ERROR;
}
L.elem = newbase;
L.listsize += LISTINCREMENT;
}
q = L.elem + i -1;
for(p = L.elem+L.length-1; p>=q; --p)
{
*(p+1) = (*p);
}
*q = e;
++L.length;
return OK;
}
//遍历列表
Status ListTraverse(SqList L, void (*vi)(ElemType*))
{
ElemType *p;
int i;
p = L.elem;
for(i = 1; i <= L.length; i++)
{
vi(p++);
}
printf("\n");
return OK;
}
//输出元素
void Print(ElemType *e)
{
printf("%d ", *e);
}
//根据题目要求,合并数组到Lc
void MergeList(SqList La, SqList Lb, SqList &Lc)
{
InitList(Lc);
int i = 1, j = 1;
int k = 0;
int La_len = ListLength(La);
int Lb_len = ListLength(Lb);
int ai, bj;
while((i<=La_len)&&(j<=Lb_len))
{
GetElem(La, i, ai),GetElem(Lb, j, bj);
if(ai <= bj)
{
ListInsert(Lc, ++k, ai), ++i;
}
else
{
ListInsert(Lc, ++k, bj), ++j;
}
}
while(i <= La_len)
{
GetElem(La, i, ai);
ListInsert(Lc, ++k, ai), i++;
}
while(j <= Lb_len)
{
GetElem(Lb, j, bj);
ListInsert(Lc, ++k, bj), j++;
}
}
int main()
{
SqList La;
SqList Lb;
int j;
if(InitList(La) == 1) /* 创建空表La成功 */
{
printf("请输入La中的元素\n");
for(j = 1; j < 5; j++) /* 在表La中插入4个元素 */
{
int n;
scanf("%d", &n);
ListInsert(La, j, n);
}
}
if(InitList(Lb) == 1) /* 创建空表Lb成功 */
{
printf("请输入Lb中的元素\n");
for(j = 1; j < 8; j++) /* 在表Lb中插入个元素 */
{
int n;
scanf("%d", &n);
ListInsert(Lb, j, n);
}
}
SqList Lc;
MergeList(La, Lb, Lc);/* 合并La、Lb到Lc */
printf("Lc= "); /* 输出表Lc的内容 */
ListTraverse(Lc, Print);
return 0;
}
//例如LA=(3, 5, 8, 11),
// LB=(2, 6, 8, 9, 11, 15, 20),
//则 LC=(2, 3, 5, 6, 8, 8, 9, 11, 11, 15, 20)
//3 5 8 11
//2 6 8 9 11 15 20
对于顺序表的合并
void MergeList(SqList La, SqList Lb, SqList &Lc)
{
InitList(Lc);
int *pa, *pb;
pa = La.elem, pb = Lb.elem;
Lc.listsize = Lc.length = La.length + Lb.length;
int *pc;
pc = Lc.elem = (ElemType *)malloc(Lc.listsize * sizeof(ElemType));
if(!pc)
{
printf("存储分配失败!\n");//pc即Lc.elem
}
int *pa_last, *pb_last;
pa_last = La.elem + La.length - 1;//elem:存储空间基址
pb_last = Lb.elem + Lb.length - 1;
while((pa <= pa_last) && (pb <= pb_last))//归并
{
if(*pa <= *pb)
{
*pc++ = *pa++;
}
else
{
*pc++ = *pb++;
}
}
while(pa <= pa_last)//插入剩余La中元素
{
*pc++ = *pa++;
}
printf("%d %d\n", *pb, *pb_last);
while(pb <= pb_last)//插入剩余Lb中元素
{
*pc++ = *pb++;
printf("%d %d\n", *pb, *pc);
}
}