您的位置:首页 > 理论基础 > 数据结构算法

数据结构之链表合并算法

2011-12-19 22:16 369 查看
//链表合并算法(包括一些基本运算)
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: