迴圈佇列的儲存結構
阿新 • • 發佈:2018-11-07
CylSeqQuene.h檔案
/************************************** 檔案位置:3 棧和佇列\CylSeqQuene 檔名稱及型別:CylSeqQuene.h 實現功能:迴圈佇列的儲存結構 ***************************************/ #include"..\..\1 緒論\StartDefine\StartDefine.h" #define MAXQSIZE 100 //最大佇列長度 typedef int QElemType;//迴圈佇列型別定義 typedef struct{ QElemType *base;//初始化的動態分配儲存空間 int front;//頭指標,若佇列不空,指向佇列頭元素 int rear;//尾指標,若佇列不空,指向佇列尾元素的下一個位置 }SqQueue; //構造一個空佇列 Status InitQueue(SqQueue &Q); //佇列Q被摧毀,不再存在 void DestroyQueue(SqQueue &Q); //將Q清為空佇列 Status ClearQueue(SqQueue &Q); //判斷佇列是否為空,是的話返回TRUE,否則返回FALSE Status QueueEmpty(SqQueue Q); //返回佇列的元素個數,即佇列長度 int QueueLength(SqQueue Q); //用e返回Q的隊頭元素 Status GetHead(SqQueue Q,QElemType &e); //插入元素e為新的隊尾元素 Status EnQueue(SqQueue &Q,QElemType e); //刪除Q的隊頭元素,並用e返回其值 Status DeQueue(SqQueue &Q,QElemType &e); //從隊頭到隊尾,依次對Q中的資料元素呼叫函式visit(),一旦visit()失敗,則操作失敗 void QueueTraverse(SqQueue Q,void(*visit)(QElemType));
CylSeqQuene.cpp檔案
/************************************** 檔案位置:3 棧和佇列\CylSeqQuene 檔名稱及型別:CylSeqQuene.cpp 實現功能:迴圈佇列的儲存結構的實現 ***************************************/ #include"CylSeqQueue.h" //構造一個空佇列 Status InitQueue(SqQueue &Q){ Q.base=(QElemType*)malloc(MAXQSIZE*sizeof(QElemType)); if(!Q.base) exit(OVERFLOW);//儲存分配失敗 Q.front=Q.rear=0; return OK; } //佇列Q被摧毀,不再存在 void DestroyQueue(SqQueue &Q){ if(Q.base) free(Q.base); Q.base=NULL; Q.front=Q.rear=0; } //將Q清為空佇列 Status ClearQueue(SqQueue &Q){ Q.front=Q.rear=0; } //判斷佇列是否為空,是的話返回TRUE,否則返回FALSE Status QueueEmpty(SqQueue Q){ if(Q.front==Q.rear) return TRUE; else return ERROR; } //返回佇列的元素個數,即佇列長度 int QueueLength(SqQueue Q){ return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE; } //用e返回Q的隊頭元素 Status GetHead(SqQueue Q,QElemType &e){ if(Q.front==Q.rear) return ERROR; e=Q.base[Q.front]; return OK; } //插入元素e為新的隊尾元素 Status EnQueue(SqQueue &Q,QElemType e){ if((Q.rear+1)%MAXQSIZE==Q.front)//隊滿 return ERROR; Q.base[Q.rear]=e; Q.rear=(Q.rear+1)%MAXQSIZE; return OK; } //刪除Q的隊頭元素,並用e返回其值 Status DeQueue(SqQueue &Q,QElemType &e){ if(Q.front==Q.rear)//判空 return ERROR; e=Q.base[Q.front]; Q.front=(Q.front+1)%MAXQSIZE; return OK; } //從隊頭到隊尾,依次對Q中的資料元素呼叫函式visit(),一旦visit()失敗,則操作失敗 void QueueTraverse(SqQueue Q,void(*visit)(QElemType)){ int i=Q.front; while(i!=Q.rear){ visit(Q.base[i]); i=(i+1)%MAXQSIZE; } }
CylSeqQuene-Test.cpp檔案
/************************************** 檔案位置:3 棧和佇列\CylSeqQuene 檔名稱及型別:CylSeqQuene-Test.cpp 實現功能:迴圈佇列的儲存結構的測試 ***************************************/ #include"CylSeqQueue.cpp" int main(){ SqQueue Q; int i; QElemType e; void PrintElem(QElemType e); printf("函式InitQueue測試...\n"); printf("初始化迴圈佇列..."); InitQueue(Q); printf("\n"); printf("函式QueueEmpty測試...\n"); QueueEmpty(Q)?printf("迴圈佇列為空\n"):printf("迴圈佇列不為空"); printf("函式EnQueue測試...\n"); for(int i=1;i<=6;i++){ printf("將%d插入到佇列Q...",2*i); EnQueue(Q,2*i); printf("累計插入%d個元素\n",(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE); } printf("\n"); printf("函式QueueTraverse測試...\n"); QueueTraverse(Q,PrintElem); printf("\n"); printf("函式QueueLength測試...\n"); printf("佇列中元素的個數為%d\n",QueueLength(Q)); printf("函式DeQueue測試...\n"); DeQueue(Q,e); printf("刪除的元素為%d\n",e); GetHead(Q,e); printf("此時佇列頭的元素為%d\n",e); printf("函式ClearQueue測試...\n"); ClearQueue(Q); QueueEmpty(Q)?printf("迴圈佇列為空\n"):printf("迴圈佇列不為空"); printf("函式DestroyQueue測試...\n"); DestroyQueue(Q); Q.base==NULL?printf("迴圈佇列已不存在\n"):printf("迴圈佇列還存在"); } //定義輸出函式 void PrintElem(QElemType e){ printf("%d ",e); }