有两个循环链表A和B,想要将其合并为一个新的循环链表C,关键是对链表尾指针的指向进行调整,将B表的表尾与A表的表头相接;
代码示例:
#include<iostream>
#include<cstdio>
using namespace std;
#define MAX 100
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
//1.初始化
int InitList(LinkList &L){
L = new LNode;
L->next = L;
return 1;
}
//2.求长度
int ListLength(LinkList &L){
int length = 0;
struct LNode *p;
p=L->next;
while(p != L){
p = p->next;
length++;
}
return length;
}
//3.遍历链表
void TraverseList(LinkList &L){
struct LNode *p;
p=L->next;
while(p!=L){
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
//4.创建链表
void CreateList(LinkList &L,int n){
L=new LNode;
L->next = L;
cout<<"请输入链表的元素值 :"<<endl;
for(int i=n;i>0;i--){
cout<<"请输入第"<<i<<"个元素值 :";
struct LNode *p;
p = new LNode;
cin>>p->data;
p->next = L->next;
L->next = p;
}
}
//5.合并两个循环链表
void CombineList(LinkList L1,LinkList L2){
struct LNode *p1,*p2;
p1 = L1->next;
p2 = L2->next;
struct LNode *s1,*s2;
while( p1 != L1){
if(p1->next == L1){
s1 = p1; //s1指向表L1的最后一个结点
break;
}
p1=p1->next;
}
while( p2 != L2){
if(p2->next == L2){
s2 = p2; //s2指向表L2的最后一个结点
break;
}
p2=p2->next; //指针后移
}
s1->next = L2->next;//合并,在找到两个链表的表尾后,最关键的正确的指定指针的指向
s2->next = L1;
}
int main(){
LinkList A;
LinkList B;
int lena=0,lenb=0; //链表的长度
if(InitList(A)){
cout<<"初始化链表A成功"<<endl;
}else{
cout<<"初始化链表A失败"<<endl;
}
if(InitList(B)){
cout<<"初始化链表B成功"<<endl;
}else{
cout<<"初始化链表B失败"<<endl;
}
cout<<"请输入链表A的长度:";
cin>>lena;
CreateList(A,lena);
cout<<"遍历链表A:"<<endl;
TraverseList(A);
cout<<"请输入链表B的长度:";
cin>>lenb;
CreateList(B,lenb);
cout<<"遍历链表B:"<<endl;
TraverseList(B);
CombineList(A,B);
cout<<"合并后的结果为:"<<endl;
TraverseList(A);
cout<<"合并后的长度是:"<<ListLength(A)<<endl;
return 0;
}
参考教程链接:https://blog.csdn.net/sungaochao/article/details/50755746