1、循环链表
1.1 循环单链表
循环单链表和单链表的区别在于,表中最后一个结点指针不在是null,而是头指针,从而使整个链表形成一个环
- 此时判断单链表是否为空,条件就是头结点的指针是否等于头指针
- 此时单链表相当于一个环,而且还是一个有方向的环,头指针表明这个环的入口地址,然后顺着next指针走下去,所以循环单链表的插入、删除算法与单链表几乎一样,所不同就是表尾的操作。
- 如果经常对表尾操作,可以设个尾指针(表名是头指针),对表头和表尾的操作时间复杂度都是0(1)
1.2循环双链表
相对于双链表,不同的是循环双链表的头结点prior还要指向表尾,尾部的next还要指向头结点,其他都一样,循环双链表相当于有两个环,两个不同方向的环,头指针(表名)告诉我们这个循环双链表的入口地址,我们可以向两个方向操作数据
- 判断循环双链表是否为空,只要头结点的prior和next都等于头指针
2、静态链表
静态链表没有通过指针来实现,是通过数组来实现线性表的链式存储结构
描述:
typedef int ElemType;
#define MaxSize 50
typedef struct {ElemType data;int next;
}SLinkList[MaxSize];
- 静态链表的结点也有数据域和指针域,但指针域存放的不再是地址,而是结点的相对地址(就是数组下标)
- 因为是数组来描述,所以静态链表也要预先分配一块连续的内存空间
- 数组第一个元素不存放数据(和头结点和相似),他的指针域存放第一个元素所在的数组下标
- 静态链表的结束标志有很多,上图中-1就是,因为数组下标不可能为-1
- 静态链表对不支持指针的高级语言(Basic)使用很方便