数据结构(5)——循环队列的顺序表示和实现
2016-10-10 21:05
513 查看
#include<stdio.h> #include<stdlib.h> #include <malloc.h> #define OK 1 #define ERROR -1 #define OVERFLOW -2 #define TRUE 1 #define FALSE 0 #define MAXQSIZE 100 //最大队列长度 typedef int QElemType; typedef int Status; typedef struct{ QElemType *base; //初始化的动态分配存储空间 int front; //头指针,若队列不空,指向队列头元素 int rear; //尾指针,若队列不空,指向队列尾元素的下一个位置 }SqQueue; Status InitQueue(SqQueue &Q); //构造一个空队列Q Status DestroyQueue(SqQueue &Q); //销毁队列Q,Q不再存在 Status ClearQueue(SqQueue &Q); //将Q清为空队列 Status QueueEmpty(SqQueue Q); //若队列Q为空队列,则返回TRUE,否则返回FALSE int QueueLength(SqQueue Q); //返回队列Q元素个数,即队列长度 Status GetHead(SqQueue Q,QElemType &e); //若队列不为空,则用e返回Q的队首元素,并返回OK;否则返回ERROR Status EnQueue(SqQueue &Q,QElemType e); //插入元素e为Q的新的队尾元素 Status DeQueue(SqQueue &Q,QElemType &e); //若队列不为空,则删除Q的队首元素,用e返回,并返回OK;否则返回ERROR Status QueueTraverse(SqQueue Q); //从队首至队尾遍历队列Q中的元素 /*构造一个空队列*/ Status InitQueue(SqQueue &Q){ Q.base = (QElemType *)malloc(MAXQSIZE * sizeof(QElemType)); if(!Q.base) exit(OVERFLOW); Q.front = Q.rear = 0; return OK; }//InitQueue /*销毁队列Q*/ Status DestoryQueue(SqQueue &Q){ if(Q.base) free(Q.base); Q.base = NULL; Q.front = Q.rear = 0; return OK; }//DestoryQueue /*将Q清为空队列 */ Status ClearQueue(SqQueue &Q){ Q.front = Q.rear = 0; return OK; } //ClearQueue /*判断队列是否为空*/ Status QueueEmpty(SqQueue Q){ if(Q.front == Q.rear) return TRUE; else return FALSE; } /*返回队列Q元素个数,即队列长度*/ int QueueLength(SqQueue Q){ return (Q.rear - Q.front +MAXQSIZE)%MAXQSIZE; }//QueueLength /*若队列不为空,则用e返回Q的队首元素*/ Status GetQueue(SqQueue Q,QElemType &e){ if(!QueueEmpty) e = Q.base[Q.front]; return OK; } /*插入元素e为Q的队尾元素*/ 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; }//EnQueue /*删除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; }//DeQueue /*遍历队列元素*/ Status QueueTraverse(SqQueue Q){ int p = Q.front; if(p == Q.rear){ printf("此队列为空!\n"); return ERROR; } for(int i=0;i<QueueLength(Q);i++){ printf("%d ",Q.base[p]); p++; } printf("\n"); return OK; } int main(){ SqQueue Q; QElemType e; int n,m; InitQueue(Q); printf("请输入循环队列元素个数:\n"); scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&m); EnQueue(Q,m); } printf("循环队列元素为:\n"); QueueTraverse(Q); if(!QueueEmpty(Q)) printf("非空\n"); else printf("空\n"); printf("将循环链表置空\n"); ClearQueue(Q); if(!QueueEmpty(Q)) printf("非空\n"); else printf("已空\n"); EnQueue(Q,1); EnQueue(Q,2); EnQueue(Q,3); EnQueue(Q,4); EnQueue(Q,5); printf("删除队头元素:\n"); DeQueue(Q,e); printf("循环队列元素为:\n"); QueueTraverse(Q); printf("队头元素为%d:\n",e); DestoryQueue(Q); return 0; }
相关文章推荐
- 数据结构学习笔记 --- 队列(循环队列-队列的顺序表示和实现)
- 数据结构之队列的顺序表示及其实现(循环队列)
- 数据结构学习笔记 --- 队列(循环队列-队列的顺序表示和实现)
- 数据结构(C实现)------- 顺序队列(循环队列之计数器实现)
- 循环队列——队列的顺序表示和实现
- 数据结构 — 6.顺序队列(循环)实现二叉树层次遍历
- 重温数据结构:队列的链式实现、顺序实现及循环队列
- 循环队列——队列的顺序表示和实现
- [数据结构][适用循环队列和非循环队列]顺序队列的实现。
- 循环队列——队列的顺序表示与实现(c语言)
- 循环队列———队列的顺序表示和实现
- 循环队列——队列的顺序表示和实现
- 数据结构Java实现——②队列--->队列的“奇葩”一循环顺序队列
- 【自己动手写数据结构】 -- 循环队列的表示与实现
- 数据结构之队列顺序表示与实现2
- 数据结构(5):循环队列——队列的顺序表示和实现
- 数据结构Java实现07----队列:顺序队列&顺序循环队列、链式队列、顺序优先队列
- 数据结构:循环队列(队列的顺序表示)
- 数据结构 第三章-- 循环队列(队列的顺序表示和实现)
- 队列的顺序表示及实现,循环队列