数据结构之链表合并算法

//链表合并算法(包括一些基本运算)
#include<iostream>
using namespace std;
typedef char datatype;						//结点数据类型,假设为char
typedef struct node * pointer;				//结点指针类型
struct node									//结点结构
{
	datatype data;
	pointer next;
};
typedef pointer lklist;						//单链表类型,即头指针类型


//链表初始化
lklist initlist()					//建立一个只有头结点的空表
{							
	pointer head;
	head=new node;
	head->next=NULL;
	return head;
}

//尾插法建表
lklist creat()						//有头结点,返回表头结点
{
	lklist head;
	pointer rear,s;
	char ch;
	head=new node;					//生成头结点
	rear=head;						//尾指针初值指向头结点
	cin>>ch;
	while(ch!='¥')					//读入结点值,并检测是否为检测符
	{
		s=new node;					//生成新结点
		s->data=ch;
		rear->next=s;
		rear=s;
		cin>>ch;
	}
	rear->next=NULL;
	return head;
}

//求表长
int length(lklist head)
{
	int j;
	pointer p;
	j=0;							//计算器
	p=head->next;					//从首结点开始算起
	while(p!=NULL)
	{
		j++;						//计数		
		p=p->next;					//到下一结点
	}
	return j;						//返回链表长度
}

//查找(按序号)
pointer find(lklist head,int i)
{
	int j;
	pointer p;
	if(i<0)	return NULL;			//位置非法,无此结点
	j=-1;							//计数器
	p=head;							//从头结点开始搜索
	while(p!=NULL)
	{
		j++;
		if(j==i)	break;			//找到,跳出循环
		p=p->next;					//未找到,继续下一结点
	}
	return p;
}

//定位(按值查找)
pointer locate(lklist head,datatype x)
{
	pointer p;
	p=head->next;					//从首结点开始搜索
	while(p!=NULL)
	{
		if(p->data==x)	break;		//找到,跳出循环
		p=p->next;					//下一结点
	}
	return p;
}

//插入算法
int insert(lklist head,datatype x,int i)
{
	pointer q,s;
	q=find(head,i-1);
	if(q==NULL)	{ cout<<"非法插入位置!\n"; return 0; }		//无第i-1点
	s=new node;							//生成新结点
	s->data=x;			
	s->next=q->next;					//新结点的后继是原第i个点
	q->next=s;							//原第i-1个点的后继是新点
	return 1;							//插入成功
}

//删除运算
int Delete(lklist head,int i)
{
	pointer p,q;
	q=find(head,i-1);
	if(q==NULL||q->next==NULL)
	{ cout<<"非法删除位置!\n"; return 0; }
	p=q->next;						//保存待删除结点的地址,用于释放空间
	q->next=p->next;				//修改前驱的指针
	delete p;						//释放已删除的结点的空间
	return 1;						//删除成功
}

//链表合并(就地进行)
lklist purge(lklist A,lklist B)
{
	lklist C;					//定义一个链表,用于存放合并后的所有结点
	pointer p,q,r;				//定义分别指向链表A,B,C链表的指针
	p=A->next;
	q=B->next;
	C=A; r=C;					//去A作为C的头结点
	while(p!=NULL&&q!=NULL)
	{
		if(p->data<=q->data)		
		{ r->next=p; r=p; p=p->next; }
		else 
		{ r->next=q; r=q; q=q->next; }
	}
	if(p!=NULL)	r->next=p;			//A表还有剩余结点
	else	r->next=q;
	delete B;						//释放B结点
	return C;
}

//输出链表所有结点
int display(lklist head)
{
	pointer p;
	p=head->next;
	while(p!=NULL)
	{
		cout<<p->data<<" ";
		p=p->next;
	}
	return 1;
}


//主函数只验证链表合并算法结果
int main()
{
	lklist A,B;
	A=initlist();					//初始化
	B=initlist();
	cout<<"哈喽,欢迎来到wwj数据结构学习乐园!!!!"<<endl;
	cout<<"请输入链表A的数据,以'
结束"<<endl;
	A=creat();						//建表
	cout<<"链表A的各结点的数据如下:"<<endl;
	display(A);
	cout<<endl;
	cout<<"请输入链表B的数据,以'
结束"<<endl;
	B=creat();
	cout<<"链表B的各结点的数据如下:"<<endl;
	display(B);
	cout<<endl;
	cout<<"合并后的链表各结点数据如下:"<<endl;
	display(purge(A,B));			//合并后链表数据
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小巫技术博客

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

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

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

打赏作者

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

抵扣说明:

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

余额充值