您的位置:首页 > 编程语言 > C语言/C++

动态构建顺序表,合并两个顺序表(C语言)

2017-07-23 20:08 387 查看
本程序实现将两个元素非递减排列的顺序表合并

以下程序用VC++6.0调试,确认正确无误。

#include<stdio.h>
#include<stdlib.h>

#define MaxSize 100
#define listincrement 10
#define begin_size 5    //表初始长度
typedef int ElemType;

typedef struct      //定义
{
ElemType *elem;
int length;
int listsize;
}SeqList;

void Init_SeqList(SeqList *L)  //创建空表
{
L->elem = (int*)malloc(MaxSize*sizeof(ElemType));
if(!L->elem) exit(0);
L->length = 0;
L->listsize = MaxSize;
}

void Put_SeqList(SeqList *L)  //打印表
{
ElemType *begin, *end;
begin = L->elem;
end   = &(L->elem[L->length-1]);
if(begin == end) exit(0);
for(; begin < end ; begin++) printf("%d->",*begin);
printf("%d\n",*end);
}

void Insert_SeqList(SeqList *L, int i, ElemType x)  //插入元素
{
ElemType *newbase, *insertptr, *p;
if(i < 1 || i > L->length+1) exit(0);
if(L->length >= L->listsize)
{
newbase=(ElemType*)realloc(L->elem, (L->listsize+listincrement)*sizeof(ElemType));
if(!newbase) exit(0);
L->elem = newbase;
L->listsize += listincrement;
}
insertptr = &(L->elem[i-1]);
p = &(L->elem[L->length-1]);
for(;p >= insertptr; p--)
*(p+1) = *p;
*insertptr = x;
L->length++ ;
}

/********以下为合并算法部分*******/

void Merge_SeqList(SeqList La, SeqList Lb, SeqList *Lc)  //已知La,Lb的元素非递减排列
{
ElemType *pa, *pb, *pc, *pa_last, *pb_last;
pa = La.elem; pb = Lb.elem;
Lc->length = La.length + Lb.length; Lc->listsize = Lc->length;
pc = (ElemType*)malloc(Lc->listsize*sizeof(ElemType));  //分配存储空间
if(!Lc->elem) exit(0);
Lc->elem = pc;   //存储地址
pa_last = La.elem + La.length-1;
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) *pc++ = *pa++;
while(pb <= pb_last) *pc++ = *pb++;
}

/**********以下为main函数*******/

int main() //实现创建两个顺序表,然后将两个表归并
{
SeqList La, Lb, Lc;
ElemType x;
int i;

Init_SeqList(&La);    //初始化
Init_SeqList(&Lb);
Init_SeqList(&Lc);

printf("请输入表La\n");    //创建La Lb
for(i = 1; i <= begin_size; i++)
{
scanf("%d",&x);
Insert_SeqList(&La,i,x);
}
printf("请输入表Lb\n");
for(i = 1; i <= begin_size; i++)
{
scanf("%d",&x);
Insert_SeqList(&Lb,i,x);
}

Merge_SeqList(La,Lb,&Lc);  //归并
Put_SeqList(&Lc);

return 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: