数据结构:有序表的合并---顺序存储结构----用C语言表述

编译器:visual studio 2022

1.源码

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
#define Elemtype int 

typedef struct
{
	Elemtype* elem;
	int length;
}Sqlist,*link;


//初始化-建空间
void Initlist(link lalb)            
{

	lalb->elem = (Elemtype*)malloc(sizeof(Elemtype) * MAX);
	if (lalb)
	{
		printf("初始化成功\n");
		lalb->length = 0;
	}
	else
	{
		printf("初始化失败\n");
	}
}


//数组赋值
void Creatlist(link lalb,int len12)   
{
	int n = 0;
	for (n=1;n<=len12;n++)
	{
		printf("请输入表的第 %d 个元素\n",n);
		int m;
		scanf("%d",&m);
		lalb->elem[n - 1] = m;
		lalb->length += 1;
	}                     //la:     3  5  7  11
}						//  lb:     2  3  6



//打印表
void print(link lalb, int len12)
{
	int n;
	for (n = 1; n <= len12; n++)
	{
		printf("%d   ", lalb->elem[n - 1]);
	}
	printf("\n");
}


// la 和 lb 合并成 lc
void unin(link la, link lb, link lc)
{
	//逐个对比la,lb中的元素
	//小的元素放进lc中
	//最后,让没有遍历完的la/lb  的元素放到lc中
	Elemtype* pa = la->elem;       //首元素地址
	Elemtype* pb = lb->elem;
	Elemtype* pc = lc->elem;
	//尾元数地址
	Elemtype* ppa = la->elem + la->length - 1;            
	Elemtype* ppb = lb->elem + lb->length - 1;          
	Elemtype* ppc = lc->elem + lc->length - 1;	

	while (pa <= ppa && pb <= ppb)
	{
		if (*pa >= *pb)
		{
			*pc++ = *pb++;
		}
		//else if     注意写法 else空格if		
		else          //else if(*pa < *pc)
		{
			*pc++ = *pa++;
		}
	}
	while (pa <= ppa)    // pa的元素 没有处理完
	{
		*pc++ = *pa++;
	}
	while (pb <= ppb)   // pb的元素没有处理完
	{
		*pc++ = *pb++;
	}
}


int main()
{
	//创建表la,lb,lc
	//link la = NULL;
	//link lb = NULL;
	//link lc = NULL;
	link la = (Sqlist*)malloc(sizeof(Sqlist));
	link lb = (Sqlist*)malloc(sizeof(Sqlist));
	link lc = (Sqlist*)malloc(sizeof(Sqlist));


	//link la;             //link只是la 的类型 。   la没有初始化

	//初始化-建空间
	printf("la ");
	Initlist(la);
	printf("lb ");
	Initlist(lb);
	printf("lc ");
	Initlist(lc);


	//线表的长度设定                     ---length的真正变化要在数组赋值中实现
	printf("请输入线表la的长度\n");     // 4
	int len1;
	scanf("%d", &len1);
	printf("请输入线表lb的长度\n");   //  3
	int len2;
	scanf("%d", &len2);
	int len3 = len1 + len2;


	//数组赋值 + length值变化
	printf("请输入la表中元素\n");
	Creatlist(la,len1);
	printf("请输入lb表中元素\n");
	Creatlist(lb,len2);

	//打印表
	printf("表 la 中的内容为:   ");
	print(la,len1);
	printf("表 lb 中的内容为:   ");
	print(lb,len2);

	//合并 成 lc
	unin(la, lb, lc,len3);

	//打印lc
	printf("合并后 lc 的内容为: ");
	print(lc,len3);
}

2.效果图

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值