#include<stdio.h>
#include<stdlib.h>
typedef struct List{
int data;
struct List *next;
}List;
List* Create_node(int x)
{
List* tmp;
tmp = (List *)malloc(sizeof(int));
tmp->data = x;
tmp->next = NULL;
return tmp;
}
void Insert_head(List **head,int x)
{
List* tmp = Create_node(x);
if(NULL == tmp){ //如果创建结点失败
return;
}
if(NULL == head){
*head = tmp;
}else{
tmp->next = *head;
*head = tmp;
}
}
void Cycle(List *head)
{
List *fast = head->next;
List *slow = head;
if(NULL == head){
return;
}
while(1){
if(fast == NULL || fast->next == NULL){
printf("无环!\n");
return;
}else if(fast == slow){
printf("有环\n");
return;
}
fast = fast->next->next;
slow = slow->next;
}
}
List *FindLoopPort(List *Head)
{
List *slow = Head;
List *fast = Head;
while(fast && fast->next){
slow = slow->next;
fast = fast->next->next;
if(slow == fast)
break;
}
if(fast == NULL || fast->next == NULL)
return NULL;
slow = Head;
while(slow != fast){
slow = slow->next;
fast = fast->next;
}
return slow;
}
int Cycle_length(List *port)
{
int count = 1;
List *tmp = port->next;
if(port == NULL)
return 0;
while(port != tmp){
tmp = tmp->next;
count++;
}
return count;
}
int main()
{
List *head = NULL;
List *tail = NULL;
List *ret = NULL;
int result;
Insert_head( &head,1);
Insert_head( &head,2);
Insert_head( &head,3);
Insert_head( &head,4);
Insert_head( &head,5);
tail = head;
while(tail->next != NULL){
tail = tail->next;
}
tail->next = head;
Cycle(head);
ret = FindLoopPort(head);
printf("入环点是:%d\n",ret->data);
result = Cycle_length(ret);
printf("环的长度是:%d\n",result);
system("pause");
return 0;
}
#include<stdlib.h>
typedef struct List{
int data;
struct List *next;
}List;
List* Create_node(int x)
{
List* tmp;
tmp = (List *)malloc(sizeof(int));
tmp->data = x;
tmp->next = NULL;
return tmp;
}
void Insert_head(List **head,int x)
{
List* tmp = Create_node(x);
if(NULL == tmp){ //如果创建结点失败
return;
}
if(NULL == head){
*head = tmp;
}else{
tmp->next = *head;
*head = tmp;
}
}
void Cycle(List *head)
{
List *fast = head->next;
List *slow = head;
if(NULL == head){
return;
}
while(1){
if(fast == NULL || fast->next == NULL){
printf("无环!\n");
return;
}else if(fast == slow){
printf("有环\n");
return;
}
fast = fast->next->next;
slow = slow->next;
}
}
List *FindLoopPort(List *Head)
{
List *slow = Head;
List *fast = Head;
while(fast && fast->next){
slow = slow->next;
fast = fast->next->next;
if(slow == fast)
break;
}
if(fast == NULL || fast->next == NULL)
return NULL;
slow = Head;
while(slow != fast){
slow = slow->next;
fast = fast->next;
}
return slow;
}
int Cycle_length(List *port)
{
int count = 1;
List *tmp = port->next;
if(port == NULL)
return 0;
while(port != tmp){
tmp = tmp->next;
count++;
}
return count;
}
int main()
{
List *head = NULL;
List *tail = NULL;
List *ret = NULL;
int result;
Insert_head( &head,1);
Insert_head( &head,2);
Insert_head( &head,3);
Insert_head( &head,4);
Insert_head( &head,5);
tail = head;
while(tail->next != NULL){
tail = tail->next;
}
tail->next = head;
Cycle(head);
ret = FindLoopPort(head);
printf("入环点是:%d\n",ret->data);
result = Cycle_length(ret);
printf("环的长度是:%d\n",result);
system("pause");
return 0;
}