串列實作佇列

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

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


#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct student
{
  char name[20];
  int score;
  struct student *next;
}node;

node *front = NULL;    // 先都指向 NULL
node *rear = NULL;

int enqueue(char[], int);  // 新增
int dequeue();     // 刪除 推第一個出來
int show();

int main(void)
{
  int score, select;
  char name[20];
 
 do
 {
   printf("請輸入 1. 新增  2. 刪除  3. 顯示  4. 結束: ");
   scanf("%d", &select);
   switch(select)
   {
    case 1:
      printf("請輸入姓名 成績: ");
      scanf("%s %d", &name, &score);
      enqueue(name, score);    // 存進去
      break;
    case 2:
      dequeue();
      break;
    case 3:
      show();
      break; 
   }
 } while(select != 4);
 
 return 0;
}

int enqueue(char name[], int score)
{
  node *newnode = (node *)malloc(sizeof(node));
  newnode->score = score;
  strcpy(newnode->name, name);
 
  if(rear == NULL)
    front = newnode;   // 代表此時 newnode 為第一個元素 
  else
    rear->next = newnode;  
  
  rear = newnode;     // 處理完後 rear 指向最新(最後放入)的元素 也就是 newnode 
  newnode->next = NULL; 
} 

int dequeue()
{
  node *temp;
  if(front == NULL)
    printf("佇列已空\n");  // 兩種情況: 1.佇列根本沒存東西 2.佇列裡的東西已經被刪光 
  else
  {
    printf("取出的姓名和成績為: %s  %d\n", front->name, front->score);
    temp = front;
    front = front->next;
    free(temp);      // 記得 free 掉 
  } 
}

int show()
{
  node *ptr = front;    // 走訪不要亂動到 front  改用 ptr 來操作
  if(ptr == NULL)
    printf("佇列已空\n");
  else
  { 
    while(ptr != NULL)
    {
     printf("姓名: %s  成績: %d\n", ptr->name, ptr->score);
     ptr = ptr->next;  // 往下一個移動 
    } 
  }
}

留言

這個網誌中的熱門文章

離散數學筆記 — vertex cut

機率筆記 (1)

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