數據結構 | 鏈表隊列(基本操作及圖示)


————————————————————————————————————————————

基本概念:

  • 和棧相反,隊列是一種先進先出(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 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM