数据结构:两个顺序表合并算法

1.问题描述

        将a,b两个有序顺序表进行合并,放在c顺序表当中,并且要保证顺序表c仍然有序。

2.解题思路

        因为a,b两个顺序表是有序的,所有可以从前往后一起查找a,b当中最小的一个数值,放入到c中。

        如果遍历到最后,a遍历完了,b没有遍历完,就把b剩下的放入c中;反之,b遍a没有遍历完,就把a剩下的放入c中。

3.实现代码

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100

typedef int ElemType;

typedef struct {    //顺序表的结构
	ElemType *data;
	int length;
	int listsize;
}List;

int InitList(List *L)    //初始化顺序表
{
	L->data = (ElemType*)malloc(MAXSIZE*sizeof(ElemType));
	if(!(L->data))
		exit(0);
	L->length=0;
	L->listsize=MAXSIZE;
	return 1;
}

void CreatList(List *L)    //创建一个顺序表
{
	
	int i;
	printf("请输入测试的数据总数:\n");
	scanf("%d",&L->length);
	printf("请输入测试的数据:\n");
	for(i=0;i<L->length;i++)
		scanf("%d",&L->data[i]);
}

void Printf(List *L)    //打印顺序表中的值
{
	int i;
	if(L->length==0)
	{
		printf("顺序表为空!");
		return ;
	}
	else
		for(i=0;i<L->length;i++)
			printf("%d ",L->data[i]);
	printf("\n"); 
}

void MergeList(List *a,List *b,List *c){        //合并两个顺序表放入c中

	int i=0;
	int j=0;
	int k=0;
	int La_len=a->length;
	int Lb_len=b->length;
	c->length=a->length+b->length;
	while((i<La_len)&&(j<Lb_len)){
		if(a->data[i]<=b->data[j])    //如果a当前的值小于b
		{
			c->data[k]=a->data[i];    //c放入当前a的值
			i++;                    //a,c都往后移一位
			k++;
			
		}
		else{                        //如果a当前值大于等于b
			c->data[k]=b->data[j];       //c放入当前b的值
			j++;                          //b,c都往后移一位
			k++;

		}
	}
	while(i<La_len){            //如果b遍历完,a还没遍历完,把a剩余的全放入c中
		c->data[k]=a->data[i];
		  k++;
		  i++;
	}
	while(j<Lb_len){            //如果a遍历完,b还没遍历完,把b剩余的全放入c中
		c->data[k]=b->data[j];
		  k++;
		  j++;
	}
}
	
int main()
{
	List *L1;
	List  *L2;
	List  *L3;
	L1 = (List*) malloc(sizeof(List));
	L2 = (List*) malloc(sizeof(List));
	L3 = (List*) malloc(sizeof(List));
	InitList(L1);
	InitList(L2);
	CreatList(L1);
	CreatList(L2);
	printf("输入顺序表A:");  
	Printf(L1);
	printf("输入顺序表B:");
	Printf(L2);
	L3->data = (ElemType*)malloc(MAXSIZE*sizeof(ElemType));
	MergeList(L1,L2,L3);
	getchar();
	printf("输入顺序表C:");
	Printf(L3);
	getchar();
	return 0;
}

 

  • 30
    点赞
  • 199
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值