考研資料結構複習——佇列(順序結構)(迴圈佇列)
阿新 • • 發佈:2018-12-12
/** ***@Title :考研資料結構複習 ***@Subject :佇列(順序結構)(迴圈佇列) ***@Author :lxfhahaha ***@language: C語言 ***@Time : 2018/9/29 16:22 *****/ #include <stdio.h> #include <stdlib.h> #include <time.h> #define Inital_Size 50 #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 typedef int Bool; typedef int QElemType; typedef int Status; //考慮假溢位的情況,這裡採用迴圈佇列 //並規定最後一位不使用資料 typedef struct { int rear; int front; QElemType *data; int queuesize; //當前已分配的儲存空間 }Queue; //操作結果:構造一個空佇列queue Status InitQueue(Queue *queue){ queue->data=(QElemType*)malloc(Inital_Size*sizeof(QElemType)); if(!queue->data){ printf("Malloc Error!\n"); exit(0); } queue->rear=0; queue->front=0; queue->queuesize=Inital_Size; return OK; } //銷燬佇列,queue不再存在 Status DestroyQueue(Queue *queue){ free(queue->data); queue->data=NULL; queue->rear=0; queue->front=0; queue->queuesize=0; return OK; } //把queue置為空棧 Status ClearQueue(Queue *queue){ if(!queue->data){ printf("Error!! Please inital first!!\n"); return ERROR; } queue->rear=0; queue->front=0; return OK; } //若queue為空,返回TRUE,非空返回FALSE Bool QueueEmpty(Queue queue){ if(!queue.data){ printf("Error!! Please inital first!!\n"); exit(0); } return queue.front==queue.rear ? TRUE : ERROR; } //返回queue中資料元素個數 int QueueLength(Queue queue){ if(!queue.data){ printf("Error!! Please inital first!!\n"); exit(0); } return (queue.rear-queue.front+queue.queuesize) % queue.queuesize; //return queue.rear >= queue.front ? queue.rear-queue.front : queue.rear+queue.queuesize-queue.front; } //若佇列不空,則若e返回隊頭的元素,並返回OK,否則返回ERROR Status GetHead(Queue queue,QElemType *e){ if(!queue.data){ printf("Error!! Please inital first!!\n"); exit(0); } if(QueueEmpty(queue)){ *e=NULL; return ERROR; } *e=*(queue.data+queue.front); return OK; } //插入元素e為新的隊尾元素 Status EnQueue(Queue *queue,QElemType e){ if(!queue->data){ printf("Error!! Please inital first!!\n"); exit(0); } if(QueueLength(*queue)>=queue->queuesize-1){ printf("No Space!!\n"); return ERROR; } queue->data[queue->rear]=e; queue->rear=(queue->rear+1)%queue->queuesize; return OK; } //刪除queue的隊頭元素,用e返回其值 Status DeQueue(Queue *queue,QElemType *e){ if(!queue->data){ printf("Error!! Please inital first!!\n"); exit(0); } if(QueueEmpty(*queue)) return ERROR; *e=*(queue->data+queue->front); queue->front=(queue->front+1)%queue->queuesize; return OK; } //從隊頭到隊尾依次對queue中每個元素呼叫visit(),一旦visit()失敗,則操作失敗 Status QueueTraverse(Queue queue,Status (*visit)(QElemType)){ int i=queue.front; int j=0; while(j<QueueLength(queue)){ (*visit)(queue.data[i]); i=(i+1) % queue.queuesize; j++; } return OK; } //test1——print Status PrintOne(QElemType one){ printf("%d <- ",one); return OK; } int main() { Queue q; int i,j; QElemType a,b,c,d; InitQueue(&q); srand((int)time(0)); printf("EnQueue 10:\n"); for(i=1;i<=10;i++) EnQueue(&q,(QElemType)rand()%100); printf("["); QueueTraverse(q, PrintOne); printf("]"); printf("\nlength:%d\n",QueueLength(q)); GetHead(q,&a); printf("IsEmpty:%d Head:%d\n\n",QueueEmpty(q),a); ClearQueue(&q); printf("ClearQueue :\n"); printf("["); QueueTraverse(q, PrintOne); printf("]"); printf("\nlength:%d\n",QueueLength(q)); GetHead(q,&a); printf("IsEmpty:%d Head:%d\n\n",QueueEmpty(q),a); for(i=1;i<=10;i++) EnQueue(&q,(QElemType)rand()%100); printf("EnQueue 10:\n"); printf("["); QueueTraverse(q, PrintOne); printf("]"); printf("\nlength:%d\n",QueueLength(q)); GetHead(q,&a); printf("IsEmpty:%d Head:%d\n\n",QueueEmpty(q),a); for(i=1;i<=6;i++) DeQueue(&q, &b); printf("DeQueue 6:\n",b); printf("["); QueueTraverse(q, PrintOne); printf("]"); printf("\nlength:%d\n",QueueLength(q)); GetHead(q,&a); printf("IsEmpty:%d Head:%d\n\n",QueueEmpty(q),a); for(i=1;i<=10;i++) EnQueue(&q,(QElemType)rand()%100); printf("EnQueue 10:\n"); printf("["); QueueTraverse(q, PrintOne); printf("]"); printf("\nlength:%d\n",QueueLength(q)); GetHead(q,&a); printf("IsEmpty:%d Head:%d\n\n",QueueEmpty(q),a); DestroyQueue(&q); printf("DestroyQueue :\n"); printf("["); QueueTraverse(q, PrintOne); printf("]"); return 0; }