您的位置:首页 > 理论基础 > 数据结构算法

【学习点滴-数据结构-单链表】 判断单链表是否有环

2012-06-28 15:16 399 查看
/*
 * 算法功能:建立单链表,判断单链表是否有环。 
 * 函数说明:
 * 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;  
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: