本博文源于王卓老师的数据结构,书中含尾指针的循环链表给出合并,在这里不仅包含尾指针循环链表基础内容实现还有链表合并的例题也一并完成,喜欢的读者可以收藏,继续加油。
文章目录
1、不带头结点的尾指针循环链表存储结构
2、尾插法创建数据单链表
这里的核心点就是不带头结点,也就是首结点插入数据,其次就是尾插法。
/*
* 输入:空的循环单链表rear,数据A[],数据个数n
* 输出:新创建循环单链表rear,表中各元素次序相同
* */
void CreateCListR(CircListRear &rear,ElementType A[],int n){
CircleNode *s;
rear = new CircleNode;
rear->next = rear;
rear->data = A[0];
for(int i =1;i<n;i++){
s = new CircleNode;
s->data = A[i];
s->next = rear->next;
rear->next = s;
rear = s;
}
}
3、打印单循环链表
与普通单链表打印没啥区别,主要是p->next !=rear,其次尾指针存数据,最后打印尾指针数据
/*
* 输入: 循环单链表尾指针 rear
* 输出: 从首元素开始顺序输出中所有结点
* */
void PrintCListR(CircListRear &rear){
if(rear == NULL) return ;
for(CircleNode* p = rear->next;p!=rear;p=p->next ){
cout << p->data << " ";
}
cout << rear->data << endl;
}
4、插入循环单链表
将元素插入首元结点前,也就是尾指针之后。分为空和不空,空的话插入节点就是首元结点,非空直接普通插入就行了。
/*功能:将包含给定值x的新结点插入尾指针为rear的不带头结点的循环单链表的首元结点前
* 输入: 循环单链表表尾指针rear,插入值x
* 输出: 插入后的循环单链表rear
* */
void InsertCH(CircListRear &rear,ElementType x){
CircleNode * s= new CircleNode;
s->data = x;
if(rear == NULL) {
rear = s;
rear->next = s;
}else{
s->next = rear->next;
rear->next = s;
}
}
5、合并
直接用书上的那段代码进行合并
int MergeL(CircListRear &A,CircListRear &B){
if(!A && !B) return ERROR;
CircListRear p = B->next;
B->next = A->next;
A->next = p;
return OK;
}
测试效果
完整源码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define MAXSIZE 10
typedef int ElementType;
typedef int Status;
using namespace std;
typedef struct CircleNode{
ElementType data; //结点数据
struct CircleNode* next; //后继点指针
}CircleNode,*CircList,*CircListRear;
//带头指针和头结点的循环单链表的基本运算
/*
* 输入:空的循环单链表rear,数据A[],数据个数n
* 输出:新创建循环单链表rear,表中各元素次序相同
* */
void CreateCListR(CircListRear &rear,ElementType A[],int n){
CircleNode *s;
rear = new CircleNode;
rear->next = rear;
rear->data = A[0];
for(int i =1;i<n;i++){
s = new CircleNode;
s->data = A[i];
s->next = rear->next;
rear->next = s;
rear = s;
}
}
/*
* 输入: 循环单链表尾指针 rear
* 输出: 从首元素开始顺序输出中所有结点
* */
void PrintCListR(CircListRear &rear){
if(rear == NULL) return ;
for(CircleNode* p = rear->next;p!=rear;p=p->next ){
cout << p->data << " ";
}
cout << rear->data << endl;
}
/*功能:将包含给定值x的新结点插入尾指针为rear的不带头结点的循环单链表的首元结点前
* 输入: 循环单链表表尾指针rear,插入值x
* 输出: 插入后的循环单链表rear
* */
void InsertCH(CircListRear &rear,ElementType x){
CircleNode * s= new CircleNode;
s->data = x;
if(rear == NULL) {
rear = s;
rear->next = s;
}else{
s->next = rear->next;
rear->next = s;
}
}
int MergeL(CircListRear &A,CircListRear &B){
if(!A && !B) return ERROR;
CircListRear p = B->next;
B->next = A->next;
A->next = p;
return OK;
}
int main(){
CircListRear L;//创建不带头结点仅含尾指针的单链表
int A[5]={1,2,3,4,5};//插入数据
CreateCListR(L,A,5);
cout << "created L:" << endl;
PrintCListR(L);//打印单循环单链表
InsertCH(L,18);//插入头结点元素
cout << "iniserted 18 L:" << endl;
PrintCListR(L);//打印
//演示合并循环链表,书中内容
CircListRear L2;
int B[5] ={7,8,9,10,11};
CreateCListR(L2,B,5);
MergeL(L,L2);
cout << "Merged L:" << endl;
PrintCListR(L);
return 0;
}