テスト結果を達成するための大学院入試用のテールポインタを備えた円形のリンクリストのラウンド(Wang Zhuoバージョン)

このブログ投稿は、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;
}

おすすめ

転載: blog.csdn.net/m0_37149062/article/details/123590007