/*
* 算法功能:建立单链表,判断单链表是否有环。
* 函数说明:
* 1.initLinkList():建立无环无头结点单链表。
* 2.initLoopList():建立有环的链表。
* 3.isLoopLink():判断链表是否有环。
* @author:xiaoq-ohmygirl
* @time :2012-06-25
**/
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define MAXNODE 5
//单链表结构体
typedef struct linkNode{
int data;
linkNode * next;
}linkNode,*linkList;
//头结点插入法逆序建立无环无头单链表
int initLinkList(linkList & L,int n){
L = (linkList)malloc(sizeof(linkNode));
if(!L){
return 0;
}
scanf("%d",&L->data);
L->next = NULL;
linkList p;
for(int i = n-1;i > 0;i--){
p = (linkList)malloc(sizeof(linkNode));
scanf("%d",&p->data);
p->next = L->next;
L->next = p;
}
return 1;
}
//在单链表的第k个元素的地方建立loop,由尾节点的指针指向此处。 assert(n>=k)
int initLoopLink(linkList &L,int n,int k){
L = (linkList)malloc(sizeof(linkNode));
if(!L){
return 0;
}
scanf("%d",&L->data);
L->next = NULL;
linkList p,node;
for(int i = n-1;i > 0;i--){
p = (linkList)malloc(sizeof(linkNode));
scanf("%d",&p->data);
p->next = L->next;
L->next = p;
}
node = L;
for(int i = 0;i < k;i++){
node = node->next;
}
p = node;
while(node->next != NULL){
node = node->next;
}
node->next = p;
return 1;
}
//测试单链表是否有环。 算法思想:如果单链表有环,那么对于两个初始指向链表头的指针,一个走两步,一个走一步,最终指针一定会相交,反之一定没有环。
linkList isLoopLink(linkList L){
linkList first = L,second = L;
while(first != NULL && first->next != NULL){
first = first->next->next;
second = second->next;
if(first == second){
return first;
}
}
return NULL;
}
main(){
linkList L = NULL,p = NULL;
initLinkList(L,MAXNODE);
p = isLoopLink(L);
printf("%s",p == NULL?"not loop":"loop");
initLoopLink(L,MAXNODE,2);
p = isLoopLink(L);
printf("%s",p == NULL?"not loop":"loop");
system("pause");
return 0;
}
【学习点滴-数据结构-单链表】 判断单链表是否有环
最新推荐文章于 2024-06-10 23:31:38 发布