我是靠谱客的博主 着急书包,最近开发中收集的这篇文章主要介绍数据结构之链表合并算法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

//链表合并算法(包括一些基本运算)
#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;
}

最后

以上就是着急书包为你收集整理的数据结构之链表合并算法的全部内容,希望文章能够帮你解决数据结构之链表合并算法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部