程序设计: 设有线性表 LA=(3,5,8,11)和 LB=(2,6,8,9,11,15,20); 2.将LA归并到LB表中且仍保持有序(相同元素要保留)。--引自教材例2.2

该文章展示了一个C语言程序,用于实现两个已排序的线性表LA和LB的归并,保持结果仍然有序。程序首先定义了顺序表的数据结构,然后通过初始化、增容和创建线性表的函数,接着使用两种不同的方法实现归并操作。最后,程序在主函数中读取并创建线性表,然后合并并打印结果。
摘要由CSDN通过智能技术生成

程序设计: 设有线性表 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");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值