给出两个按非递减顺序排列的线性表,将它们合并后存放在另一个顺序表中
合并后的顺序表同样非递减
#include<stdio.h>
#include<stdlib.h>
#define list_init_size 100 //在这里设置线性表长度可以方便以后的修改
#define listincrement 10
#define ok 1
#define overflow -1
#define error 0
typedef int status; //自定义status为int型,以后看到status等价于int
//线性表的动态分配线性存储结构
typedef struct {
int *elem; //存储空间基址
int length; //当前长度
int listsize; //当前分配的存储容量
}sqlist;
//构造一个空的线性表L
status initlist_sq(sqlist &l)
{
l.elem=(int *)malloc(list_init_size*sizeof(int)); //
if(!l.elem)
{
printf("线性表构造失败!\n");
exit(overflow); //存储分配失败
}
l.length=0;
l.listsize=list_init_size;
printf("线性表构造成功!\n");
return ok;
}
//插入元素
status listinsert_sq(sqlist &l,int i,int e) //
{
int *newbase,*p,*q; //临时变量
if((i<1)||(i>l.length+1))
{
printf("您输入的数据有误,请重新输入!\n");
return error; //i值非法
}
if(l.length>=l.listsize)
{
newbase = (int *)realloc(l.elem,(l.listsize+listincrement)*sizeof(int));
if(!newbase) exit(overflow);
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;
}
void mergelist(sqlist la,sqlist lb,sqlist &lc)\
{
//已知顺序线性表la和lb的元素按非递减排列
//归并La和Lb得到新的顺序表lc,lc也非递减
int *pa,*pb,*pc,*pa_last,*pb_last;
pa=la.elem; //pa指向顺序表la的首元素
pb=lb.elem; //pb指向顺序表lb的首元素
lc.listsize=lc.length=la.length+lb.length;
//lc的长度设置为la与lb的长度之和
pc=lc.elem=(int *)malloc(lc.listsize*sizeof(int));
//给lc分配一段存储空间,pc指向顺序表lc的首地址
if(!lc.elem)
exit(overflow); //内存分配失败
pa_last=la.elem+la.length-1; //记录pa的终点
pb_last=lb.elem+lb.length-1; //记录pb的终点
while(pa<=pa_last&&pb<=pb_last)
{
if(*pa<=*pb) //由于是非递增排序,所以优先插入数值较小的元素
*pc++=*pa++; //pa指向的值插入pc指向的地址,两个指针同时加一
else
*pc++=*pb++;
}
//执行完上面的语句后,较短的顺序表中的元素全部插入C中
//接下来插入较长的顺序表中剩余的元素
//由于不知道谁更长,所以两个都写下
while(pa<=pa_last)
*pc++=*pa++;
while(pb<=pb_last)
*pc++=*pb++;
}
int main()
{
int c,b;
sqlist la,lb,lc;
//初始化顺序表la,lb,lc
initlist_sq(la);
initlist_sq(lb);
initlist_sq(lc);
//给la赋值
for(int i=1;i<20;i++)
listinsert_sq(la,i,i-1);
//给lb赋值
for(int i=1;i<20;i++)
listinsert_sq(lb,i,20*i-1);
//合并la,lb,lc
mergelist(la,lb,lc);
//输出合并后的lc中所有元素
for(int i=0;i<lc.length;i++)
printf("%d ",lc.elem[i]);
printf("\n");
return 0;
}