1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <time.h>
4
5 #define OK 1
6 #define ERROR 0
7 typedef int Status;
8 typedef int ElemType;
9
10 typedef struct Node
11 {
12 ElemType data;
13 struct Node* next;
14 }Node;
15
16 typedef struct Node* LinkList;
17
18 Status InitList(LinkList* L) //初始化操作,建立一个空的线性表.想把头指针里面的值改掉,所以传个头指针的地址
19 {
20 *L = (LinkList)malloc(sizeof(Node));
21 if (!(*L))
22 return ERROR;
23 (*L)->next = *L;
24 return OK;
25 }
26 Status ListEmpty(LinkList L) //若线性表为空,返回true,否则返回false
27 {
28 if (L->next == L)
29 return OK;
30 return ERROR;
31 }
32 Status ClearList(LinkList* L) //清空线性表
33 {
34 LinkList p = (*L)->next;
35 LinkList q;
36 while (p != *L)
37 {
38 q = p;
39 p = p->next;
40 free(q);
41 }
42 (*L)->next = (*L);
43 return OK;
44 }
45 Status GetElem(LinkList L, int i, ElemType *e) //查找线性表中的第i个位置的元素值,并赋值给e
46 {
47 int j = 1;
48 LinkList p = L->next;
49 while ((p!=L) && j < i)
50 {
51 p = p->next;
52 j++;
53 }
54 if ((p==L) || j > i)
55 return ERROR;
56 *e = p->data;
57 return OK;
58 }
59 Status LocateElem(LinkList L, ElemType e) //查找线性表L中与给定值e相等的元素,如果查找成功,则返回第一个相同的元素在L中的下标;否则,返回0表示失败
60 {
61 int i = 1;
62 LinkList p = L->next;
63 while (p != L && p->data != e)
64 {
65 p = p->next;
66 i++;
67 }
68 if (!p)
69 return ERROR;
70 return i;
71 }
72 Status ListInsert(LinkList* L, int i, ElemType e) //在线性表L的第i个位置插入元素e
73 {
74 LinkList p, q;
75 p = (*L)->next;
76 int j = 1;
77 if ((*L)->next == *L)
78 {
79 if (i == 1)
80 {
81 goto ADD;
82 }
83 }
84 while ((p!=*L) && j < i) //尾部插入时,p指向最后一个值,而j=i-1
85 {
86 p = p->next;
87 j++;
88 }
89 if ((p==*L) || j > i)
90 return ERROR;
91 ADD:
92 q = (LinkList)malloc(sizeof(Node));
93 q->data = e;
94 q->next = p->next;
95 p->next = q;
96
97 return ERROR;
98 }
99 Status ListDelete(LinkList*L, int i, ElemType* e) //删除线性表L中第i个位置元素,并用e返回其值
100 {
101 LinkList p, q;
102 p = *L;
103 int j = 1;
104 //while (p && j<i)
105 while ((p->next!=*L) && j < i)
106 {
107 p = p->next;
108 j++;
109 }
110 //if (!p || j > i)
111 if (!(p->next) || j > i)
112 return ERROR;
113 q = p->next;
114 *e = q->data;
115 p->next = q->next;
116 free(q);
117 return OK;
118 }
119 Status CreateListHead(LinkList *L, int n)
120 {
121 LinkList p;
122 int i;
123 (*L) = (LinkList)malloc(sizeof(Node));
124 (*L)->next = *L;
125 for (i = 0; i < n; i++)
126 {
127 p = (LinkList)malloc(sizeof(Node));
128 p->data = i;
129 p->next = (*L)->next;
130 (*L)->next = p;
131 }
132 return OK;
133 }
134 Status CreateListTail(LinkList *L, int n)
135 {
136 LinkList p;
137 int i;
138 (*L) = (LinkList)malloc(sizeof(Node));
139 //(*L)->next = NULL;
140 LinkList q = (*L);
141 for (i = 0; i < n; i++)
142 {
143 p = (LinkList)malloc(sizeof(Node));
144 p->data = i + 10;
145 q->next = p;
146 q = p;
147 }
148 q->next = *L;
149 return OK;
150 }
151 Status visit(ElemType n)
152 {
153 printf("-> %d ", n);
154 return OK;
155 }
156 Status ListTraverse(LinkList L)
157 {
158 LinkList p = L->next;
159 while (p != L)
160 {
161 visit(p->data);
162 p = p->next;
163 }
164 return OK;
165 }
166
167 int ListLength(LinkList L) //返回线性表L的长度
168 {
169 int i = 0;
170 LinkList p = L->next;
171 while (p != L)
172 {
173 i++;
174 p = p->next;
175 }
176 return i;
177 }
178
179 int main()
180 {
181 LinkList L;
182 Status i, j;
183 char opp = '-1';
184 ElemType e;
185 int pos = 1;
186 int k = 0;
187
188 i = InitList(&L);
189 printf("链表L初始化完毕,ListLength(L)=%d\n\n", ListLength(L));
190
191 printf("\n1.遍历操作 \n2.插入操作 \n3.删除操作 \n4.获取结点数据\n5.查找某个数是否在链表中 \n6.头插法创建链表 \n7.尾插法创建链表 \n8.置空链表 \n0.退出 \n请选择你的操作:\n");
192
193 while (opp != '0') {
194 scanf_s("%c", &opp);
195 switch (opp) {
196 case '1':
197 ListTraverse(L);
198 printf("\n");
199 break;
200
201 case '2':
202 srand((unsigned)time(NULL));
203 for (j = 1; j <= 10; j++)
204 {
205 i = ListInsert(&L, 1, rand() % 100);
206 }
207 printf("在L的表头依次插入10个随机数后:");
208 ListTraverse(L);
209 printf("\n");
210 printf("链表L创建完毕,ListLength(L)=%d\n\n", ListLength(L));
211 break;
212 case '3':
213 printf("要删除第几个元素?");
214 scanf_s("%d", &pos);
215 ListDelete(&L, pos, &e);
216 printf("删除第%d个元素成功,现在链表为:\n", pos);
217 ListTraverse(L);
218 printf("\n");
219 break;
220
221 case '4':
222 printf("你需要获取第几个元素?");
223 scanf_s("%d", &pos);
224 GetElem(L, pos, &e);
225 printf("第%d个元素的值为:%d\n", pos, e);
226 printf("\n");
227 break;
228 case '5':
229 printf("输入你需要查找的数:");
230 scanf_s("%d", &pos);
231 k = LocateElem(L, pos);
232 if (k)
233 printf("第%d个元素的值为%d\n", k, pos);
234 else
235 printf("没有值为%d的元素\n", pos);
236 printf("\n");
237 break;
238 case '6':
239 CreateListHead(&L, 10);
240 printf("整体创建L的元素(头插法):\n");
241 ListTraverse(L);
242 printf("\n");
243 break;
244
245 case '7':
246 CreateListTail(&L, 10);
247 printf("整体创建L的元素(尾插法):\n");
248 ListTraverse(L);
249 printf("\n");
250 break;
251
252 case '8':
253 i = ClearList(&L);
254 printf("\n清空L后:ListLength(L)=%d\n", ListLength(L));
255 ListTraverse(L);
256 printf("\n");
257 break;
258
259 case '0':
260 exit(0);
261 }
262 }
263 }