`
kerrysk
  • 浏览: 17100 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

C 实现循环队列

阅读更多

前几天在公司开发写了个循环队列,感觉挺好的,没用上可惜了。拿出来秀一秀

 队列可以自动增长,就是涨上去需要再trim下。

 

头文件:

 

#ifndef _NODECIRCLEQUEUE_H
#define _NODECIRCLEQUEUE_H

typedef enum { false=0, true=!false } bool;

typedef void *Node;

typedef struct NodeCircleQueue_T{
	Node	*queue;
	int	head;
	int	tail;
	int	initLength;
	int	maxLength;
}NodeCircleQueue;

typedef void (*NodeFunc) (Node node,void *args);

bool vInitNodeCircleQueue(NodeCircleQueue *cqueue,int initLength,int maxLength);

void vDestoryNodeCircleQueue(NodeCircleQueue *cqueue);

bool vOfferNodeCircleQueue(NodeCircleQueue *cqueue,Node node);

Node vPollNodeCircleQueue(NodeCircleQueue *cqueue);

void vTraversalNodeCircleQueue(NodeCircleQueue *cqueue,NodeFunc func,void *args);

#endif

源文件:

 #include "nodeCircleQueue.h"

#include <stdlib.h>
#include <string.h>

bool vInitNodeCircleQueue(NodeCircleQueue *cqueue,int initLength,int maxLength){
	cqueue->queue = (Node*)malloc(initLength * sizeof(Node));
	if(cqueue->queue == NULL){
		return false;	
	}
	cqueue->head = cqueue->tail = 0;
	cqueue->initLength = initLength;
	cqueue->maxLength = maxLength;
	return true;
}

void vDestoryNodeCircleQueue(NodeCircleQueue *cqueue){
	free(cqueue->queue);
}

bool vOfferNodeCircleQueue(NodeCircleQueue *cqueue,Node node){
	//queue is full
	if(cqueue->head == ((cqueue->tail+1) % cqueue->initLength)){
		if(cqueue->initLength == cqueue->maxLength)
			return false;

		Node* newQueue;
		int newLength;
		
		newLength = cqueue->initLength * 2;
		if(newLength > cqueue->maxLength)
			newLength = cqueue->maxLength;

		newQueue = (Node*)malloc(newLength * sizeof(Node));
		if(newQueue == NULL)
			return false;
		memcpy(newQueue , cqueue->queue , cqueue->initLength * sizeof(Node));
		free(cqueue->queue);

		cqueue->initLength = newLength;
		cqueue->queue = newQueue;
	}
	//put node at tail,tail++
	*(cqueue->queue + cqueue->tail) = node;
	cqueue->tail = (cqueue->tail + 1) % cqueue->initLength;
	return true;
}

Node vPollNodeCircleQueue(NodeCircleQueue *cqueue){
	//queue is empty
	if(cqueue->tail == cqueue->head)
		return NULL;
	Node node;
	//node = head, head++
	node = *(cqueue->queue + cqueue->head);
	cqueue->head = (cqueue->head + 1) % cqueue->initLength;
	return node;
}

void vTraversalNodeCircleQueue(NodeCircleQueue *cqueue,NodeFunc func,void *args){
	int ptr;
	
	ptr = cqueue->head;
	while(ptr != cqueue->tail){
		func(*(cqueue->queue + ptr),args);
		ptr = (ptr + 1)% cqueue->initLength;
	}
}



分享到:
评论

相关推荐

    C语言实现循环队列

    C语言实现循环队列

    C语言实现循环队列基本运算

    C语言实现循环队列的基本运算,建立、入队、出队,简单易懂。

    C语言实现循环队列代码

    本文将详细介绍如何用C语言实现循环队列,并探讨其核心功能——入队、出队和打印队列元素。 首先,我们需要定义一个队列结构体,它通常包含队列的容量、当前队头和队尾索引,以及用于存储元素的数组。例如: ```c ...

    数据结构 严蔚敏 C语言版 循环队列

    在C语言中实现循环队列,需要使用数组存储元素,并用两个整型变量分别表示队头和队尾的位置。由于数组下标通常从0开始,我们需要对队头和队尾指针进行模运算,确保它们始终在合法范围内。例如,如果队列大小为N,...

    C语言_循环队列

    包含了C语言实现循环队列的代码, 有循环队列的彩图讲解, 便于理解代码.

    数据结构-循环队列-C语言实现循环队列-数据结构学习

    C语言实现的数据结构中的循环队列 包含源码(.c文件),linux环境下编译生成的可执行文件,头文件,以及测试用的main.c文件 用于C语言以及数据结构的学习 循环队列的.c和.h文件实现了以下功能: 创建循环队列 入队列...

    C语言实现使用静态数组实现循环队列

    以下是一个简单的C语言实现循环队列的步骤: 1. 定义静态数组:首先,你需要定义一个足够大的静态数组来存储队列元素。例如,可以声明一个大小为`MAX_SIZE`的整型数组`queue`。 ```c #define MAX_SIZE 100 int ...

    循环队列的C++实现

    通过这个文件,你可以学习到如何在C++中使用类和对象来封装数据结构,以及如何实现循环队列的高效操作。这个实现对于理解和应用数据结构,特别是对C++编程初学者来说,是非常有价值的实践案例。

    C语言实现使用静态数组实现循环队列.zip

    C语言实现循环队列时,我们需要定义一个结构体来表示队列,包含数组、队头和队尾的索引。例如: ```c typedef struct { int* array; // 存储元素的数组 int front; // 队头索引 int rear; // 队尾索引 int size...

    c语言的循环队列的实现 比克

    本文详细介绍了C语言中实现循环队列的方法,包括队列的基本操作如初始化、入队、出队等。循环队列作为一种高效的数据结构,在很多场景下都能发挥重要作用,特别是在内存管理较为严格的环境中。通过本文的学习,希望...

    C语言实现队列源码,包含顺序队列,链式队列,循环队列,亲测可用

    本文将详细讨论在C语言中实现的几种队列类型,包括顺序队列、链式队列以及循环队列,并结合提供的源代码进行解析。 顺序队列是基于数组实现的数据结构,它的特点是操作主要集中在数组的两端:一端称为队头,用于出...

    C语言实现使用静态数组实现循环队列源码.zip

    本资源“C语言实现使用静态数组实现循环队列源码.zip”提供了使用C语言编写的静态数组循环队列的实现,非常适合初学者学习和理解这一概念。 循环队列的基本思想是将一个固定大小的数组看作一个首尾相连的环形结构。...

    简单的C语言循环队列

    总结来说,"简单的C语言循环队列"是一个基础的数据结构实验,它帮助我们理解如何在C语言环境中实现和操作循环队列,同时也为我们提供了在实际编程中处理数据流和队列操作的基础。通过这个实验,可以提升对数据结构和...

    (c语言)使用循环队列方式判断括号匹配

    本文将深入探讨如何使用C语言和数据结构中的循环队列来实现括号匹配的算法。 首先,我们需要了解什么是循环队列。循环队列是一种线性数据结构,它利用数组的“首尾相接”特性,模拟一个无限的队列。当队列的末尾被...

    循环队列指针实现

    在C语言中,我们可以使用指针来实现循环队列,以提高代码的灵活性和效率。 首先,我们需要定义循环队列的数据结构。这通常包括两个主要部分:队列的元素数组和队头、队尾的指针。由于是循环队列,队头和队尾会在...

    C语言循环队列

    C语言实现循环对列,思路清晰。编译环境VC 2008下可编译通过。

Global site tag (gtag.js) - Google Analytics