线性表、链表的合并(代码)

#include<bits/stdc++.h>
using namespace std;
//线性表的合并,有序表的合并(无重复元素)(有重复元素) 
#define Maxsize 100
//顺序表的合并--------------------------------------------- 
typedef struct{
	int *elem;
	int length;
}Sqlist;
//初始化 
void Init(Sqlist &l){
	 //顺序表分配空间
	l.elem = new int[Maxsize];
	if(!l.elem) exit(0);
	l.length = 0; 
}
//创建
void Creat(Sqlist &l){
	int num;
	cin>>num;//数目
	l.length = num;
	for(int i=0;i<num;i++){
		cin>>l.elem[i];
	} 
} 
//无序表合并     la=(7,5,3,11);lb=(2,6,3),合并-->lc=(7,5,3,11,2,6);
Sqlist Combine(Sqlist &la,Sqlist &lb){
	//从lb重一次取出元素在la中查询,若不存在,就插入到la表尾
	for(int i=0;i<lb.length;i++){
		for(int j=0;j<la.length;j++){
			if(la.elem[j]==lb.elem[i]){
				//有相同元素,跳过
				continue; 
			}
			else if(j==la.length-1){
				//没找到,插入表尾,表长加一 
				la.elem[j+1] = lb.elem[i];
				la.length++; 
			}
		}
	}
	return la; 
}
//有序表的合并
Sqlist Combine2(Sqlist &la,Sqlist &lb){
	//新建顺序表lc,将la,lb中较小元素插入到lc 
	Sqlist lc;
	Init(lc);
	int i=0,j=0,k=0;
	while(la.length==i&&lb.length==j){//两个都到头就结束 
		//两个都还没完成 
		if(i<la.length && j<lb.length){
			//小的插入到lc,计数器加一 
			if(la.elem[i]<=lb.elem[j]){
				lc.elem[k] = la.elem[i];
				k++;
				i++;
			}
			else{
				lc.elem[k] = lb.elem[j];
				k++;
				j++;
			}
		}
		//a完成了 
		else if(la.length==i){
			lc.elem[k] = lb.elem[j];
			k++;
			j++;
		}
		//b完成了 
		else if(lb.length==j){
			lc.elem[k] = la.elem[i];
			k++;
			i++;
		}
	}
	return lc; 
}

//链表的合并-------------------------------------------------------------
typedef struct Lnode{
	int data;
	Lnode *next;
}Lnode,*Linklist;
//初始化
void Init(Linklist &l){
	l = new Lnode;//建立空结点
	l->next = NULL; //指向空 
}
//创建
void Creat(Linklist &l){
	int num;
	cin>>num;//数目
	while(num--){
		Linklist p = new Lnode;//建立新结点
		cin>>p->data;
		l->next = p;//插入到上一结点之后 
		p->next = NULL; 
	} 
} 
//有序表合并(有重复)
Linklist Combine(Linklist &la,Linklist &lb){
	//依次从a,b中找到较小的点插入到c后面 
	//三个指针a,b,c指向la,lb的首元结点,la的头结点 
	Linklist a = la->next;
	Linklist b = lb->next; 
	Linklist c = la;
	while(a&&b){//a,b指向结点都不为空 
		if(a->data <= b->data){
			c->next = a;//c的指针域指向a
			c = a;//c指向下一结点 
			a = a->next;//a指向下一结点 
		}
		else{
			c->next = b;
			c = b;
			b = b->next;
		}
	} 
	if(!a){
		c->next = b;//剩余的插入到c之后 
	}
	else{
		c->next = a;
	} 
	delete lb;//释放lb空间 
	 return la; 
} 

//有序表合并(无重复)-->单独考虑“==” 
Linklist Combine2(Linklist &la,Linklist &lb){
	//依次从a,b中找到较小的点插入到c后面 
	//三个指针a,b,c指向la,lb的首元结点,la的头结点 
	Linklist a = la->next;
	Linklist b = lb->next; 
	Linklist c = la;
	while(a&&b){//a,b指向结点都不为空 
		if(a->data == b->data){
			c->next =  a;//c的指针域指向a
			c = a; //c指向下一结点 
			a = a->next;//a指向下一结点 
			b = b->next;//b跳过与a相同的结点 
		}
		else if(a->data < b->data){
			c->next = a;//c的指针域指向a
			c = a;//c指向下一结点 
			a = a->next;//a指向下一结点 
		}
		else{
			c->next = b;
			c = b;
			b = b->next;
		}
	} 
	if(!a){
		c->next = b;//剩余的插入到c之后 
	}
	else{
		c->next = a;
	} 
	delete lb;//释放lb空间 
	 return la; 
} 
 
int main(){
	//编辑主函数 
	return 0;
} 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值