1 #include<stdio.h>
2 #include<stdlib.h>
3
4 typedef struct Node{
5 int data;
6 struct Node* next;
7 }Node;
8 typedef struct Node* LinkList;
9
10 void InitialLinkList(LinkList *L){
11 (*L) = (LinkList)malloc(sizeof(struct Node));
12 if(!(*L)){
13 printf("Error:InitialLinkList:malloc\n");
14 exit(1);
15 }
16 (*L)->next = NULL;
17 }
18 void CreateSimpleCycleList_withoutLoop(LinkList *L,int number){
19 int count;
20 LinkList new,tail = (*L);
21 printf("Create SimpleCycleList_withoutLoop\n");
22 for(count = 1;count <= number; count++){
23 new = (LinkList)malloc(sizeof(struct Node));
24 if(!(new)){
25 printf("Error:CreateSimpleCycleList_withoutLoop\n");
26 exit(1);
27 }
28 printf("please enter %d element: ",count);
29 scanf("%d",&(new->data));
30 new->next = tail->next;
31 tail->next = new;
32 tail = new;
33 }
34 }
35 void CreateSimpleCycleList_withLoop(LinkList *L,int number,int loopInIndex){
36 /* 第一个参数LinkList是要创建的有环的链表
37 * 第二个参数number是链表的长度
38 * 第三个参数loopInIndex是指示环由链表的末尾指向了第几个元素,0则表示是指向了头结点。
39 * */
40 int count;
41 LinkList new,temp = *L,temp1 = *L;
42 if(loopInIndex > number){
43 printf("Error:CreateSimpleCycleList_withLoop:loopInIndex\n");
44 }
45 else{
46 printf("Create SimpleCycleList_withLoop\n");
47 for(count = 1; count <= number; count++){
48 new = (LinkList)malloc(sizeof(struct Node));
49 if(!new){
50 printf("Error:CreateSimpleCycleList_withLoop\n");
51 exit(1);
52 }
53 printf("please enter %d element ",count);
54 scanf("%d",&(new->data));
55 temp->next = new;
56 new->next = *L;
57 temp = new;
58 }
59 for(count = 0;count < loopInIndex; count++){
60 temp1 = temp1->next;
61 }
62 temp->next = temp1;
63 }
64 }
65 void JodgeLoop(LinkList L){
66 LinkList p = L,q = L;
67 int step_o = 0,step_i = 0;
68 int isLoop = 0;
69 while(p){
70 step_i = 0;
71 q = L;
72 while(q != p){
73 q = q->next;
74 step_i++;
75 }
76 if(step_o != step_i){
77 isLoop = 1;
78 break;
79 }
80 p = p->next;
81 step_o++;
82 }
83 if(isLoop == 1)
84 printf("Exist loop in this List.Appear in position %d\n",step_i);
85 else
86 printf("Dose no Exist loop in this List!\n");
87 }
88 void JodgeLoop_2(LinkList L){
89 LinkList quick = L,slow = L;
90 int isLoop = 0;
91 while(quick != NULL && quick->next != NULL){
92 quick = quick->next->next;
93 slow = slow->next;
94 if(quick == slow){
95 isLoop = 1;
96 break;
97 }
98 }
99 if(isLoop)
100 printf("Exist loop in this List.\n");
101 else
102 printf("Dose no Exist loop in this List!\n");
103 }
104 void Display_withoutLoop(LinkList L){
105 while(L->next != NULL){
106 L = L->next;
107 printf("%d ",L->data);
108 }
109 printf("\n");
110 }
111
112 int main(){
113 LinkList L1;
114 LinkList L2;
115 InitialLinkList(&L1);
116 InitialLinkList(&L2);
117 CreateSimpleCycleList_withLoop(&L1,5,1);
118 CreateSimpleCycleList_withoutLoop(&L2,4);
119 JodgeLoop(L1);
120 JodgeLoop(L2);
121 JodgeLoop_2(L1);
122 JodgeLoop_2(L2);
123 return 0;
124 }