Advertisement
eddiehy

linklist

Nov 22nd, 2015
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.33 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. struct _node
  4. {
  5. int data;
  6. struct _node* next;
  7. };
  8.  
  9. typedef struct _node node;
  10.  
  11. node* getnode () /* 此函數產生一個新節點 */
  12. {
  13. node *p;
  14. p = (node *) malloc(sizeof(node));
  15. /* malloc 會動態地配置大小為sizeof 的記憶體*/
  16. /* sizeof 會傳回一個型態為node之值*/
  17. if ( p == NULL)
  18. {
  19. printf ("記憶體不足");
  20. return NULL;
  21. }
  22. return(p);
  23. }
  24.  
  25. void freenode (node *p) /* 此函數將節點還給記憶體 */
  26. {
  27. free(p);
  28. }
  29.  
  30. void freeall(node *head)
  31. {
  32. node *q = head;
  33. while (q != NULL)
  34. {
  35. q = q->next;
  36. free(head);
  37. head=q;
  38. }
  39. }
  40. node* insert_node (node *head, node *ptr, node data)
  41. {
  42. node *new_node; /* 新節點指標變數 */
  43. new_node = getnode(); /* 建立新節點,取得一個可用節點 */
  44. *new_node = data; /* 建立節點內容 */
  45. new_node->next = NULL; /* 設定指標初值 */
  46. if ( ptr == NULL ) /* 指標ptr是否是NULL */
  47. {
  48. /* 第一種情況: 插入第一個節點 */
  49. new_node->next = head; /* 新節點成為串列開始 */
  50. head = new_node;
  51. }
  52. else
  53. {
  54. if ( ptr->next == NULL ) /* 是否是串列結束 */
  55. /* 第二種情況: 插入最後一個節點 */
  56. {ptr->next = new_node;} /* 最後指向新節點 */
  57. else
  58. {
  59. /* 第三種情況: 插入成為中間節點 */
  60. new_node->next = ptr->next; /* (3) 新節點指向下一節點 (3)*/
  61. ptr->next = new_node; /* 節點ptr指向新節點 (4)*/
  62. }
  63. }
  64. return (head);
  65. }
  66.  
  67. node* find_node(node *head, int num)
  68. {
  69. node *ptr;
  70. ptr = head; /* 指向串列起始 */
  71. while ( ptr != NULL ) /* 走訪串列 */
  72. {
  73. if ( ptr->data == num ) /* 找尋data */
  74. {return (ptr);}
  75. ptr = ptr->next; /* 指向下一節點 */
  76. }
  77. return (ptr);
  78. }
  79.  
  80. node* delete_node(node *head, node *ptr)
  81. {
  82. node *previous; /* 指向前一節點 */
  83. if ( ptr == head ) /* 是否是串列開始 */
  84. /* 第一種情況: 刪除第一個節點 */
  85. {head = head->next;}
  86. else
  87. {
  88. previous = head;
  89. while ( previous->next != ptr ) /* 找節點ptr的前節點 */
  90. previous = previous->next;
  91. if ( ptr->next == NULL ) /* 是否是串列結束 */
  92. /* 第二種情況: 刪除最後一個節點 */
  93. {previous->next = NULL;} /* 最後一個節點 */
  94. else
  95. /* 第三種情況: 刪除中間節點 */
  96. {previous->next = ptr->next;} /* 圖(3)之步驟(1) */
  97. }
  98. freenode(ptr); /* 此函數將節點歸還給記憶體 */
  99. return(head);
  100. }
  101.  
  102. int length (node *head ) /* 此函數計算節點之鏈結長度 */
  103. {
  104. int num=0;
  105. node *q = head;
  106. while (q != NULL)
  107. {
  108. num ++;
  109. q = q->next;
  110. }
  111. return(num);
  112. }
  113.  
  114. int main()
  115. {
  116. node n;
  117. node *ptr,*head;
  118. head = NULL;
  119. ptr=NULL;
  120.  
  121. while(1)
  122. {
  123. /*
  124. printf("i 插入\n");
  125. printf("l 列印\n");
  126. printf("d 刪除\n");
  127. printf("f 尋找\n");
  128. printf("q 離開\n");
  129. */
  130. //char key;
  131. int key;
  132. int value;
  133. fflush(stdin); //用scanf還是會遇到暫存區問題
  134. //key = getchar();
  135. scanf("%d",&key);
  136. switch(key)
  137. {
  138. //case 'i'://insert
  139. case 1:
  140. scanf("%d", &value);
  141. n.data = value;
  142. ptr=head;
  143. if (head==NULL)
  144. {
  145. head = insert_node(head,NULL,n);
  146. }
  147. else
  148. {
  149. while (ptr->next !=NULL)
  150. {ptr=ptr->next;}
  151. head=insert_node(head,ptr,n);
  152. }
  153. break;
  154.  
  155. //case 'l'://print
  156. case 6:
  157. ptr=head;
  158. while(ptr!=NULL)
  159. {
  160. printf("%d ", ptr->data);
  161. ptr=ptr->next;
  162. }
  163. printf("\n");
  164. break;
  165. //case 'd'://delte
  166. case 2:
  167. scanf("%d",&value);
  168. ptr = find_node(head, value);
  169. if(ptr != NULL)
  170. {
  171. head = delete_node(head, ptr);
  172. printf("Delete ok\n");
  173. }
  174. else
  175. {printf("Can not delete\n");}
  176. break;
  177. //case 'f'://find
  178. case 3:
  179. scanf("%d",&value);
  180. ptr = find_node(head, value);
  181. if(ptr != NULL)
  182. {printf("found %d\n", ptr->data);}
  183. else
  184. {printf("Not found\n");}
  185. break;
  186. //case 'q':
  187. case 4:
  188. freeall(head);
  189. return 0;
  190. case 5:
  191. if(head!=NULL)
  192. {printf("%d\n",length(head));}
  193. else
  194. {printf("0");}
  195. break;
  196. case 'c':
  197. printf("要插入後方的節點:");
  198. scanf("%d",&vakye);
  199. ptr=find_node(head,value);
  200. if(ptr!=null)
  201. {
  202. scanf("%d",&vakye);
  203. n.data=value;
  204. head=insert_node(head,ptr,value);
  205. }
  206. }
  207. //system("pause");
  208. //system("cls");
  209. }
  210. return 0;
  211. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement