このブログ投稿は、Wang Zhuo氏のデータ構造から派生したもので、本のテールポインター付きの循環リンクリストがマージされています。ここでは、テールポインター付きの循環リンクリストの基本的なコンテンツの実装だけでなく、リンクリストのマージの例もあります。それが好きな読者はそれを集めることができます、続けてください。
記事ディレクトリ
1.ヘッドノードのないテールポインタ循環リンクリストストレージ構造
2.データ単一リンクリストを作成するためのテール補間法
ここで重要なのは、先頭のノードがないことです。つまり、最初のノードがデータを挿入し、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;
}