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