目录
1.循环链表的概念
将单链表中终端结点的指针由空指针改为指向第一个结点,就使单链表形成一个环,这种头尾相连的单链表成为单循环链表,简称循环链表。
下图是循环链表的示意图,这个示意图是有头结点的,所以这种循环链表的操作比较简单,基本跟前面介绍的单链表差不多。为了增加难度,本文的程序全部都是没有头结点的循环链表,但是由于循环链表有他的特性,即使是没有头结点,他的插入和删除同样可以设计的简单巧妙。
2.循环链表的基本操作
(1)初始化:建立一个空的静态链表,链表不存放任何结点。
(2)尾插法创建链表
(3)头插法创建循环链表
(4)查找指定位置的元素:查找第i个结点的元素值。
(5)查找指定元素所在的位置:查找指定元素e在链表中的位置。
(6)插入结点:在指定位置插入新结点。
(7)删除结点:删除指定位置的结点。
(8)删除链表:将链表中所有结点删除,释放全部内存。
(9)遍历链表:将循环链表中所有元素按顺序打印出来。
(10)逆置链表:将链表中所有元素的存放顺序逆置。
(11)查找中间结点:用快慢指针法查找循环链表的中间结点。
(12)拼接链表:将两个循环链表按顺序拼接成一个。
3.循环链表的编程实现
在程序的设计思路上,循环链表的新建、插入和删除等操作跟普通链表差不多,由于本文的循环链表是没有头结点的循环链表,一般来说没有头结点的链表在删除和插入的时候需要将头结点和其他结点分别处理。但是循环链表由于首尾相连,所以我们可以将首元结点的前一个结点当做头结点,即将最末尾的结点当做头结点,这种简单巧妙的操作会给编程带来极大便利。
3.1 C语言实现循环链表
(1)循环链表的声明 cirlinklist.h
#ifndef CIRLINKLIST_H
#define CIRLINKLIST_H
typedef int ElemType;
typedef struct Node
{
ElemType data;
struct Node *Next;
}Node;
typedef Node* linklist;//给节点指针取别名
typedef enum Bool
{
FALSE,TRUE//枚举默认值从0开始,依次加1
}Bool;
//不带头结点的循环链表
Bool InitList(linklist* L);//初始化链表,链表头结点为空
void