c语言数组方式实现静态循环队列
2015-08-23 23:12
736 查看
1 循环队列原理图
2 结构体设计
3 运行结果图
4 完整源代码
2 结构体设计
3 运行结果图
4 完整源代码
#include<stdio.h> #include<malloc.h> /* 这是一个c语言用数组方式实现循环队列程序 time : 2015-08-23 by paul */ typedef struct Queue{ int length; //数组长度 int *pbase; //数组 int head;//int类型'头指针' int tail; //int类型'尾指针' }Queue,*PQueue; PQueue initQueue(); void enQueue(PQueue pQueue,int val); int isFull(PQueue pQueue); int isEmpty(PQueue pQueue); void traverseQueue(PQueue pQueue); void outQueue(PQueue pQueue); void destroyQueue(PQueue pQueue); int main(void){ //初始化队列 PQueue PQueue = initQueue(); traverseQueue(PQueue); //入队 int i = 0 ; for(; i < 20 ; i++){ enQueue(PQueue,i); } //入队后第一次遍历 traverseQueue(PQueue); //第一次出队 int j = 0; for(;j<3;j++){ outQueue(PQueue); } //第一次出队遍历 traverseQueue(PQueue); //第二次出队 for(;j<5;j++){ outQueue(PQueue); } //第二次出队遍历 traverseQueue(PQueue); //第三次出队 for(;j<10;j++){ outQueue(PQueue); } //第三次出队遍历 traverseQueue(PQueue); //销毁队列 destroyQueue(PQueue); return 1; }; //出队 void outQueue(PQueue pQueue){ if(isEmpty(pQueue)){ printf("出队失败,队列为空\n"); }else{ printf("%d 出队成功\n",*(pQueue->pbase + pQueue->head)); pQueue->head = (pQueue->head + 1)% pQueue->length; } } //初始化循环队列 PQueue initQueue(){ int lengh = 8;//队列长度为8 //初始化队列 PQueue pQueue = (Queue *)malloc(sizeof(Queue)); if(pQueue == NULL){ printf("初始化队列失败,内存不够了\n"); } pQueue->length = lengh; pQueue->pbase = (int *)malloc(sizeof(int)* pQueue->length); if(pQueue->pbase == NULL){ printf("初始化数组失败,内存不够了\n"); } pQueue->head = 0; pQueue->tail = 0; printf("初始化队列长度为%d\n",pQueue->length); return pQueue; }; //队列是否为空 int isEmpty(PQueue pQueue){ if(pQueue->head == pQueue->tail){ return 1; }else{ return 0; } }; int isFull(PQueue pQueue){ /* 得到队列实际的元素个数 这里采用的逻辑为: 1 队列实际长度 + 1 = 队列初始化长度 2 好处: 可以区分队满和队空的情况 2.1 初始化队列为空时 pQueue->pHead 2.2 假设一直有数据在入队,那么当pTail达到了数组最大长度后, 又从头开始,会存在 pQueue->pHead = pQueue->pTail情况. 2.1和2.2队满和队空的情况就可以区别开来 */ if((pQueue->tail + 1)% pQueue->length == pQueue-> head){ return 1; }else{ return 0; } }; //遍历队列 void traverseQueue(PQueue pQueue){ printf("循环队列的元素为: \n"); if(isEmpty(pQueue)){ printf("队列为空\n"); }else{ int head = pQueue->head ; while((head!= pQueue->tail)){ printf("%d ",*(pQueue->pbase+head)); head = (head + 1)%pQueue->length; } } printf("\n"); } //入队 void enQueue(PQueue pQueue,int val){ //队列是否否已满 if(isFull(pQueue)){ printf("队列已满, %d 不能入队\n",val); }else{ *(pQueue->pbase + pQueue->tail) = val; pQueue->tail = pQueue->tail + 1; printf("%d 成功入队\n",val); } }; //销毁队列 void destroyQueue(PQueue pQueue){ if(!isEmpty(pQueue)){ while( pQueue->head != pQueue->tail ){ int head = pQueue->head; pQueue->head = (pQueue->head + 1)%pQueue->length; free(pQueue->pbase+head); } } free(pQueue); printf("销毁队列成功\n"); }
相关文章推荐
- C++中struct和class的区别
- Devc++编译系统分配给int多少字节
- C++中的函数指针和函数对象
- C++实现线程池类
- C语言运算符优先级表
- C或C++的一个头文件mecLib.h
- C++标准库之IO库(二)
- Place the Robots
- c++面试笔试必备知识
- C++的 函数模板和模板函数、类模板和模板类区别
- c& c++笔试题
- c++函数内部可以返回函数内部定义的指针 但是不能返回函数内部定义的数组
- c& c++ enum
- c & c++中const
- Accelerated C++学习笔记4
- Accelerated C++ 学习笔记3
- c++返回引用和返回对象的区别
- C++ Primer 5e chapter 14.2
- C++ Primer 5e chapter 14.1
- C/C++头文件注释