合并线性表(链式存储)

//合并线性表(链式存储)
#include <iostream>
using namespace std;
#include <malloc.h>

typedef int Elemtype;

typedef struct Node
{
	Elemtype data;
	struct Node * next;
}Node,*Ptr;  //Ptr 一级指针

typedef Ptr * SqListPtr;	//SqListPtr 二级指针 

typedef enum Status 
{
	success,fail
}Status;



//***********************************************************************************************
//调试菜单 
void menu (); 
//线性表的初始化
Status List_Init(SqListPtr L);
//获得线性表的长度
int List_Size(SqListPtr L);
//录入
Status List_Input(SqListPtr L,Elemtype elem);
//插入
Status List_Insert(SqListPtr L,int pos,Elemtype elem);
//定位
Status Locate (SqListPtr L,Elemtype elem,int *pos);
//提取 
Status Retrival(SqListPtr L,int pos,Elemtype * elem);
//遍历
void List_Printf(SqListPtr L);
//**************************************************************************************************

//合并两个线性表
Status List_Union(SqListPtr L1,SqListPtr L2);

int main ()
{
	
	Ptr hander_1 = NULL;
	Ptr hander_2 = NULL;
	SqListPtr L1 = &hander_1;
	SqListPtr L2 = &hander_2;
	if(List_Init(L1)!=success || List_Init(L2)!=success)
		{
			puts("初始化失败");
			exit(1); 
		}
	List_Input(L1,1);
	List_Input(L2,3);
	if(List_Union(L1,L2) == success)
	{
		puts("合并线性表成功"); 
		List_Printf(L2);	
	}
	else
	{
		puts("合并线性表失败");
	}
	
	
	/*******************************************************************************************
	
	//调试函数
	 
	char Copy;
	Elemtype elem;
	int pos;
	Ptr hander = NULL;
	SqListPtr L = &hander;
	while(1)
	{
		menu ();
		cin>>Copy;
		system("cls");
		switch(Copy)
		{
			case 'A':
			case 'a':
				{
					if(List_Init(L) == success)
						puts("初始化成功");
					else
						puts("初始化失败"); 
					break;
				}
			case 'B':
			case 'b':
				{
					cout<<"线性表的长度为:"<<List_Size(L)<<endl; 
					break;
				}
			case 'C':
			case 'c':
				{
					puts("请输入 -- 数据 -- 位置");
					cin>>elem>>pos; 
					if(List_Insert(L,pos,elem) == success)
						puts("插入成功");
					else
						puts("插入失败"); 
					break;	
				}
			case 'D':
			case 'd':
				{
					puts("请输入数据"); 
					cin>>elem;
					if(List_Input(L,elem) == success)
						puts("录入成功");
					else
						puts("录入失败"); 
					break;
					
				}
			case 'E':
			case 'e':
				{
					List_Printf(L);
					break;
				}
			case 'F':
			case 'f':
				{
					puts("请输入你要定位的数据");
					cin>>elem; 
				if(Locate (L,elem,&pos) == success)
					cout<<elem<<"是第"<<pos<<"个"<<endl;
				else
					cout<<"该数据不存在"<<endl; 
					break;
				}
			case 'G':
			case 'g':
				{
					puts("请输入你要提取数据的序号");
					cin>>pos; 
					if(Retrival(L,pos,&elem) == success)
						cout<<"该数据为:"<<elem<<endl;
					else
						cout<<"不存在"<<endl;
					break;
				}	
		}
	}
	/*******************************************************************************/
	return  0;
}

//合并两个线性表
Status List_Union(SqListPtr L1,SqListPtr L2)
{
	int Length_1 = List_Size(L1);
	Elemtype elem;
	int pos;
	Status s = success;
	for(int i = 0; i<Length_1; i++)
	{
		Retrival(L1,i+1,&elem);
		s = Locate (L2,elem,&pos);
		if(s != success)
		{
			s = List_Insert(L2,2,elem);
			if(s == fail)
			{
				s = fail;
				return s;
			}
		}	
	}
	return s;
} 


//************************************************************************************
//调试菜单 
void menu ()
{
	puts("A 初始化线性表");
	puts("B 获得线性表的长度");
	puts("C 插入");
	puts("D 录入");
	puts("E 遍历");
	puts("F 定位");
	puts("G 提取");
}

//线性表的初始化
Status List_Init(SqListPtr L)
{
	Status s = fail;
	if((*L)==NULL)
	{
		Ptr p = (Ptr)malloc(sizeof(Node));
		if(p == NULL)
		 	return s;
		(*L) = p;
		(*L)->next = NULL;
		s = success;
	}
	return s;	
}

//获得线性表的长度
int List_Size(SqListPtr L)
{
	int i = 0;
	Ptr p = (*L)->next;
	while(p)
	{
		p = p->next;
		i++;
	}
	return i;
}

//录入
Status List_Input(SqListPtr L,Elemtype elem)
{
	Status s = fail;
	Ptr q = (Ptr)malloc(sizeof(Node));
	if(q == NULL)
		return s;
	q->data = elem;
	q->next = NULL;
	Ptr p = (*L)->next; 
	if(p == NULL)
	{
		(*L)->next = q;
		s = success;
		return s;
	}
	while(p->next)
	{
		p = p->next;
	}
	p->next = q;
	s = success;
	return s;
}

//插入
Status List_Insert(SqListPtr L,int pos,Elemtype elem)
{
	Status s = fail;
	Ptr p = (*L)->next;
	int i =  1;
	while(p && i<pos-1) //适用条件 : 线性表不为空 
	{
		p = p->next;
		i++;
	}
	if(p && i==pos-1)
	{
		Ptr q = (Ptr)malloc(sizeof(Node));
		if(q == NULL)
			return s;
		q->next = p->next;
		p->next = q;
		q->data = elem;
		s = success;
	}
	return s;
}

//定位
Status Locate (SqListPtr L,Elemtype elem,int *pos)
{
	Status  s = fail;
	int i = 1;
	Ptr p = (*L)->next;
	while(p)
	{
		if(p->data == elem)
			break;
		p = p->next;
		i++;
	}
	if(p && p->data==elem)
	{
		*pos = i;
		s = success;
	}
	return s;
}

//提取 
Status Retrival(SqListPtr L,int pos,Elemtype * elem)
{
	Status s = fail;
	Ptr p = (*L)->next;
	int i = 1;
	while( p && i<pos)
	{
		p = p->next;
		i++;
	}
	if(p && i == pos)
	{
		*elem = p->data;
		s = success;
	}
	return s;
}

//遍历
void List_Printf(SqListPtr L)
{
	Ptr p = (*L)->next;
	int i = 0;
	while(p)
	{
		cout<<p->data<<"   "; 
		if(i % 3 == 0)
			cout<<endl;
		p = p->next;
	}
}
//************************************************************************************

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只学弱狗!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值