1 /*这个程序是循环链表*/
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <malloc.h>
5 typedef int bool;
6 #define true 1
7 #define false 0
8
9 typedef int DataType;
10 typedef struct node{
11 DataType data;
12 struct node *next;
13 }CurrNode;
14
15 //链表初始化
16 void CurrInit(CurrNode **head)
17 {
18 if ((*head = (CurrNode*)malloc(sizeof(CurrNode))) == NULL)
19 {
20 exit(1);
21 }
22 (*head)->next = *head;//构造循环链表
23 }
24
25 //链表长度返回
26 int Currlength(CurrNode *head)
27 {
28 CurrNode *per = head->next;
29 int num = 0;
30
31 while (per!= head)//出现中断错误? //2018年8月15日 18:40:31 返回长度per!=head
32 {
33 per = per->next;
34 num++;
35 }
36 return num;
37 }
38
39 //链表插入
40 int CurrInsert(CurrNode *head, int i, DataType x)
41 {
42 CurrNode *per, *fin;
43 int j = 0;
44
45 if ((fin=(CurrNode*)malloc(sizeof(CurrNode)))==NULL)
46 {
47 exit(1);
48 }
49 per = head; //2018年8月15日 18:48:36 如果per=head->next 那么链表将倒序
50 while(per->next!=head&&/*per->next!=head&&*/j<i) //2018年8月15日 18:41:38 判断条件不需要那么多
51
52 {
53 per = per->next;
54 j++;
55 }
56 if (j!=i)
57 {
58 printf("插入位置错误!\n");
59 return 0;
60 }
61 fin->data = x;
62
63 fin->next = per->next;
64 per->next = fin;
65 return 1;
66 }
67
68 //链表删除
69 int CurrDelete(CurrNode *head, int i, DataType *x)
70 {
71 CurrNode *per, *tmp;
72 int j = 0;
73
74 if ((tmp = (CurrNode*)malloc(sizeof(CurrNode))) == NULL)
75 {
76 exit(1);
77 }
78 per = head;
79 while (per->next != head&&j<i)//删除不需要判断下一个节点是否存在
80 {
81 per = per->next;
82 j++;
83 }
84 if (j != i)
85 {
86 printf("删除位置错误!\n");
87 return 0;
88 }
89 *x = per->data;
90
91 tmp = per->next;
92 per->next = tmp->next;
93 free(tmp);
94 return 1;
95 }
96
97 //链表取出
98 int CurrGet(CurrNode *head, int i, DataType *x)
99 {
100 CurrNode *per=head->next;
101 int j = 0;
102
103 while (per!=head&&j<i)
104 {
105 per = per->next;
106 j++;//失误
107 }
108 if (j!=i)
109 {
110 printf("取出位置错误!\n");
111 return 0;
112 }
113 *x = per->data;
114 return 1;
115 }
116 //链表销毁
117 void CurrDestroy(CurrNode **head)
118 {
119 CurrNode *per = *head, *tmp;
120 if ((tmp = (CurrNode*)malloc(sizeof(CurrNode))) == NULL)
121 {
122 exit(1);
123 }
124 while (per->next!= *head)
125 {
126 tmp = per;
127 per = per->next;
128 free(tmp);
129 }
130 *head = NULL;
131 }
132
133 //判断是否构成循环链表
134 bool Currcheck(CurrNode* head)
135 {
136 int nNumber = Currlength(head);
137
138 CurrNode* pTemp = head;
139 int i = 0;
140 while (i < nNumber)
141 {
142 pTemp = pTemp->next;
143 i++;
144 }
145
146 return (pTemp->next == head) ? true : false;
147 }
148
149 //主函数
150 int main()
151 {
152 CurrNode *mylist;
153 int i, x;
154
155 CurrInit(&mylist);
156 for ( i = 0; i < 10; i++)
157 {
158 if ((CurrInsert(mylist, i, i + 1)) == 0)
159 {
160 printf("插入位置错误!\n");
161 return ;
162 }
163 }
164 if ((CurrDelete(mylist, 5, &x)) == 0)
165 {
166 printf("删除位置错误!\n");
167 return;
168 }
169 else
170 {
171 printf("删除数字:%d\n", x);
172 }
173 for ( i = 0; i < Currlength(mylist); i++)
174 {
175 if ((CurrGet(mylist, i, &x)) == 0)
176 {
177 printf("取出位置错误!\n");
178 return;
179 }
180 else
181 {
182 printf("%d ",x);
183 }
184 }
185 printf("\n%s", (Currcheck(mylist) == 1 )? "是循环链表": "不是循环链表");
186 CurrDestroy(&mylist);
187 getchar();
188 return 0;
189 }