只设置尾指针而不设置头指针的讯循环链表的合并
注意和设置头指针的循环链表的区别。
在该算法中,专门定义了链表的尾指针,注意链表在定义,遍历,等操作上和折纸头指针的链表的区别。
#include<stdio.h>
#include<iostream>
using namespace std;
#define MAX 100
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
//定义尾指针
typedef struct{
LinkList rear;
}LinkListLast;
//初始化
int InitList(LinkListLast &L){
L.rear=new LNode;
L.rear->next=L.rear;
return 1;
}
//创建链表
int CreateList(LinkListLast &L,int e){
LinkList p;
p=new LNode;
p->data=e;
p->next=L.rear->next;
L.rear->next=p;
L.rear=p;
return 1;
}
//遍历
void TraveList(LinkListLast L){
struct LNode *p;
p=L.rear->next->next;
//int length=0;
while(p!=L.rear->next){
//p=p->next;
//++length
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
/*
设置尾指针的循环链表的合并只需要改变两个指向表尾的指针即可。
*/
void Combine(LinkListLast L1,LinkListLast L2){
struct LNode *p;
p=L2.rear->next->next;
L2.rear->next=L1.rear->next;
L1.rear->next=p;
}
int main(){
LinkListLast L;
LinkListLast B;
if(InitList(L)){
printf("链表初始化成功!\n");
}else{
printf("链表初始化失败!\n");
}
if(InitList(B)){
printf("链表B初始化成功!\n");
}else{
printf("链表B初始化失败!\n");
}
printf("请输入链表的元素个数:");
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
printf("请输入第%d个元素值:",i+1);
int e;
scanf("%d",&e);
CreateList(L,e);
}
TraveList(L);
printf("请输入链表B的元素个数:");
int n2;
scanf("%d",&n2);
for(int i=0;i<n2;i++){
printf("请输入第%d个元素的值:",i+1);
int e;
scanf("%d",&e);
CreateList(B,e);
}
TraveList(B);
Combine(L,B);
TraveList(B);
//由于只有尾指针,所以遍历合并后的链表要从第二个链表开始
}
1519

被折叠的 条评论
为什么被折叠?



