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