程序设计: 设有线性表 LA=(3,5,8,11)和
LB=(2,6,8,9,11,15,20);
2.将LA归并到LB表中且仍保持有序(相同元素要保留)。–引自教材例2.2
#include<stdio.h>
#include<stdlib.h>
#define InitSize 10 //设置默认最大长度
typedef int Elemtype;
typedef struct{
Elemtype *date; //指示动态分配数组的指针
int MaxSize; //顺序表的最大容量
int length; //顺序表当前长度
}List;
void InitList(List &L) //对顺序表初始化
{
L.date=(Elemtype *)malloc(InitSize*sizeof(Elemtype));//申请一片连续的存储空间
L.length=0;
L.MaxSize=InitSize;
}
void IncreaseSize(List &L, int len) //增容操作(增加len的长度)
{
int *p=L.date;
L.date=(Elemtype *)malloc((L.MaxSize+len)*sizeof(Elemtype));
for(int i=0; i<L.length; i++)
{
L.date[i]=p[i]; //将数据复制到新的区域
}
L.MaxSize=L.MaxSize+len; //顺序表的最大长度增加len
free(p); //释放原来的内存空间
}
void CreateList(List &L) //创建线性表
{
int n; //定义顺序表数据元素个数的变量n
scanf("%d",&n);
if(n>L.MaxSize) //判断是否需要增容
{
IncreaseSize(L,InitSize); //给顺序表增加 InitSize长度
}
printf("\n请输入表的元素:\n");
Elemtype e;//设置临时输出变量
for(int i=0;i<n;i++)//将e中数据存储到表中
{
scanf("%d",&e);
L.date[i]=e;
L.length=i+1;
}
}
//表达1
void MergeList(List La,List Lb,List &Lc)//将La和Lb排序插入Lc
{
Elemtype* pa = La.date;
Elemtype* pb = Lb.date;
Lc.length = La.length + Lb.length;
Lc.date = (Elemtype*)malloc(Lc.length * sizeof(Elemtype));
Elemtype* pc = Lc.date;
Elemtype* pa_last = La.date + La.length - 1;
Elemtype* pb_last = Lb.date + Lb.length - 1;
while (pa <= pa_last && pb <= pb_last) { //归并
if (*pa <= *pb)*pc++ = *pa++;
else *pc++ = *pb++;
}
while (pa <= pa_last)*pc++ = *pa++;//插入La的剩余元素
while (pb <= pb_last)*pc++ = *pb++;//插入Lb的剩余元素
}
//表达2
void MergeList(List La,List Lb,List &Lc)//将La和Lb排序插入Lc
{
int i = 0,j = 0, k = 0;
Lc.length=La.length+Lb.length;//计算Lc表长;
Lc.date = (Elemtype*)malloc(Lc.length*sizeof(Elemtype));//初始化表Lc
while( i< La.length && j < Lb.length)//先将短的表全部插入到表Lc中
{
if(La.date[i] <= Lb.date[j])//顺序插入表Lc
{
Lc.date[k]=La.date[i];
i++;
k++;
}
else
{
Lc.date[k]=Lb.date[j];
j++;
k++;
}
}
//将未全部插入的表继续插入到 Lc中
while(i < La.length)//插入La的剩余元素
{
Lc.date[k]=La.date[i];
i++;
k++;
}
while(j < Lb.length)//插入Lb的剩余元素
{
Lc.date[k]=Lb.date[j];
j++;
k++;
}
}
int main()
{
List La,Lb,Lc; //声明La、Lb、Lc顺序表
InitList(La); //初始化顺序表 La
InitList(Lb); //初始化顺序表 Lb
printf("请输入线性表La的数据元素个数:");
CreateList(La); //创建线性表La
printf("\n表La为:");
for(int i=0;i<La.length;i++)//遍历输出表La
{
printf("%d ",La.date[i]);
}
printf("\n");
printf("请输入线性表Lb的数据元素个数:");
CreateList(Lb); //创建线性表Lb
printf("\n表Lb为:");
for(int i=0;i<Lb.length;i++)//遍历输出表Lb
{
printf("%d ",Lb.date[i]);
}
printf("\n");
printf("合并后的线性表Lc为:");
MergeList(La,Lb,Lc); //将表Lb与表La不相等的值插入La
for(int i=0;i<Lc.length;i++)//遍历输出合并后的表Lc
{
printf("%d ",Lc.date[i]);
}
printf("\n");
}