手搓链式结构队列(C语言)

Queue.h

#pragma once

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>

typedef int QDataType;

// 链式结构:表示队列 
typedef struct QListNode
{
	struct QListNode* next;
	QDataType data;
}QNode;

// 队列的结构 
typedef struct Queue
{
	QNode* front;
	QNode* rear;
	int size;
}Queue;

// 初始化队列 
void QueueInit(Queue* q);
// 队尾入队列 
void QueuePush(Queue* q, QDataType data);
// 队头出队列 
void QueuePop(Queue* q);
// 获取队列头部元素 
QDataType QueueFront(Queue* q);
// 获取队列队尾元素 
QDataType QueueBack(Queue* q);
// 获取队列中有效元素个数 
int QueueSize(Queue* q);
// 检测队列是否为空
bool QueueEmpty(Queue* q);
// 销毁队列 
void QueueDestroy(Queue* q);

Queue.c

#include "Queue.h"

// 初始化队列 
void QueueInit(Queue* q)
{
	assert(q);

	q->front = NULL;
	q->rear = NULL;
	q->size = 0;
}

// 队尾入队列 
void QueuePush(Queue* q, QDataType data)
{
	//创建节点
	QNode* newNode = (QNode*)malloc(sizeof(QNode));
	if (newNode == NULL)
	{
		perror("QueuePush");
		exit(-1);
	}
	newNode->data = data;
	newNode->next = NULL;

	if (q->rear == NULL)
	{
		q->front = q->rear = newNode;
	}
	else
	{
		q->rear->next = newNode;
		q->rear = q->rear->next;
	}
	q->size++;
}

// 队头出队列 
void QueuePop(Queue* q)
{
	assert(q);
	assert(q->front);

	QNode* newFront = q->front->next;
	free(q->front);
	q->front = newFront;

	//删除最后一个元素
	if (q->front == NULL)
		q->rear = NULL;
	q->size--;
}

// 获取队列头部元素 
QDataType QueueFront(Queue* q)
{
	assert(q);
	assert(q->front);

	return q->front->data;
}

// 获取队列队尾元素 
QDataType QueueBack(Queue* q)
{
	assert(q);
	assert(q->front);

	return q->rear->data;
}

// 获取队列中有效元素个数 
int QueueSize(Queue* q)
{
	assert(q);

	return q->size;
}
// 检测队列是否为空
bool QueueEmpty(Queue* q)
{
	assert(q);

	return q->rear == NULL;
}
// 销毁队列 
void QueueDestroy(Queue* q)
{
	assert(q);

	QNode* cur = q->front;
	while (cur)
	{
		QNode* next = cur->next;
		free(cur);
		cur = next;
	}
	q->front = NULL;
	q->rear = NULL;
	q->size = 0;
}

QueueTest.c

#include "Queue.h"

int main()
{
	Queue q;
	//初始化
	QueueInit(&q);
	//入队列
	QueuePush(&q, 1);
	QueuePush(&q, 2);
	QueuePush(&q, 3);
	QueuePush(&q, 4);
	QueuePush(&q, 5);
	//队头元素
	printf("%d ", QueueFront(&q));
	//队尾元素
	printf("%d\n", QueueBack(&q));
	//队内元素
	printf("%d\n", QueueSize(&q));

	//出队列
	while (!QueueEmpty(&q))
	{
		printf("%d ", QueueFront(&q));
		QueuePop(&q);
	}

	//销毁
	QueueDestroy(&q);
	return 0;
}

测试示例

相关推荐

  1. C++

    2024-05-02 23:48:02       16 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-02 23:48:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-02 23:48:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-02 23:48:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-02 23:48:02       20 阅读

热门阅读

  1. 【QT进阶】自定义QGraphicsItem的实现设备节点

    2024-05-02 23:48:02       13 阅读
  2. 学习冒泡排序的可视化实现(一)

    2024-05-02 23:48:02       10 阅读
  3. Agent AI智能体的未来杂谈

    2024-05-02 23:48:02       11 阅读
  4. Runtime.getruntime.exec注意事项

    2024-05-02 23:48:02       10 阅读
  5. 2024最新华为OD机试试题库全 -【找单词】- C卷

    2024-05-02 23:48:02       11 阅读
  6. Xcode安装与配置

    2024-05-02 23:48:02       12 阅读
  7. RedisTemplate实现令牌桶限流

    2024-05-02 23:48:02       11 阅读
  8. 网络新闻的力量:如何用网络爬虫挖掘数据宝藏

    2024-05-02 23:48:02       11 阅读