考研一轮循环双链表实现含测试效果(王卓版)

本博文源于王卓老师的数据结构,旨在用代码实现书上的案例,循环双链表书上给出了插入和删除,插入可以做头插法,删除是一个需要理解记忆的内容,在这里博文给出代码,有需要的读者可以收藏学习。

1、循环双链表存储结构

有prior域和next域

typedef struct DuLNode{
    
    
    ElementType data;
    struct DuLNode* prior;
    struct DuLNode*next;
}DuLNode,*DuLinkList;

2、初始化循环双链表

初始化就是设置next和prior指向自己

void InitDuList(DuLinkList &L){
    
    
    L = new DuLNode;
    if(!L){
    
    
        cout << "new failed" << endl;
        exit(ERROR);
    }
    L->next = L->prior = L;
}

3、获得第i元素的值

跟普通的链表循环类似

DuLinkList GetElem_DuL(DuLinkList &L, int i) {
    
    
    if(L->next == L || i <=0) return L;
    DuLinkList p= L->next;
    int cnt = 1;
    while(p!=L && cnt<i){
    
    
        p = p->next;
        cnt++;
    }
    return p;
}

4、在第i号位置插入元素e

插入的话,也就是书上源代码,先连两边的线,最后补齐

Status ListInsert_DuL(DuLinkList &L,int i,ElementType e){
    
    
    DuLinkList p;
    if(!(p=GetElem_DuL(L,i)))
        return ERROR;
    DuLinkList s = new DuLNode;
    s->data = e;
    s->prior =p->prior;
    p->prior->next = s;
    s->next = p;
    p->prior = s;
    return OK;
}

5、打印循环双链表

跟循环单链表一样遍历

void Print_DuL(DuLinkList L){
    
    
    for(DuLinkList p = L->next;p!=L;p=p->next)
        cout << p->data << " ";
    cout << endl;
}

6、尾插法建立循环双链表

尾插法就是要有一个快慢指针,插入完成赋值给慢指针

void Create_DuL(DuLinkList &L,int A[],int n){
    
    
    InitDuList(L);
    DuLinkList r = L,s;
    for(int i =0;i<n;i++){
    
    
        s= new DuLNode;
        s->data = A[i];
        s->prior = r;
        s->next = r->next;
        r->next = s;
        r= s;
    }
}

7、删除循环双链表指定位置元素

书上源码,这里注意next->prior与prior->next的含义

Status ListDelete_Dul(DuLinkList &L,int i){
    
    
    DuLinkList p;
    if(!(p=GetElem_DuL(L,i)))
        return ERROR;
    p->prior->next = p->next;
    p->next->prior = p->prior;
    delete p;
    return OK;
}

测试效果

在这里插入图片描述

完整源码

#include<iostream>
#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 DuLNode{
    
    
    ElementType data;
    struct DuLNode* prior;
    struct DuLNode*next;
}DuLNode,*DuLinkList;



void InitDuList(DuLinkList &L){
    
    
    L = new DuLNode;
    if(!L){
    
    
        cout << "new failed" << endl;
        exit(ERROR);
    }
    L->next = L->prior = L;
}
DuLinkList GetElem_DuL(DuLinkList &L, int i) {
    
    
    if(L->next == L || i <=0) return L;
    DuLinkList p= L->next;
    int cnt = 1;
    while(p!=L && cnt<i){
    
    
        p = p->next;
        cnt++;
    }
    return p;
}

Status ListInsert_DuL(DuLinkList &L,int i,ElementType e){
    
    
    DuLinkList p;
    if(!(p=GetElem_DuL(L,i)))
        return ERROR;
    DuLinkList s = new DuLNode;
    s->data = e;
    s->prior =p->prior;
    p->prior->next = s;
    s->next = p;
    p->prior = s;
    return OK;
}

void Print_DuL(DuLinkList L){
    
    
    for(DuLinkList p = L->next;p!=L;p=p->next)
        cout << p->data << " ";
    cout << endl;
}
void Create_DuL(DuLinkList &L,int A[],int n){
    
    
    InitDuList(L);
    DuLinkList r = L,s;
    for(int i =0;i<n;i++){
    
    
        s= new DuLNode;
        s->data = A[i];
        s->prior = r;
        s->next = r->next;
        r->next = s;
        r= s;
    }
}
Status ListDelete_Dul(DuLinkList &L,int i){
    
    
    DuLinkList p;
    if(!(p=GetElem_DuL(L,i)))
        return ERROR;
    p->prior->next = p->next;
    p->next->prior = p->prior;
    delete p;
    return OK;
}

int main(){
    
    
    DuLinkList  L;
    InitDuList(L);
    for(int i=0;i<5;i++){
    
    
        ListInsert_DuL(L,1,i+1);
    }
    cout << "head insert:1 2 3 4 5"<< endl;
    Print_DuL(L);
    cout << "tail insert:7 2 4 5 6" << endl;
    int A[5] ={
    
    7,2,4,5,6};
    Create_DuL(L,A,5);

    Print_DuL(L);
    ListDelete_Dul(L,2);
    cout << "Delete pos:2" << endl;
    Print_DuL(L);
    return 0;
}


猜你喜欢

转载自blog.csdn.net/m0_37149062/article/details/123591019