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