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