1. 程式人生 > >關於連結串列的C語言實現(初級)

關於連結串列的C語言實現(初級)

好好努力堅持吧,大概演算法什麼的,會是能貫穿自己一輩子的事情

連結串列操作(實驗名稱)
一、實驗目的
掌握連結串列的基本演算法並完成對連結串列各個功能的實現

二、實驗內容
連結串列的基本運算實現,要求至少具有以下功能:
(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.

這裡寫圖片描述