順序隊列與鏈式隊列--C語言實現


關於隊列,因為我自己在平時使用不多,所以在這里直接將隊列的兩種存儲方式放在一起,作為一篇隨筆,這兩份代碼均可直接運行,親測。注釋寫的應該也算比較詳細了,就不過多的解釋了

 

順序隊列

 1 #include<stdio.h>
 2 #define MAXSIZE 100                            //隊列最大空間
 3 typedef int QElemType;                        //隊列中元素類型
 4 typedef int Status;                            //返回值類型
 5 #define OK 1                                //操作成功
 6 #define ERROR 0                                //操作失敗
 7 
 8 typedef struct                                //隊列結點結構
 9 {
10     QElemType date[MAXSIZE];                //結點元素
11     int front;                                //隊頭
12     int rear;                                //隊尾
13 }SqQueue;
14 
15 /*隊列的初始化*/
16 Status InitQue(SqQueue *Q)                    
17 {                                            //因為這是一個int型隊列,,所以
18     Q->front = 0;                            //隊頭指向0
19     Q->rear = 0;                            //隊尾指向0
20     return OK;
21 }
22 
23 /*隊列的入隊操作*/
24 Status EnQueue(SqQueue *Q, QElemType e)
25 {
26     if((Q->rear + 1) % MAXSIZE == Q->front)                //判斷隊列是否已滿
27         return ERROR;
28     Q->date[Q->rear] = e;                                //隊尾賦值為e
29     Q->rear = (Q->rear + 1) % MAXSIZE;                    //隊尾后移
30     return OK;
31 }
32 
33 /*隊列的出隊操作*/
34 Status DeQueue(SqQueue *Q, QElemType *e)
35 {
36     if(Q->front == Q->rear)                                //判斷隊列是否為空
37         return ERROR;
38     *e = Q->date[Q->front];                                //將隊頭元素取出
39     Q->front = (Q->front + 1) % MAXSIZE;                //隊頭后移
40     return OK;
41 }
42 
43 /*獲取隊列的長度*/
44 int LengthQue(SqQueue Q)
45 {
46     return (Q.rear - Q.front + MAXSIZE) % MAXSIZE;
47 }
48 
49 void main()
50 {
51     SqQueue Q;            //創建隊Q
52     int e;                //入隊與出隊的元素
53 
54     while(true)
55     {
56         printf("請選擇對順序棧的操作:\n");
57         printf("1.初始化\n");
58         printf("2.入隊\n");
59         printf("3.出隊\n");
60         printf("4.隊列長度\n");
61         printf("5.退出\n");
62         int a;
63         scanf("%d", &a);
64         switch(a)
65         {
66             case 1:
67                 if(InitQue(&Q))
68                     printf("初始化成功\n");
69                 else
70                     printf("初始化失敗\n");
71                 break;
72             case 2:
73                 printf("請輸入入隊的元素:");
74                 scanf("%d", &e);
75                 if(EnQueue(&Q, e))
76                     printf("入隊成功\n");
77                 else
78                     printf("入隊失敗\n");
79                 break;
80             case 3:
81                 if(DeQueue(&Q, &e))
82                     printf("出隊的元素為:%d\n",e);
83                 else
84                     printf("隊空\n");
85                 break;
86             case 4:
87                 printf("當前隊列長度為:%d\n",LengthQue(Q));
88                 break;
89             case 5:
90                 return;
91             default:
92                 printf("選擇錯誤\n");
93                 break;
94         }
95     }
96 }

 

鏈式隊列

  1 #include<stdio.h>
  2 #include<malloc.h>
  3 typedef int QElemType;                    //隊列的結點元素類型
  4 typedef int Status;                        //函數返回值類型
  5 #define OK 1                            //操作成功返回值
  6 #define ERROR 0                            //操作失敗返回值
  7 
  8 typedef struct QNode                    //結點結構體
  9 {
 10     QElemType date;                        //結點數據
 11     struct QNode *next;                    //結點指針
 12 }QNode, *LinkQuePtr;                            //結點名
 13 
 14 typedef struct                            //鏈隊結構體
 15 {
 16     LinkQuePtr front;                    //隊頭結點
 17     LinkQuePtr rear;                    //隊尾結點
 18 }LinkQue;                                //隊名
 19 
 20 LinkQuePtr head = (LinkQuePtr)malloc(sizeof(QNode));                        //頭結點
 21 
 22 /*鏈隊的初始化*/
 23 Status InitQue(LinkQue *Q)
 24 {
 25     Q->front = head;                    //使頭結點指向空
 26     Q->rear = head;                        //使尾結點指向空
 27     return OK;
 28 }
 29 
 30 /*鏈隊的入隊操作*/
 31 Status EnQueue(LinkQue *Q, QElemType e)
 32 {
 33     LinkQuePtr s = (LinkQuePtr)malloc(sizeof(QNode));            //申請新結點空間
 34     if(!s)
 35         return ERROR;
 36     s->date = e;                        //新結點的數據等於e
 37     s->next = NULL;                        //新結點的指針指向空
 38     Q->rear->next = s;                    //原隊尾結點的指針指向新結點
 39     Q->rear = s;                        //隊尾指針指向新結點(使新結點成為隊尾結點)
 40     return OK;
 41 }
 42 
 43 /*鏈隊的出隊操作*/
 44 Status DeQueue(LinkQue *Q, QElemType *e)
 45 {
 46     if(Q->front == Q->rear)                //判斷隊列是否為空
 47         return ERROR;
 48     LinkQuePtr s = (LinkQuePtr)malloc(sizeof(QNode));        //申請結點空間s
 49     s = Q->front->next;                    //s結點等於隊頭結點(頭指針所指向的結點)
 50     *e = s->date;                        //e等於s結點的數據域
 51     Q->front->next = s->next;            //頭結點的指針指向s結點的下一結點(使s結點的下一結點成為隊頭元素)
 52     if(Q->rear == s)                    //判斷s是否為隊尾元素,若是,說明隊列中僅有一個結點
 53         Q->rear = Q->front;                //使隊尾結點指向頭結點
 54     free(s);                            //釋放s結點
 55     return OK;
 56 }
 57 
 58 void main()
 59 {
 60     LinkQue Q;            //創建隊Q
 61     int e;                //入隊與出隊的元素
 62 
 63     while(true)
 64     {
 65         printf("請選擇對順序棧的操作:\n");
 66         printf("1.初始化\n");
 67         printf("2.入隊\n");
 68         printf("3.出隊\n");
 69 //        printf("3.遍歷\n");
 70         printf("4.退出\n");
 71         int a;
 72         scanf("%d", &a);
 73         switch(a)
 74         {
 75             case 1:
 76                 if(InitQue(&Q))
 77                     printf("初始化成功\n");
 78                 else
 79                     printf("初始化失敗\n");
 80                 break;
 81             case 2:
 82                 printf("請輸入入隊的元素:");
 83                 scanf("%d", &e);
 84                 if(EnQueue(&Q, e))
 85                     printf("入隊成功\n");
 86                 else
 87                     printf("入隊失敗\n");
 88                 break;
 89             case 3:
 90                 if(DeQueue(&Q, &e))
 91                     printf("出隊的元素為:%d\n",e);
 92                 else
 93                     printf("隊空\n");
 94                 break;
 95             case 4:
 96                 return;
 97             default:
 98                 printf("選擇錯誤\n");
 99                 break;
100         }
101     }
102 }

 


免責聲明!

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



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