循环链表
廖家龙 用心听,不照做

单链表:表尾结点的next指针指向NULL,从一个结点出发只能找到后续的各个结点
循环单链表:表尾结点的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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>

typedef struct LNode{
int data; //数据域
struct LNode *next; //指针域
}LNode,*LinkList; //LinkList等价于LNode *

//初始化一个循环单链表
bool InitList(LinkList *L){
(*L)=(LNode *)malloc(sizeof(LNode)); //分配一个头结点
if((*L) == NULL){
return false; //内存不足,分配失败
}
(*L)->next=(*L); //头结点next指针指向头结点
return true;
}

//判断循环单链表是否为空
bool Empty(LinkList *L){
if((*L)->next == (*L)){
return true;
}
else{
return false;
}
}

//判断结点p是否为循环单链表的表尾结点
bool isTail(LinkList *L,LNode *p){
if(p->next == (*L)){
return true;
}
else{
return false;
}
}

int main(){

LinkList L;
InitList(&L); //初始化双链表

//...后续代码
}

双链表:表头结点的prior指向NULL,表尾结点的next指向NULL
循环双链表:表头结点的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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>

typedef struct DNode{
int data; //数据域
struct DNode *prior,*next; //指针域
}DNode,*DLinklist; //DLinklist等价于DNode *

//初始化空的循环双链表
bool InitDLinkList(DLinklist *L){
(*L)=(DNode *)malloc(sizeof(DNode)); //分配一个头结点
if((*L) == NULL){ //内存不足,分配失败
return false;
}

(*L)->prior=(*L); //头结点的prior指向头结点
(*L)->next=(*L); //头结点的next指向头结点
return true;
}

//判断循环双链表是否为空(带头结点)
bool Empty(DLinklist *L){
if((*L)->next == (*L)){
return true;
}
else{
return false;
}
}

//判断结点p是否为循环双链表的表尾结点
bool isTail(DLinklist *L,DNode *p){
if(p->next == (*L)){
return true;
}
else{
return false;
}
}

int main(){

DLinklist L;
InitDLinkList(&L); //初始化循环双链表

//...后续代码
}