对于单链表,由于每个结点只存储了向后的指针,到了尾标志就停止了向后的操作,这样,当某一个结点找不到前驱结点了,也不能回去找。而我们现在要解决这个问题,就要利用循环链表。
将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相接的单链表称为单循环链表,简称循环链表。
循环链表解决了一个很麻烦的问题:如何从一个结点出发,访问到链表的全部结点。
为了使空链表与非空链表处理一致,我们通常设一个头结点,当然,并不是说循环链表一定要有头结点。
其实循环链表和单链表的主要差异在于循环的判断条件上,之前是判断temp->next是否为空,现在是temp->next不等于头结点
知识点:
1.循环链表是单链表的变形。
2.循环链表最后一个结点的 link 指针不 为NULL,而是指向了表的前端。
3.为简化操作,在循环链表中往往加入表头结点。
4.循环链表的特点是:只要知道表中某一结点的地址,就可搜寻到所有其他结点的地址。
/*****************************************************
copyright (C), 2014-2015, Lighting Studio. Co., Ltd.
File name:
Author:Jerey_Jobs Version:0.1 Date:
Description:
Funcion List:
*****************************************************/
#include <stdio.h>
#include <stdlib.h>
struct node
{
int num;
struct node * next;
};
typedef struct node Node;
typedef struct node * Link;
void creat_link(Link * head)
{
(*head) = (Link)malloc(sizeof(Node)) ; //创建一个新的节点,返回其地址
if(NULL == (*head))
{
printf("malloc error!\n");
exit(-1);
}
(*head) -> next = *head;
}
/*
=========================
功能:从链表头部插入结点
返回:void
=========================
*/
void insert_node_head(Link * head,Link new_node)
{
Link tmp = *head;
new_node->next = tmp->next;
tmp -> next = new_node;
}
/*
=========================
功能:从链表尾部插入结点
返回:void
=========================
*/
void insert_node_tail(Link *head,Link newnode)
{
Link temp = *head;
while (temp->next != *head) //找到最后一个结点
{
temp = temp->next;
}
temp->next = newnode; //插入结点
newnode->next = *head;
}
void insert_node(Link * head,Link new_node,int n)
{
Link tmp = NULL;
Link q = NULL;
tmp = <