数据结构--线性表的链式存储之循环双链表

Posted bearcanlight

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构--线性表的链式存储之循环双链表相关的知识,希望对你有一定的参考价值。

一、什么是循环双链表

  从上一节我们看出循环单链表是尾节点指针指向头节点,那么以此类推,我们的循环双链表就是头节点的prior指针指向尾节点。所以我们在判断循环双链表是否为空时就是其prior和next同时指向一个节点就为空。

技术图片

 

   循环双链表的结构:

typedef struct CDLinkNode {  //定义循环双链表的节点类型
    ElemType data;    //数据
    struct CDLinkNode *prior, *next;  //指针域
}CDLinkNode, *CDLinkList;

  循环双链表的初始化:

CDLinkList InitCDLinkList(CDLinkList L) {        //初始化循环单链表
    CDLinkNode *p;
    p = (CDLinkNode*)malloc(sizeof(CDLinkNode));
    p->prior = p;
    p->next = p;
    L = p;

    return L;
}

二、循环双链表的插入和删除

  插入操作:

Status InsertCDLinkList(CDLinkList L, int i, ElemType e) {        //在表L中第i个位置插入元素e
    CDLinkList p = L;

    int j = 0;

    if (i > LengthDLinkList(L) + 1)        //如果需要插入节点的位置大于链表大小返回失败代码
        return -1;

    while (j < i - 1) {
        p = p->next;
        j++;
    }

    CDLinkNode *newSpace = (CDLinkNode*)malloc(sizeof(CDLinkNode));
    newSpace->data = e;
    newSpace->next = p->next;
    p->next->prior = newSpace;
    newSpace->prior = p;
    p->next = newSpace;

    return 1;
}

int LengthCDLinkList(CDLinkList L) {        //返回单链表的长度
    int i = 0;
    CDLinkList p = L;

    while (p!=L) {
        p = p->next;
        i++;
    }

    return i;
}

删除操作:

Status DeleteElemCDLinkList(CDLinkList L, int i, ElemType *e) {        //删除表中第i个元素,并用e返回其值
    CDLinkList p = L;
    CDLinkNode *q;
    int j = 0;

    if (i > LengthDLinkList(L))
        return -1;

    while (j < i - 1) {
        p = p->next;
        j++;
    }

    q = p->next;
    p->next = q->next;
    q->next->prior = p;
    *e = q->data;

    free(q);

    return 1;
}

int LengthCDLinkList(CDLinkList L) {        //返回单链表的长度
    int i = 0;
    CDLinkList p = L;

    while (p!=L) {
        p = p->next;
        i++;
    }

    return i;
}

 

以上是关于数据结构--线性表的链式存储之循环双链表的主要内容,如果未能解决你的问题,请参考以下文章

顺序存储和链式存储线性表的基本操作(王道)

《数据结构》复习之线性表(顺序表和链表)

线性表文档之循环双链表

数据结构第五篇——线性表的链式存储之循环链表

线性表的链式存储(C代码实现)

数据结构与算法学习笔记 线性表Ⅱ