Advertisement
eddiehy

phone book sorting+insert

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