串列實作佇列
說明
建構出以學生姓名和成績為節點的佇列。
思路
以鏈結串列建立佇列,概念大致和上一篇:陣列實作串列 相同。
建構出以學生姓名和成績為節點的佇列。
思路
以鏈結串列建立佇列,概念大致和上一篇:陣列實作串列 相同。
#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; // 往下一個移動 } } }
留言
張貼留言