//链表合并算法(包括一些基本运算)
#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;
}
数据结构之链表合并算法
最新推荐文章于 2022-03-07 17:47:57 发布