队列

队列

queue.h文件

#include"queue.h"

int main(void)
{
	Queue q;
	QueueInit(&q);
	QueuePush(&q, 1);
	QueuePush(&q, 2);
	QueuePush(&q, 3);
	QueuePush(&q, 4);
	QueuePush(&q, 5);
	printf("%d\n", QueueSize(&q));
	while (!QueueEmpty(&q))
	{
		printf("%d ", QueueFront(&q));
		QueuePop(&q);
	}
	QueueDestroy(&q);
	return 0;
}

queue.c文件

#include"queue.h" // 引入头文件"queue.h"

// 队列初始化
void QueueInit(Queue* q) // 参数为队列指针
{
	assert(q); // 断言队列指针不为空
	q->head = q->tail = NULL; // 首尾全部指向NULL,即队列为空
	q->size = 0; // 元素个数为0
}

QNode* Buy_Node(QDataType x) // 定义一个函数,用来创建一个新节点
{
	QNode* newnode = (QNode*)malloc(sizeof(QNode)); // 申请一个新节点
	if (newnode == NULL) // 如果申请失败
	{
		perror("malloc fail:"); // 输出错误信息
		return 0; // 返回0
	}
	newnode->x = x; // 新节点的数据为x
	newnode->next = NULL; // 新节点的next指针指向NULL,即没有下一个节点
	return newnode; // 返回新节点
}

// 队头入队列 
void QueuePush(Queue* q, QDataType data) // 参数为队列指针和要插入的数据
{
	assert(q); // 断言队列指针不为空
	QNode* newnode = Buy_Node(data); // 创建一个新节点
	if (q->head == NULL) // 如果队列为空
	{
		assert(q->tail == NULL); // 断言队列尾指针也为空
		q->head = q->tail = newnode; // 头指针和尾指针都指向新节点
	}
	else // 如果队列不为空
	{
		q->tail->next = newnode; // 队列尾部的next指针指向新节点
		q->tail = newnode; // 队列尾指针指向新节点
	}
	q->size++; // 元素个数加1
}

// 队头出队列 
void QueuePop(Queue* q) // 参数为队列指针
{
	assert(q); // 断言队列指针不为空
	assert(q->head != NULL); // 断言队列头指针不为空
	if (q->head->next == NULL) // 如果队列只有一个元素
	{
		free(q->head); // 释放头节点的内存
		q->head = q->tail = NULL; // 头指针和尾指针都指向NULL,即队列为空
	}
	else // 如果队列不止一个元素
	{
		QNode* second = q->head->next; // 保存第二个节点的指针
		free(q->head); // 释放头节点的内存
		q->head = second; // 将原来的第二个节点设置为头节点
	}
	q->size--; // 元素个数减1
}

// 获取队列头部元素 
QDataType QueueFront(Queue* q) // 参数为队列指针
{
	return q->head->x; // 返回头节点的数据
}

// 获取队列队尾元素 
QDataType QueueBack(Queue* q) // 参数为队列指针
{
	return q->tail->x; // 返回尾节点的数据
}

// 获取队列中有效元素个数 
int QueueSize(Queue* q) // 参数为队列指针
{
	return q->size; // 返回元素个数
}

// 检测队列是否为空,如果为空返回非零结果,如果非空返回0 
int QueueEmpty(Queue* q) // 参数为队列指针
{
	return q->size == 0; // 如果元素个数为0,返回1,否则返回0
}

// 销毁队列 
void QueueDestroy(Queue* q) // 参数为队列指针
{
	assert(q); // 断言队列指针不为空
	QNode* cur = q->head; // 定义一个指针cur指向队列头节点
	while (cur) // 循环直到cur为NULL
	{
		QNode* second = cur->next; // 保存下一个节点的指针
		free(cur); // 释放当前节点的内存
		cur = second; // 将cur指向下一个节点
	}
	q->head = q->tail = NULL; // 头指针和尾指针都指向NULL,即队列为空
	q->size = 0; // 元素个数为0
}

test.c文件

#include"queue.h"

int main(void)
{
	Queue q;
	QueueInit(&q);
	QueuePush(&q, 1);
	QueuePush(&q, 2);
	QueuePush(&q, 3);
	QueuePush(&q, 4);
	QueuePush(&q, 5);
	printf("%d\n", QueueSize(&q));
	while (!QueueEmpty(&q))
	{
		printf("%d ", QueueFront(&q));
		QueuePop(&q);
	}
	QueueDestroy(&q);
	return 0;
}

posted @ 2023-08-24 22:28  Hayaizo  阅读(2)  评论(0编辑  收藏  举报