順序隊列與鏈式隊列--C語言實現
阿新 • • 發佈:2019-02-08
兩種 空間 註釋 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語言實現