串列實作佇列

說明
建構出以學生姓名和成績為節點的佇列。

思路
以鏈結串列建立佇列,概念大致和上一篇:陣列實作串列 相同。


  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4.  
  5. typedef struct student
  6. {
  7. char name[20];
  8. int score;
  9. struct student *next;
  10. }node;
  11.  
  12. node *front = NULL; // 先都指向 NULL
  13. node *rear = NULL;
  14.  
  15. int enqueue(char[], int); // 新增
  16. int dequeue(); // 刪除 推第一個出來
  17. int show();
  18.  
  19. int main(void)
  20. {
  21. int score, select;
  22. char name[20];
  23. do
  24. {
  25. printf("請輸入 1. 新增 2. 刪除 3. 顯示 4. 結束: ");
  26. scanf("%d", &select);
  27. switch(select)
  28. {
  29. case 1:
  30. printf("請輸入姓名 成績: ");
  31. scanf("%s %d", &name, &score);
  32. enqueue(name, score); // 存進去
  33. break;
  34. case 2:
  35. dequeue();
  36. break;
  37. case 3:
  38. show();
  39. break;
  40. }
  41. } while(select != 4);
  42. return 0;
  43. }
  44.  
  45. int enqueue(char name[], int score)
  46. {
  47. node *newnode = (node *)malloc(sizeof(node));
  48. newnode->score = score;
  49. strcpy(newnode->name, name);
  50. if(rear == NULL)
  51. front = newnode; // 代表此時 newnode 為第一個元素
  52. else
  53. rear->next = newnode;
  54. rear = newnode; // 處理完後 rear 指向最新(最後放入)的元素 也就是 newnode
  55. newnode->next = NULL;
  56. }
  57.  
  58. int dequeue()
  59. {
  60. node *temp;
  61. if(front == NULL)
  62. printf("佇列已空\n"); // 兩種情況: 1.佇列根本沒存東西 2.佇列裡的東西已經被刪光
  63. else
  64. {
  65. printf("取出的姓名和成績為: %s %d\n", front->name, front->score);
  66. temp = front;
  67. front = front->next;
  68. free(temp); // 記得 free 掉
  69. }
  70. }
  71.  
  72. int show()
  73. {
  74. node *ptr = front; // 走訪不要亂動到 front 改用 ptr 來操作
  75. if(ptr == NULL)
  76. printf("佇列已空\n");
  77. else
  78. {
  79. while(ptr != NULL)
  80. {
  81. printf("姓名: %s 成績: %d\n", ptr->name, ptr->score);
  82. ptr = ptr->next; // 往下一個移動
  83. }
  84. }
  85. }

留言

這個網誌中的熱門文章

機率筆記 (1)

離散數學筆記 — vertex cut

機率筆記 (4) — 隨機變數