關於連結串列的C語言實現(初級)
阿新 • • 發佈:2018-12-31
好好努力堅持吧,大概演算法什麼的,會是能貫穿自己一輩子的事情
連結串列操作(實驗名稱)
一、實驗目的
掌握連結串列的基本演算法並完成對連結串列各個功能的實現
二、實驗內容
連結串列的基本運算實現,要求至少具有以下功能:
(1)連結串列建立
(2)插入運算
(3)刪除運算
(4)查詢運算
(5)判斷是否為空
三、實驗程式碼(包括執行結果截圖)
1. #include<stdio.h>
2. #include<stdlib.h>
3.
4. /*定義*/
5. typedef int DataType;
6. struct Node{
7. int n;
8. DataType info;
9. struct Node *link;
10. };
11. typedef struct Node *LinkList;
12. typedef struct Node *PNode;
13.
14. LinkList initLinkList()
15. {
16. LinkList head;
17. head = (LinkList)malloc(sizeof(struct Node));
18. if (head == NULL)
19. {
20. printf("記憶體分配失敗!\n");
21. return 0;
22. }
23. head->link = NULL;
24. return head;
25. }
26.
27. /*建立連結串列*/
28. void createLinkList(LinkList head)
29. {
30. LinkList rear;
31. PNode p;
32. head->n = 0;
33. int m;
34. rear = head;
35. scanf_s("%d", &m);
36. while (m != -1)
37. {
38. p = (PNode)malloc(sizeof(struct Node));
39. p->info = m;
40. p->link = NULL;
41. rear->link = p;
42. rear = p;
43. head->n ++ ;
44. scanf_s("%d", &m);
45. }
46. }
47.
48. /*插入運算*/
49. /*查詢i所在節點p*/
50. PNode Locate_i(LinkList llist, int i)
51. {
52. PNode p; int count = 0;
53. p = llist->link;
54. While (Count < i)
55. {
56. p = p->link;
57. count++;
58. }
59. return p;
60. }
61.
62. /*判斷是否為空*/
63. int isEmptyLinkList(LinkList llist)
64. {
65. return (llist->link == NULL);
66. }
67.
68. /*查詢p所指結點的前驅結點*/
69. PNode locatePre_link(LinkList llist, PNode p)
70. {
71. PNode p1;
72. if (isEmptyLinkList(llist))
73. return 0;
74. p1 = llist;
75. while (p1 != NULL&&p1->link != p)
76. p1 = p1->link;
77. return p1;
78. }
79.
80. /*後插法*/
81. int insertPost_link(LinkList llist, PNode p, DataType x)
82. {
83. PNode q = (PNode)malloc(sizeof(struct Node));
84. if (q == NULL)
85. {
86. printf("out of space!\n");
87. return 0;
88. }
89. Else
90. {
91. q->info = x;
92. q->link = p->link;
93. p->link = q;
94. return 1;
95. }
96. }
97.
98. /*前插法*/
99. int insertPre_link(LinkList llist, PNode p, DataType x)
100. {
101. PNode p1 = (PNode)malloc(sizeof(struct Node));
102. if (p1 == NULL)
103. return 0;
104. p1 = llist;
105. while (p1 != NULL&&p1->link != p)
106. p1 = p1->link;
107. insertPost_link(llist, p1, x);
108. return 1;
109. }
110.
111. /*刪除運算*/
112. int deleteLinkList(LinkList llist, DataType x)
113. {
114. PNode p, q;
115. p = llist;
116. if (p == NULL)
117. return 0;
118. while (p->link != NULL&&p->link->info != x)
119. p = p->link;/*找值為x的節點的儲存位置*/
120. if (p->link == NULL)
121. {
122. printf("No exist!\n");
123. return 0;
124. }
125. else
126. {
127. q = p->link;
128. p->link = q->link;
129. free(q);
130. return 1;
131. }
132. }
133.
134. /*查詢運算*/
135. PNode findLinkList(LinkList llist, DataType x)
136. {
137. PNode p;
138. if (llist == NULL)
139. return 0;
140. p = llist->link;
141. while (p != NULL&&p->info != x)
142. p = p->link;
143. return p;
144. }
145.
146. /*輸出*/
147. void printLinkList(LinkList head)
148. {
149. int j;
150. j = head->n;
151. head = head->link;
152. While (head)
153. {
154. printf("%d ", head->info);
155. head = head->link;
156. }
157. printf("\n");
158. }
159.
160. int main()
161. {
162. int i,k,flag=0;
163. DataType x, n;
164. LinkList l;
165. PNode p, q;
166. l = initLinkList();
167. printf("------請輸入單鏈表資料以-1結尾------\n");
168. createLinkList(l);
169. printf("此單鏈表為:\n");
170. printLinkList(l);
171. printf("------插入運算:請選擇 前插法選1 後插法選0------\n");
172. scanf_s("%d", &flag);
173. printf("------請選擇插入位置------\n");
174. scanf_s("%d", &i);
175. p = Locate_i(l, i-1);
176. if (flag==0)
177. {
178. printf("------後插法:輸入x表示插入的數字------\n");
179. scanf_s("%d", &x);
180. insertPost_link(l, p, x);
181. }
182. else if(flag==1)
183. {
184. printf("------前插法:輸入x表示插入的數字------\n");
185. q = locatePre_link(l,p);
186. scanf_s("%d", &x);
187. insertPre_link(l, p, x);
188. }
189. else
190. printf("輸入有誤!!\n");
191. printf("單鏈表此時為:\n");
192. printLinkList(l);
193. printf("------輸入k表示要刪除的資料------\n");
194. scanf_s("%d", &k);
195. deleteLinkList(l, k);
196. printf("單鏈表此時為:\n");
197. printLinkList(l);
198. printf("------輸入查詢的資料n------\n");
199. scanf_s("%d", &n);
200. if (findLinkList(l, n))
201. printf("YES\n");
202. else
203. printf("NO\n");
204. printf("------判斷是否為空連結串列------\n");
205. if (isEmptyLinkList(l))
206. printf("TRUE\n");
207. else
208. printf("FALSE\n");
209. return 0;
210. }
211.