2.2线性表LA和LB按照非递减序列排序,合并为LC,LC仍为非递减序列2

本文介绍了一种线性表归并算法,该算法将两个非递减排列的线性表la和lb合并成一个新的非递减排列的线性表lc。文章提供了两种实现方式,一种使用指针进行操作,另一种则是非指针程序实现。两种方法均能有效地完成线性表的归并,同时确保了结果表lc的非递减性质。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需要注意的是
*L.elem=L.elem[0]
*(L.elem+i)=L.elem[i]

指针程序(线性表从L.elem[0]开始):

//通过指针比较合并la、lb为lc,使得lc仍为非递减序列
#include<stdio.h>
#include<malloc.h> 
#include<iostream>
using namespace std;
#define OVERFLOW -2
#define OK 1
#define LIST_INIT_SIZE 20
#define LISTINCREMENT 10
typedef struct{
	int *elem;
	int length;
	int listsize;
}SqList;
SqList la,lb,lc;
int InitList(SqList &l)
{
	l.elem=(int*)malloc(LIST_INIT_SIZE*sizeof(int));
	if(!l.elem) exit(OVERFLOW);
	l.length=0;
	l.listsize=LIST_INIT_SIZE;
	return OK;
}
void MergeList(SqList la,SqList lb,SqList &lc)
{
	int *qa,*qb,*qc;
	int *qa_last,*qb_last;
	qa=la.elem;
	qb=lb.elem;
	lc.length=lc.listsize=la.length+lb.length;
	lc.elem=qc=(int*)malloc(lc.listsize*sizeof(int));
	if(!lc.elem) 
		exit(OVERFLOW);
	qa_last=la.elem+la.length-1;
	qb_last=lb.elem+lb.length-1;
	while(qa<=qa_last && qb<=qb_last)
	{
		if(*qa <= *qb) 
			*qc++ = *qa++;
		else 
			*qc++ = *qb++;
	}
	while(qa <= qa_last) 
		*qc++ = *qa++;
	while(qb <= qb_last) 
		*qc++ = *qb++;
}
int main()
{
	int i;
	InitList(la);
	InitList(lb);
	cout<<"请依次输入la、lb的表长:"<<endl;
	cin>>la.length;cin>>lb.length;
	cout<<"请依次输入la、lb的元素:"<<endl;
	for(i=0;i<la.length;i++)
		cin>>la.elem[i];
	for(i=0;i<lb.length;i++)
		cin>>lb.elem[i];
	MergeList(la,lb,lc);
	cout<<"la、lb合并为lc的结果为:"<<endl;
	for(i=0;i<lc.length;i++)
		cout<<lc.elem[i]<<" ";
}
//la: 3,5,8,11
//lb: 2,6,8,9,11,15,20
//lc: 2,3,5,6,8,8,9,11,11,15,20 

非指针程序:

//已知线性表la、lb中的数据元素按值非递减有序排列,要求la、lb
//归并为一个总表lc,lc仍为非递减排序
#include<stdio.h>
#include<iostream>
using namespace std;
#define OVERFLOW -2
#define OK 1
#define ERROR 0
#define LIST_INIT_SIZE 20//线性表存储空间的初始量 
#define LISTINCREMENT 10//线性表存储空间的增量 
typedef struct{
	int *elem;//储存空间的基地址 
	int length;//当前长度 
	int listsize;//当前分配的储存容量 
}SqList;
SqList la,lb,lc;
int InitList(SqList &l)
{
	l.elem=(int*)malloc(LIST_INIT_SIZE*sizeof(int));
	if(!l.elem) exit(OVERFLOW);
	l.length=0;
	l.listsize=LIST_INIT_SIZE;
	return OK;
}
void MergeList(SqList la,SqList lb,SqList &lc)
{
	int i=1,j=1,k=0;
	InitList(lc);
	while((i<=la.length)&&(j<=lb.length))
	{
		if(la.elem[i]<=lb.elem[j]) 
		{
			lc.elem[++k]=la.elem[i];
			i++;
		}
		else
		{
			lc.elem[++k]=lb.elem[j];
			j++;
		}
		lc.length++;
	}
	while(i<=la.length)
	{
		lc.elem[++k]=la.elem[i];
		i++;
		lc.length++;
	}
	while(j<=lb.length)
	{
		lc.elem[++k]=lb.elem[j];
		j++;
		lc.length++;
	}
}
int main()
{
	int i;
	int *base;
	InitList(la);InitList(lb);
	cout<<"请输入la的长度:"<<endl;
	cin>>la.length;
	if(la.length>=LIST_INIT_SIZE)
	{
		base=(int*)realloc(la.elem,(la.listsize+LISTINCREMENT)*sizeof(int));
		if(!base) exit(OVERFLOW);
		la.elem=base;
		la.listsize+=LISTINCREMENT;
	}
	cout<<"请输入lb的长度:"<<endl;
	cin>>lb.length;
	if(lb.length>=LIST_INIT_SIZE)
	{
		base=(int*)realloc(lb.elem,(lb.listsize+LISTINCREMENT)*sizeof(int));
		if(!base) exit(OVERFLOW);
		lb.elem=base;
		lb.listsize+=LISTINCREMENT;
	}
	cout<<"请依次输入la的元素:"<<endl;
	for(i=1;i<=la.length;i++)
		cin>>la.elem[i];
	cout<<"请依次输入lb的元素:"<<endl;
	for(i=1;i<=lb.length;i++)
		cin>>lb.elem[i]; 
	MergeList(la,lb,lc);
	cout<<"la、lb归并后lc中的元素为:"<<endl;
	for(i=1;i<=lc.length;i++)
		cout<<lc.elem[i]<<" ";
}
//la: 3,5,8,11
//lb: 2,6,8,9,11,15,20
//lc: 2,3,5,6,8,8,9,11,11,15,20 

运行结果:
在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值