在单链表和双链表上加上一点小小的改进–循环链表

循环单链表

最后一个结点的next指针指向头结点

初始化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
typedef struct LNode
{
ElemType data;//data成为数据域
struct LNode* next;//指针存放下一个节点
}LNode,*LinkList;
bool InitList(LinList &L){
L= (LNode*)malloc(sizeof(LNode));//分配头结点
if(L==NULL)//内存不足,分配失败
return false;
L->next=L;//头结点之后没有其他结点
return true;
}
bool isEmpty(LinList L){
return L->next==L;
}
void test(){
LinkList L;//声明一个指向单链表的指针
InitList(L);
}

循环双链表

表头结点的prior指向表尾结点

表尾结点的next指针指向头结点

初始化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
typedef struct DNode {
Elemtype data;
struct DNode* prior, * next;
}DNode,*DLinklist;
//初始化双链表
bool InitDLinklist(DLinklist& L) {
L = (DNode*)malloc(sizeof(DNode));//分配一个头结点
if (L == NULL)//内存不足 分配失败
return false;
L->prior = L;
L->next = L;
return true;
}
void testDLinklist() {
DLinklist L;
InitDLinklist(L);
}
//判断双链表是否为空 带头结点
bool Empty(DLinklist L){
if(L->next==L)
return true;
else
return false;
}

对于添加(和删除)操作的时候

直接抢p(尾)结点 的next指针的prior指向下(删除反过来)一个结点