循环链表前言
之前写了,双链表
和单链表
的代码模板,基于此结构的循环链表代码具体实现想偷懒了,主要是因为我觉得考的可能性不大。
循环单链表的类型描述
1 2 3 4
| typedef struct LNode{ int data; struct LNode * next; }LNode, * LinkList;
|
初始化
1 2 3 4 5 6
| void InitList(LinkList & list){ list = (LNode *)malloc(sizeof(LinkList)); list -> next = list; }
|
判空
1 2 3 4 5 6
| bool Empty(LinkList list){ if(list -> next == list) return true; else return false; }
|
判断表尾节点
1 2 3 4 5 6
| bool isTail(LinkList list, LNode * p){ if(p -> next == list) return true; else return false; }
|
插入和删除
循环单链表的插入、删除算法与单链表几乎一样,不同的是如果在表尾进行,那么要让单链表继续保持循环的性质,即让尾结点的next域指向头结点。
循环双链表的类型描述
1 2 3 4
| typedef struct DNode{ int data; struct DNode * prior, * next; }DNode, * DLinkList;
|
初始化
1 2 3 4 5
| void InitList(DLinkList & list){ list = (LNode *)malloc(sizeof(LNode)); list -> prior = list; list -> next = list; }
|
判空
1 2 3 4 5 6
| bool Empty(DLinkList list){ if(list -> next == list) return true; else return false; }
|
判断表尾节点
1 2 3 4 5 6
| bool isTail(DLinkList list, LNode * p){ if(p -> next == list) return true; else return false; }
|
插入和删除
循环双链表的插入、删除算法与双链表几乎一样,不同的是如果在表尾进行,那么要让双链表继续保持循环的性质,即让尾结点的next域指向头结点,同时让头结点的prior域指向尾结点。