//线性表的操作 实现 C = A U B
//A = {1,2,3,4} B = {2,4,6,8} 则 C = {1,2,2,3,4,4,5,6,8}
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define LIST_INIT_SIZE 10
#define LISTINCREMENT 2
typedef struct SqList
{
int *elem;
int length;
int listsize;
}SqList;
bool InitList(SqList *L); //创建空表
bool ListInsert(SqList *L,int pos,int e); //在第pos个位置插入e
bool ListTraverse(SqList *L); //输出线性表各元素
void MergeList(SqList La,SqList Lb,SqList *Lc);
int main()
{
SqList La, Lb, Lc;
int j;
InitList(&La); //创建空表La
for(j = 1; j <= 5; j++)
ListInsert(&La,j,j); //插入元素
printf("La = ");
ListTraverse(&La);
InitList(&Lb);
for(j = 1; j <= 5; j++)
ListInsert(&Lb,j,2*j);
printf("Lb = ");
ListTraverse(&Lb);
MergeList(La,Lb,&Lc);
printf("Lc = ");
ListTraverse(&Lc);
return 0;
}
bool InitList(SqList *L) //创建空表
{
L->elem = (int *)malloc(LIST_INIT_SIZE*sizeof(int));
if(L->elem == NULL)
{
printf("内存分配失败 程序终止!\n");
exit(-1);
}
L->length = 0;
L->listsize = LIST_INIT_SIZE;
return 0;
}
bool ListInsert(SqList *L,int pos,int e) //在第pos个位置插入e
{
int *newbase, *p, *q;
if(pos < 1 || pos > L->listsize) //pos 不合法
return false;
if(L->length >= L->listsize)
{
newbase = (int *)realloc(L->elem,(L->listsize + LISTINCREMENT)*sizeof(int));
if(newbase == NULL)
{
printf("内存分配失败 程序终止!\n");
exit(-1);
}
L->elem = newbase;
L->listsize += LISTINCREMENT;
}
q = L->elem + pos - 1; //p 指向擦人位置
for(p = L->elem + L->listsize - 1; p >= q; p--) //插入位置及之后的元素后移
*(p+1) = *p;
*q = e;
L->length++; //表长增1
return true;
}
bool ListTraverse(SqList *L) //输出线性表各元素
{
int *p;
int i;
p = L->elem;
for(i = 1; i < L->length; i++)
printf("%d ",*p++);
printf("\n");
return true;
}
void MergeList(SqList La,SqList Lb,SqList *Lc)
{
//已知顺序线性表La和Lb的元素按值 非递减排序
//归并La和Lb得到新的顺序线性表Lc,Lc的元素也按值非递减排列
int *pa, *pa_last, *pb, *pb_last, *pc;
pa = La.elem;
pb = Lb.elem;
Lc->listsize = Lc->length = La.length + Lb.length;
pc = Lc->elem = (int *)malloc(Lc->listsize*sizeof(int));
if(Lc->elem == NULL)
{
printf("内存分配失败 程序终止!\n");
exit(-1);
}
pa_last = La.elem + La.length - 1;
pb_last = Lb.elem + Lb.length - 1;
while(pa <= pa_last && pb <= pb_last) //表La和表Lb均为非空
{
if(*pa <= *pb)
*pc++ = *pa++;
else
*pc++ = *pb++;
}
while(pa <= pa_last)
*pc++ = *pa++;
while(pb <= pb_last)
*pc++ = *pb++;
}
程序执行结果: