資料結構-鏈隊的基本操作函式的實現(含全部程式碼)
阿新 • • 發佈:2018-12-10
主要包含以下函式:
- InitQueue(LinkQueue &Q) 引數:鏈隊Q 功能:初始化 時間複雜度O(1)
- EnQueue(LinkQueue &Q,QElemType e) 引數:鏈隊Q,元素e 功能:將e入隊 時間複雜度:O(1)
- DeQueue(LinkQueue &Q,QElemType &e) 引數:鏈隊Q,元素e 功能:隊頭出隊,e接收出隊元素值 時間複雜度O(1)
- GetHead(LinkQueue &Q,QElemType &e) 引數:鏈隊Q,元素e 功能:得到隊頂元素 時間複雜度O(1)
注意:有頭結點
程式碼:
/* Project: single_linked_queue (鏈佇列) Date: 2018/09/17 Author: Frank Yu InitQueue(LinkQueue &Q) 引數:鏈隊Q 功能:初始化 時間複雜度O(1) EnQueue(LinkQueue &Q,QElemType e) 引數:鏈隊Q,元素e 功能:將e入隊 時間複雜度:O(1) DeQueue(LinkQueue &Q,QElemType &e) 引數:鏈隊Q,元素e 功能:隊頭出隊,e接收出隊元素值 時間複雜度O(1) GetHead(LinkQueue &Q,QElemType &e) 引數:鏈隊Q,元素e 功能:得到隊頂元素 時間複雜度O(1) 注意:有頭結點 */ #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<iostream> using namespace std; #define Status int #define QElemType int //鏈隊結點資料結構 typedef struct QNode { QElemType data;//資料域 struct QNode *next;//指標域 }QNode,*QueuePtr; typedef struct { struct QNode *front,*rear;//rear指標指向隊尾 用於入隊 front指標指向隊頭 用於出隊 }LinkQueue; //**************************基本操作函式***************************// //初始化函式 Status InitQueue(LinkQueue &Q) { Q.front=Q.rear=new QNode;//生成新節點作為頭結點,隊頭隊尾指標均指向它 Q.front->next=NULL; return 1; } //入隊函式 Status EnQueue(LinkQueue &Q,QElemType e) { QNode *p; p=new QNode;//生成新節點 p->data=e; //賦值 p->next=NULL; Q.rear->next=p;//加入隊尾 Q.rear=p; //尾指標後移 return 1; } //出隊函式 隊頭出隊用e返回 注意釋放空間 bool DeQueue(LinkQueue &Q,QElemType &e) { QueuePtr p; if(Q.front==Q.rear)return false;//隊空 e=Q.front->next->data; //e返回值 之前寫的Q.front->data 炸了,頭結點沒資料的,一定要注意頭結點 p=Q.front->next; //保留,一會兒釋放空間 Q.front->next=p->next; //出隊,注意Q.front->next 不是Q.front 還有頭結點 if(Q.rear==p)Q.rear=Q.front; //最後一個元素出隊,rear指向頭結點 free(p); return true; } //取隊頂函式 用e返回 bool GetHead(LinkQueue &Q,QElemType &e) { if(Q.front==Q.rear) return false;//佇列為空 e=Q.front->next->data; return true; } //**************************功能實現函式***************************// //選單 void menu() { printf("********1.入隊 2.出隊*********\n"); printf("********3.取隊頂元素 4.退出*********\n"); } //入隊功能函式 呼叫EnQueue函式 void EnterToQueue(LinkQueue &Q) { int n;QElemType e;int flag; printf("請輸入入隊元素個數(>=1):\n"); scanf("%d",&n); for(int i=0;i<n;i++) { printf("請輸入第%d個元素的值:",i+1); scanf("%d",&e); flag=EnQueue(Q,e); if(flag)printf("%d已入隊\n",e); } } //出隊功能函式 呼叫DeQueue函式 void DeleteFromQueue(LinkQueue &Q) { int n;QElemType e;int flag; printf("請輸入出隊元素個數(>=1):\n"); scanf("%d",&n); for(int i=0;i<n;i++) { flag=DeQueue(Q,e); if(flag)printf("%d已出隊\n",e); else {printf("隊已空!!!\n");break;} } } //取隊頂功能函式 呼叫GetHead函式 void GetHeadOfStack(LinkQueue Q) { QElemType e;bool flag; flag=GetHead(Q,e); if(flag)printf("隊頭元素為:%d\n",e); else printf("隊已空!!!\n"); } //主函式 int main() { LinkQueue Q;int choice; InitQueue(Q); while(1) { menu(); printf("請輸入選單序號:\n"); scanf("%d",&choice); if(4==choice) break; switch(choice) { case 1:EnterToQueue(Q);break; case 2:DeleteFromQueue(Q);break; case 3:GetHeadOfStack(Q);break; default:printf("輸入錯誤!!!\n"); } } return 0; }
結果截圖:
有問題請下方評論,轉載請註明出處,並附有原文連結,謝謝!如有侵權,請及時聯絡。