順序隊列

 /* 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);
 }

 

發佈了146 篇原創文章 · 獲贊 18 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章