数据结构之循环队列(C语言)

本文详细介绍了如何用C语言实现循环队列,包括创建、初始化、元素入队出队操作,并通过测试展示了队列的完整流程。涉及关键函数如enqueue、dequeue和outputLinkQueue,最后通过`testLinkQueue`进行综合验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、循环队列的定义

循环队列是把顺序队列首尾相连,把存储队列元素的表从逻辑上看成一个环,成为循环队列。循环队列就是将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间,供队列循环使用。

二、代码功能

1、创建循环队列

2、循环队列的初始化

3、循环队列元素的入队

4、循环队列元素的出队

5、循环队列的输出

6、循环队列的测试

7、程序入口

8、运行结果


 

三、循环队列的代码

1、创建循环队列

typedef struct CircleIntQueue
{
	int data[TOTAL_SPACE];

	int head;

	int tail;
}*CircleIntQueuePtr;

2、循环队列的初始化

CircleIntQueuePtr initQueue()
{
	CircleIntQueuePtr resultPtr = (CircleIntQueuePtr)malloc(sizeof(struct CircleIntQueue));
	resultPtr->head = 0;
	resultPtr->tail = 0;

	return resultPtr;
}

3、循环队列元素的入队

void enqueue(CircleIntQueuePtr paraPtr, int paraValue)
{
	if ((paraPtr->tail + 1) % TOTAL_SPACE == paraPtr->head) {
		printf("Queue full.\r\n");
		return;
	} // Of if

	paraPtr->data[paraPtr->tail % TOTAL_SPACE] = paraValue;
	paraPtr->tail++;
}

4、循环队列元素的出队

int dequeue(CircleIntQueuePtr paraPtr)
{
	int resultValue;
	if (paraPtr->head == paraPtr->tail) {
		printf("No element in the queue.\r\n");
		return -1;
	} // Of if

	resultValue = paraPtr->data[paraPtr->head % TOTAL_SPACE];
	paraPtr->head++;

	return resultValue;
}

5、循环队列的输出

void outputLinkQueue(CircleIntQueuePtr paraPtr)
{
	int i;
	if (paraPtr->head == paraPtr->tail)
	{
		printf("Empty queue.");
		return;
	} // Of if

	printf("Elements in the queue: ");
	for (i = paraPtr->head; i < paraPtr->tail; i++)
	{
		printf("%d, ", paraPtr->data[i % TOTAL_SPACE]);
	} // Of for i

	printf("\r\n");
}

6、循环队列的测试

void testLinkQueue()
{
	int i = 10;
	CircleIntQueuePtr tempPtr = initQueue();
	for (; i < 16; i ++)
	{
		enqueue(tempPtr, i);
	}//Of for i

	outputLinkQueue(tempPtr);

	for (i = 0; i < 6; i ++)
	{
		printf("dequeue gets %d\r\n", dequeue(tempPtr));
	}//Of for i

	enqueue(tempPtr, 8);
	outputLinkQueue(tempPtr);
}

7、程序入口

int main()
{
	testLinkQueue();
	return 1;
}

8、运行结果

Queue full.
Queue full.
Elements in the queue: 10, 11, 12, 13,
dequeue gets 10
dequeue gets 11
dequeue gets 12
dequeue gets 13
No element in the queue.
dequeue gets -1
No element in the queue.
dequeue gets -1
Elements in the queue: 8,

四、整体代码

#include <stdio.h>
#include <malloc.h>

#define TOTAL_SPACE 5

/**
 * Circle int queue.
 */
typedef struct CircleIntQueue
{
	int data[TOTAL_SPACE];

	int head;

	int tail;
}*CircleIntQueuePtr;

/**
 * Initialize the queue.
 */
CircleIntQueuePtr initQueue()
{
	CircleIntQueuePtr resultPtr = (CircleIntQueuePtr)malloc(sizeof(struct CircleIntQueue));
	resultPtr->head = 0;
	resultPtr->tail = 0;

	return resultPtr;
}// Of the first constructor

/**
 * Enqueue.
 * 
 * @param paraValue The value of the new node.
 */
void enqueue(CircleIntQueuePtr paraPtr, int paraValue)
{
	if ((paraPtr->tail + 1) % TOTAL_SPACE == paraPtr->head) {
		printf("Queue full.\r\n");
		return;
	} // Of if

	paraPtr->data[paraPtr->tail % TOTAL_SPACE] = paraValue;
	paraPtr->tail++;
}// Of enqueue

/**
 * Dequeue.
 * 
 * @return The value at the head.
 */
int dequeue(CircleIntQueuePtr paraPtr)
{
	int resultValue;
	if (paraPtr->head == paraPtr->tail) {
		printf("No element in the queue.\r\n");
		return -1;
	} // Of if

	resultValue = paraPtr->data[paraPtr->head % TOTAL_SPACE];
	paraPtr->head++;

	return resultValue;
}// Of dequeue

/**
 * Output the queue.
 */
void outputLinkQueue(CircleIntQueuePtr paraPtr)
{
	int i;
	if (paraPtr->head == paraPtr->tail)
	{
		printf("Empty queue.");
		return;
	} // Of if

	printf("Elements in the queue: ");
	for (i = paraPtr->head; i < paraPtr->tail; i++)
	{
		printf("%d, ", paraPtr->data[i % TOTAL_SPACE]);
	} // Of for i

	printf("\r\n");
}//Of outputLinkQueue

/**
 * Unit test.
 */
void testLinkQueue()
{
	int i = 10;
	CircleIntQueuePtr tempPtr = initQueue();
	for (; i < 16; i ++)
	{
		enqueue(tempPtr, i);
	}//Of for i

	outputLinkQueue(tempPtr);

	for (i = 0; i < 6; i ++)
	{
		printf("dequeue gets %d\r\n", dequeue(tempPtr));
	}//Of for i

	enqueue(tempPtr, 8);
	outputLinkQueue(tempPtr);
}//Of testLinkQueue

/**
 * The entrance.
 */
int main()
{
	testLinkQueue();
	return 1;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值