1. 程式人生 > >順序隊列與鏈式隊列--C語言實現

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

兩種 空間 註釋 err 一個 實現 ret 若是 語言

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

順序隊列

 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 }

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