佇列的鏈式建立和操作
阿新 • • 發佈:2019-02-05
之前完成了堆疊的建立和操作,現在開始實現佇列
佇列是:具有一定操作約束的線性表
其插入和刪除操作:只能在一端插入,而在另一端刪除
資料插入:入佇列
資料刪除:出佇列
先來先服務
先進先出:FIFO(First In First Out)
型別名稱:佇列(Queue)
資料物件集:一個有0個或者多個元素的有窮線性表
操作集,佇列Q∈Queue,元素item∈ElementType
1.Queue CreateQueue();生成空佇列
2.int IsFullQ(Queue Q);判斷佇列Q是否已滿
3.void AddQ(Queue Q,ElementType item);將元素item插入佇列Q中
4.int IsEmpty(Queue Q);判斷佇列Q是否為空
5.ElmentType DeleteQ(Queue Q);將隊頭元素從佇列中刪除並返回
注意佇列始終是從front一段刪除,並且從rear一段插入,因為如果從rear一段刪除會找不到其上一個節點
上面的程式碼已經把佇列的鏈式表示基本的函式全部包含在內了,下面是執行結果#include <stdio.h> #include <stdlib.h> #define ERROR 0 struct Node{ int Data; struct Node *Next; }; struct QNode{ struct Node *rear; struct Node *front; }; typedef struct QNode *Queue; //建立佇列 Queue CreateQueue(); //刪除佇列頭元素 int DeleteQ(Queue PtrQ); //在隊尾插入元素 void InsertQ(int item,Queue PtrQ); //列印佇列 void Print(Queue PtrQ); //判斷是否空 int IsEmpty(Queue Q); int main() { Queue PtrQ=CreateQueue(); Print(PtrQ); InsertQ(1,PtrQ); InsertQ(2,PtrQ); InsertQ(3,PtrQ); Print(PtrQ); DeleteQ(PtrQ); Print(PtrQ); InsertQ(1,PtrQ); Print(PtrQ); DeleteQ(PtrQ); DeleteQ(PtrQ); DeleteQ(PtrQ); Print(PtrQ); return 0; } Queue CreateQueue(){ Queue PtrQ; PtrQ=(Queue)malloc(sizeof(struct QNode)); struct Node *rear; struct Node *front; rear =(Node*)malloc(sizeof(struct Node)); rear=NULL; front =(Node*)malloc(sizeof(struct Node)); front=NULL; PtrQ->front=front; PtrQ->rear=rear; return PtrQ; }; int DeleteQ(Queue PtrQ){ struct Node *FrontCell; int FrontElem; if(IsEmpty(PtrQ)){ printf("佇列空"); return ERROR; } FrontCell=PtrQ->front; if(PtrQ->front==PtrQ->rear) PtrQ->front=PtrQ->rear=NULL; else{ PtrQ->front=PtrQ->front->Next; } FrontElem=FrontCell->Data; free(FrontCell); return FrontElem; } void InsertQ(int item,Queue PtrQ){ struct Node *FrontCell; FrontCell=(Node*)malloc(sizeof(struct Node)); FrontCell->Data=item; FrontCell->Next=NULL; if(IsEmpty(PtrQ)){ PtrQ->front=FrontCell; PtrQ->rear=FrontCell; } else{ PtrQ->rear->Next=FrontCell; PtrQ->rear=FrontCell; } }; void Print(Queue PtrQ) { struct Node *Q1; Q1 = PtrQ->front; if (Q1 == NULL) { printf("NULL\n"); return; } while (Q1 != PtrQ->rear) { printf("%d ", Q1->Data); Q1 =Q1->Next; } printf("%d", Q1->Data); putchar('\n'); } int IsEmpty(Queue Q){ return(Q->front==NULL); };