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

一、什么是循环双链表

  从上一节我们看出循环单链表是尾节点指针指向头节点,那么以此类推,我们的循环双链表就是头节点的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;
}

 

posted @ 2020-07-12 18:13  熊熊会发光哦  阅读(193)  评论(0编辑  收藏  举报