/* c3-3.h 隊列的順序存儲結構(可用於循環隊列和非循環隊列) */ #define MAXQSIZE 5 /* 最大隊列長度(對於循環隊列,最大隊列長度要減1) */ typedef struct { QElemType *base; /* 初始化的動態分配存儲空間 */ int front; /* 頭指針,若隊列不空,指向隊列頭元素 */ int rear; /* 尾指針,若隊列不空,指向隊列尾元素的下一個位置 */ }SqQueue;
/* bo3-4.c 順序隊列(非循環,存儲結構由c3-3.h定義)的基本操作(9個) */ Status InitQueue(SqQueue *Q) { /* 構造一個空隊列Q */ (*Q).base=(QElemType *)malloc(MAXQSIZE*sizeof(QElemType)); if(!(*Q).base) /* 存儲分配失敗 */ exit(OVERFLOW); (*Q).front=(*Q).rear=0; return OK; } Status DestroyQueue(SqQueue *Q) { /* 銷燬隊列Q,Q不再存在 */ if((*Q).base) free((*Q).base); (*Q).base=NULL; (*Q).front=(*Q).rear=0; return OK; } Status ClearQueue(SqQueue *Q) { /* 將Q清爲空隊列 */ (*Q).front=(*Q).rear=0; return OK; } Status QueueEmpty(SqQueue Q) { /* 若隊列Q爲空隊列,則返回TRUE,否則返回FALSE */ if(Q.front==Q.rear) /* 隊列空的標誌 */ return TRUE; else return FALSE; } int QueueLength(SqQueue Q) { /* 返回Q的元素個數,即隊列的長度 */ return(Q.rear-Q.front); } Status GetHead(SqQueue Q,QElemType *e) { /* 若隊列不空,則用e返回Q的隊頭元素,並返回OK,否則返回ERROR */ if(Q.front==Q.rear) /* 隊列空 */ return ERROR; *e=*(Q.base+Q.front); return OK; } Status EnQueue(SqQueue *Q,QElemType e) { /* 插入元素e爲Q的新的隊尾元素 */ if((*Q).rear>=MAXQSIZE) { /* 隊列滿,增加1個存儲單元 */ (*Q).base=(QElemType *)realloc((*Q).base,((*Q).rear+1)*sizeof(QElemType)); if(!(*Q).base) /* 增加單元失敗 */ return ERROR; } *((*Q).base+(*Q).rear)=e; (*Q).rear++; return OK; } Status DeQueue(SqQueue *Q,QElemType *e) { /* 若隊列不空,則刪除Q的隊頭元素,用e返回其值,並返回OK,否則返回ERROR */ if((*Q).front==(*Q).rear) /* 隊列空 */ return ERROR; *e=(*Q).base[(*Q).front]; (*Q).front=(*Q).front+1; return OK; } Status QueueTraverse(SqQueue Q,void(*vi)(QElemType)) { /* 從隊頭到隊尾依次對隊列Q中每個元素調用函數vi()。一旦vi失敗,則操作失敗 */ int i; i=Q.front; while(i!=Q.rear) { vi(*(Q.base+i)); i++; } printf("\n"); return OK; }
/* main3-4.c 順序隊列(非循環),檢驗bo3-4.c的主程序 */ #include"c1.h" typedef int QElemType; #include"c3-3.h" #include"bo3-4.c" void visit(QElemType i) { printf("%d ",i); } void main() { Status j; int i,n; QElemType d; SqQueue Q; InitQueue(&Q); printf("初始化隊列後,隊列空否?%u(1:空 0:否)\n",QueueEmpty(Q)); printf("隊列長度爲:%d\n",QueueLength(Q)); printf("請輸入隊列元素個數n: "); scanf("%d",&n); printf("請輸入%d個整型隊列元素:\n",n); for(i=0;i<n;i++) { scanf("%d",&d); EnQueue(&Q,d); } printf("隊列長度爲:%d\n",QueueLength(Q)); printf("現在隊列空否?%u(1:空 0:否)\n",QueueEmpty(Q)); printf("現在隊列中的元素爲: \n"); QueueTraverse(Q,visit); DeQueue(&Q,&d); printf("刪除隊頭元素%d\n",d); printf("隊列中的元素爲: \n"); QueueTraverse(Q,visit); j=GetHead(Q,&d); if(j) printf("隊頭元素爲: %d\n",d); else printf("無隊頭元素(空隊列)\n"); ClearQueue(&Q); printf("清空隊列後, 隊列空否?%u(1:空 0:否)\n",QueueEmpty(Q)); j=GetHead(Q,&d); if(j) printf("隊頭元素爲: %d\n",d); else printf("無隊頭元素(空隊列)\n"); DestroyQueue(&Q); }