普通链表的尾指针为空,循环单链表的尾指针为头结点。故可以写出如下算法:
节点数据结构:
/*
*定义链式存储线性表的结构
*/
typedef struct LNode
{
int data; //数据域
struct LNode * next; //指向下一个节点的指针
} LNode,*LinkList;
判定是否为循环链表:
/*
*fun:JudgeCircularList_L()
*desc:判断单链线性表L是否为循环链表,若是则返回OK,否则返回ERROR
*@param: L LinkList 头指针的引用
*@ret:OK/ERROR int
*/
Status JudgeCircularList_L(LinkList &L)
{
if(!L||!L->next) return ERROR; //空指针或者单链表为空表
LinkList tail,first;
first=L->next;
tail=first->next;
while(tail&&tail!=first)
{
tail=tail->next;
}
if(!tail) return ERROR;
else return OK;
}
创建循环链表:
/*
*fun:CreateCircularList_L()
*desc:顺序输入n个元素的值,建立带表头结点的循环单链线性表L
*@param: L LinkList类型(结构体指针类型)变量的引用
*@param:n int n n个元素
*@ret void
*/
void CreateCircularList_L(LinkList &L,int n)
{
int m=n,value;
L=(LinkList) malloc(sizeof(LNode)); //先建立一个带头结点的单链表
L->next=L; //为空表时,头结点指向本身
LinkList tail=L,current,first; //指针tail指向当前链表的最后一个节点,current指向当前插入的节点
for(int i=0; i<m; i++)
{
current=(LinkList)malloc(sizeof(LNode));
if(!i)first=current; //first记录第一个节点的地址
scanf("%d",&value); //输入节点的值
current->data=value;
tail->next=current; //将新节点添加到链表尾部
current->next=first;
tail=current;
}///注意:我这里的写法中最后一个节点并不指向头节点,头节点的数据域也并没有存放值
///只是为了方便找到链表才设置的头节点,也可把第一个节点当做头节点处理
}