————————————————————————————————————————————
基本概念:
- 和棧相反,隊列是一種先進先出(FIFO)的線性表。只允許在一端插入,在另一端刪除。
-
允許插入的叫"隊尾"(rear),允許刪除的叫"隊頭"(front)。
- 使用場景:操作系統的作業排隊。在允許多道程序運行的計算機系統中,同時有幾個作業運行。如果運行結果都需要通道輸出,則按照請求輸出的先后次序排隊。每當通道傳輸完畢可以接受新的輸出任務時,隊頭的作業先從隊列中退出作輸出操作。申請輸出的作業都從隊尾進入。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
基本操作:
/* 定義鏈表隊列 */
struct Node //結構體存放節點
struct LinkQueue //存放隊頭指針和隊尾指針,不存放在Node中是為了節省節點入隊時占用的內存空間
/* 初始化隊列 */
隊頭指針和隊尾指針共同申請一個內存空間
節點下一節指向NULL
注意:頭結點的數據為空
/* 入隊操作 */
申請新節點
輸入的數據elem存放在新節點數據中
新節點下一節指向NULL
尾節點的下一節點指向新節點
隊尾指針指向新節點
/* 出隊操作 */
節點指針p指向隊頭結點
隊頭結點指向第一節點
釋放指針p指向的節點
p指向NULL //避免野指針
/* 打印操作 */
由於頭節點為空,所以從第二節點開始打印,直到指向NULL時停止打印
實現代碼:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #define OK 1 4 #define ERROE 0 5 #define OVERFLOW -2 6 typedef int Status; 7 typedef int QElemType; 8 typedef struct Node 9 { 10 QElemType data; 11 struct Node *next; 12 } QNode; 13 /* 當鏈式隊列的頭尾節點指針定義成為一個單獨的結構體,避免在新增節點時占用過多的空間 */ 14 typedef struct 15 { 16 QNode *front; 17 QNode *rear; 18 } LinkQueue; 19 Status InitQueue(LinkQueue *Q) 20 { 21 Q->front = Q->rear = (QNode *)malloc(sizeof(QNode)); 22 if (!Q->front) 23 exit(OVERFLOW); 24 Q->rear->next = NULL; //rear.next始終指向NULL,頭結點front不動 25 return OK; 26 } 27 Status InQueue (LinkQueue *Q, int elem) 28 { 29 QNode *p; 30 p = (QNode *)malloc(sizeof(QNode)); 31 p->data = elem; 32 p->next = NULL; 33 Q->rear->next = p; 34 Q->rear = p; 35 return OK; 36 } 37 Status PrintQueue(LinkQueue Q) 38 { 39 QNode *p; 40 p = Q.front->next; 41 printf("the queue is:"); 42 while(p != NULL) 43 { 44 printf("%d ", p->data); 45 p = p->next; 46 } 47 return OK; 48 } 49 Status OutQueue(LinkQueue *Q) 50 { 51 QNode *p; 52 int i; 53 printf("\nthe number of out queue:"); 54 scanf("%d", &i); 55 while(i != 0) 56 { 57 p = Q->front; 58 Q->front = Q->front->next; 59 free(p); 60 i--; 61 } 62 p = NULL; 63 return OK; 64 } 65 Status EmptyQueue(LinkQueue Q) 66 { 67 if (Q.front->next == NULL) 68 printf("\nThe queue is empty!\n"); 69 return OK; 70 } 71 int main() 72 { 73 LinkQueue queue; 74 InitQueue(&queue); 75 int elem; 76 printf("input:"); 77 while(scanf("%d", &elem) != EOF) 78 { 79 InQueue(&queue, elem); 80 } 81 PrintQueue(queue); 82 OutQueue(&queue); 83 PrintQueue(queue); 84 EmptyQueue(queue); 85 return OK; 86 }