前面说到单循环链表比顺序结构好,好在内存是任意分配的,而且在中间插入和删除数据时的时间复杂度明显比顺序结构要小很多。
但是单链表有一个明显的不足,就是在访问数据这个方面,大家都知道,只要你有数据所在数组的下标,你想访问数组中哪个数据都行,而单链表呢,它必须要从头结点(或者第一个节点)出发,才能访问全部的节点,如果没有从头结点(或者第一个)出发,那么在它之前的节点就永远访问不到了!!! 要解决这个问题,我们引入了单循环链表的概念,很简单,就是将最后一个节点的next指针指向第一个节点,这个链表就形成了一个环。这时候头结点就可以不需要了(但是有头结点更方便访问第一个节点,以下我的程序都默认有头结点)。
如下图所示:
根据这一个概念,我们很容易的就可以创建出一个单循环链表:
用尾插法创建,头插法就不演示了,跟前面单链表一样的道理,实现如下:
void CreatListCircle(Linklist *L,int n) //用尾插法创建单循环链表,n表示初始化链表的长度
{
int i;
Linklist p,r;
*L = (Linklist)malloc(sizeof(Node));
if( !(*L) ) //这里加了一个判断申请是否成功,若内存申请失败则以错误码退出(之前两篇没有写上,也懒得补,平时自己编编小程序一般都是成功了,但要是编写大工程大项目一定要加上!!不然错误找半天)
{
exit(0);
}
r = *L;
for(i=1;i<=n;i++)
{
p = (Linklist)malloc(sizeof(Node));
p->data = i;
r->next = p;
r = p;
}
r->next = (*L)->next; //只加了这一句,让最后一个节点的next指针指向第一个指针(现在知道头结点的好处了吧)
}
相信空链表大家也一定会创建了,这个就不贴代码了。
单循环链表相对比较简单,接下去会写几个实例展示下单循环链表的作用。目前只写了拉丁方阵和魔术师发牌的实例。如果以后还有写就再贴吧。