3. linux C -- 通用循环队列
来源:互联网 发布:flash.js导致请求两次 编辑:程序博客网 时间:2024/06/04 20:14
头文件voidQueue.h
#ifndef _VOID_QUEUE_H_#define _VOID_QUEUE_H_typedef enum{ FALSE = 0, TRUE}BOOL;typedef struct myQueue{ void *data; // 数据域 int size; // 数据域的大小 int Front; int Rear; int MaxLen; // 队列的最大长度}voidQueue;typedef void (queue_op_t)(void *);typedef int (queue_cmp_t)(void *, void *);BOOL initQueue(voidQueue *pQueue, int size, int maxLen); // 初始化队列BOOL isFullQueue(voidQueue *pQueue); // 判断队列是否已满BOOL isEmptyQueue(voidQueue *pQueue);// 判断队列是否已空BOOL enQueue(voidQueue *pQueue, void *data); // 添加数据BOOL delQueue(voidQueue *pQueue, void *data); // 获取数据void traverseQueue(voidQueue *pQueue, queue_op_t * opt); // 遍历队列void destroyedQueue(voidQueue *pQueue);int getQueueCount(voidQueue *pQueue); // 得到队列的当前长度#endif
1. 初始化队列
参数:队列指针
数据域的大小
队列的最大长度
返回值:成功返回值, 失败返回FALSE
循环队列的最后一个项需要为空,不然无法去判断队列是满还是空,所以申请空间时要多申请一个才会得到需要的队列大小
BOOL initQueue(voidQueue *pQueue, int size, int maxLen){ pQueue->data = malloc(size * (maxLen+1)); if (NULL == pQueue->data) { return FALSE; } pQueue->Front = 0; pQueue->Rear = 0; pQueue->size = size; pQueue->MaxLen = maxLen + 1; return TRUE;}
2. 判断队列是否已满
参数:队列指针
返回值:已满返回TRUE, 没满返回FALSE
BOOL isFullQueue(voidQueue *pQueue){ if(pQueue->Front == (pQueue->Rear + 1) % pQueue->MaxLen) { return TRUE; } else { return FALSE; }}
3. 判断队列是否为空
参数:队列指针
返回值:已满返回TRUE, 没满返回FALSE
BOOL isEmptyQueue(voidQueue *pQueue){ if (pQueue->Front == pQueue->Rear) { return TRUE; } else { return FALSE; }}4. 添加数据
参数:队列指针
需要添加的数据
返回值: 成功返回TRUE,失败返回FALSE
BOOL enQueue(voidQueue *pQueue, void *data){ if (isFullQueue(pQueue)) { return FALSE; } memcpy(pQueue->data + pQueue->size * pQueue->Rear, data, pQueue->size); pQueue->Rear = (pQueue->Rear + 1) % pQueue->MaxLen; return TRUE;}
4. 获取数据
参数:队列指针
存储获取数据的指针
返回值: 成功返回TRUE,失败返回FALSE
BOOL delQueue(voidQueue *pQueue, void *data){ if (isEmptyQueue(pQueue)) { return FALSE; } memcpy(data, pQueue->data + pQueue->size * pQueue->Front, pQueue->size); memset(pQueue->data + pQueue->size * pQueue->Front, 0, pQueue->size); pQueue->Front = (pQueue->Front + 1) % pQueue->MaxLen; return TRUE;}
5. 遍历队列
参数:队列指针
对遍历到的数据域操作的函数指针
返回值:无
void traverseQueue(voidQueue *pQueue, queue_op_t *opt){ if (isEmptyQueue(pQueue)) { return ; } int i = pQueue->Front; printf("queue element start: \n"); while (i % pQueue->MaxLen != pQueue->Rear) { opt(pQueue->data + (i % pQueue->MaxLen) * pQueue->size); i++; } printf("traverse end\n");}
6. 得到队列的当前长度
参数:队列指针
返回值:队列的长度
int getQueueCount(voidQueue *pQueue){ int count = 0; if (isEmptyQueue(pQueue)) { return count; } int i = pQueue->Front; while (i % pQueue->MaxLen != pQueue->Rear) { i++; count++; } return count;}
7. 销毁队列
参数:队列指针
返回值:无
void destroyedQueue(voidQueue *pQueue){ if (NULL != pQueue->data) { free(pQueue->data); pQueue->data = NULL; }}
voidQueue.c
#include <stdio.h>#include <string.h>#include <stdlib.h>#include "voidQueue.h"BOOL initQueue(voidQueue *pQueue, int size, int maxLen){ pQueue->data = malloc(size * (maxLen+1)); if (NULL == pQueue->data) { return FALSE; } pQueue->Front = 0; pQueue->Rear = 0; pQueue->size = size; pQueue->MaxLen = maxLen + 1; return TRUE;}BOOL isFullQueue(voidQueue *pQueue){ if(pQueue->Front == (pQueue->Rear + 1) % pQueue->MaxLen) { return TRUE; } else { return FALSE; }}BOOL isEmptyQueue(voidQueue *pQueue){ if (pQueue->Front == pQueue->Rear) { return TRUE; } else { return FALSE; }}BOOL enQueue(voidQueue *pQueue, void *data){ if (isFullQueue(pQueue)) { return FALSE; } memcpy(pQueue->data + pQueue->size * pQueue->Rear, data, pQueue->size); pQueue->Rear = (pQueue->Rear + 1) % pQueue->MaxLen; return TRUE;}BOOL delQueue(voidQueue *pQueue, void *data){ if (isEmptyQueue(pQueue)) { return FALSE; } memcpy(data, pQueue->data + pQueue->size * pQueue->Front, pQueue->size); memset(pQueue->data + pQueue->size * pQueue->Front, 0, pQueue->size); pQueue->Front = (pQueue->Front + 1) % pQueue->MaxLen; return TRUE;}void traverseQueue(voidQueue *pQueue, queue_op_t *opt){ if (isEmptyQueue(pQueue)) { return ; } int i = pQueue->Front; printf("queue element start: \n"); while (i % pQueue->MaxLen != pQueue->Rear) { opt(pQueue->data + (i % pQueue->MaxLen) * pQueue->size); i++; } printf("traverse end\n");}int getQueueCount(voidQueue *pQueue){ int count = 0; if (isEmptyQueue(pQueue)) { return count; } int i = pQueue->Front; while (i % pQueue->MaxLen != pQueue->Rear) { i++; count++; } return count;}void destroyedQueue(voidQueue *pQueue){ if (NULL != pQueue->data) { free(pQueue->data); pQueue->data = NULL; }}
8. 实例测试 main.c
#include <stdio.h>#include "voidQueue.h"void printQueueData(void *data){ int *temp = (int *)data; printf("queue: %d\n", *temp);}int main(void){ voidQueue testQueue; initQueue(&testQueue, sizeof(int), 5); int ret = isEmptyQueue(&testQueue); if (ret) { printf("11 testQueue is empty\n"); } int addElement; addElement = 1; enQueue(&testQueue, &addElement); addElement = 2; enQueue(&testQueue, &addElement); addElement = 3; enQueue(&testQueue, &addElement); traverseQueue(&testQueue, printQueueData); printf("queue count: %d\n", getQueueCount(&testQueue)); printf("++++++++++++++++++++++++++++++++++++++++++++++++\n"); int delElement; if (delQueue(&testQueue, &delElement)) { printf("delElement: %d\n", delElement); } else { printf("queue is already empty\n"); } if (delQueue(&testQueue, &delElement)) { printf("delElement: %d\n", delElement); } else { printf("queue is already empty\n"); } if (delQueue(&testQueue, &delElement)) { printf("delElement: %d\n", delElement); } else { printf("queue is already empty\n"); } if (delQueue(&testQueue, &delElement)) { printf("delElement: %d\n", delElement); } else { printf("queue is already empty\n"); } printf("------------------------------------------------\n"); addElement = 1; enQueue(&testQueue, &addElement); addElement = 2; enQueue(&testQueue, &addElement); addElement = 3; enQueue(&testQueue, &addElement); addElement = 4; enQueue(&testQueue, &addElement); addElement = 5; enQueue(&testQueue, &addElement); addElement = 6; enQueue(&testQueue, &addElement); traverseQueue(&testQueue, printQueueData); printf("queue count: %d\n", getQueueCount(&testQueue)); printf("====================================================\n"); if (delQueue(&testQueue, &delElement)) { printf("delElement: %d\n", delElement); } else { printf("queue is already empty\n"); } if (delQueue(&testQueue, &delElement)) { printf("delElement: %d\n", delElement); } else { printf("queue is already empty\n"); } printf("*****************************************************\n"); addElement = 9; enQueue(&testQueue, &addElement); traverseQueue(&testQueue, printQueueData); printf("queue count: %d\n", getQueueCount(&testQueue)); destroyedQueue(&testQueue); printf("Hello World!\n"); return 0;}
阅读全文
0 0
- 3. linux C -- 通用循环队列
- 通用循环队列的实现
- c循环队列
- C的循环队列
- 循环队列实现(C++)
- C语言循环队列
- C基础:循环队列
- 循环队列(C语言版)
- C循环队列
- C-循环队列
- C 循环队列实现
- 循环队列(c)
- c语言:循环队列
- 循环队列 - C语言
- C语言 循环队列
- 循环队列 c 实现!!!!
- 【C++】实现循环队列
- 【C语言】循环队列
- vue中axios的使用方法
- Docker原理篇
- 微信小程序页面跳转失效
- 学习笔记——使用canvas给图形填色
- 什么是敏捷开发?
- 3. linux C -- 通用循环队列
- tp5 Composer安装与加载phpexcel插件与使用
- @angular-cli报错
- 非常好的协同过滤入门文章
- linux 64位系统兼容32bit程序 ioctl调用cmd匹配问题解决
- kafka入门:简介、使用场景、设计原理、主要配置及集群搭建
- CentOS 上 Jenkins 安装
- solution_169
- linux下安装php扩展