【数据结构初阶(C语言实现)】——链式队列

基本概念

什么是队列(Queue)

        队列是一个特殊的线性表,只能在一端进行删除操作(出队),这端称为队头;另外一端进行插入操作(入队),这端称为队尾。就像日常生活中的排队一样,人们只能从队伍的头离开以及从队伍的尾进入。遵循先进先出的原则。

图解

【数据结构初阶(C语言实现)】——链式队列_第1张图片

链式队列结构类型的定义

图解

【数据结构初阶(C语言实现)】——链式队列_第2张图片

代码实现

typedef int QDatatype; // 方便后续修改存储数据类型
// 链式队列的结点
typedef struct QueueNode
{
	QDatatype data;
	struct QueueNode* next;
}QNode;
// 方便访问链式队列的结构体
typedef struct Queue
{
	QNode* head;  // 指向链式队列的第一个结点
	QNode* tail;  // 指向链式队列的最后一个结点
	int size;
}Queue;

Queue Que;  // 创建一个结构体用于访问队列

链式队列的初始化

代码实现

// 声明
void QueueInit(Queue* Que);

// 定义
void QueueInit(Queue* Que)
{
	assert(Que); // 判断是否传错参数

	Que->head = Que->tail = NULL; // 头尾指针置空
	Que->size = 0;   // 数据个数为0
}

// 调用
QueueInit(&Que)

链式队列的队列判空

代码实现

// 声明
bool QueueEmpty(Queue* Que);

// 定义
bool QueueEmpty(Queue* Que)
{
	assert(Que); // 避免用户传错参数

	return Que->size == 0; // size 等于0时队列为空
}

// 调用
QueueEmpty(&Que);

链式队列的入队(尾插)

代码实现

// 声明
void QueuePush(Queue* Que, QDatatype x);

// 定义
void QueuePush(Queue* Que, QDatatype x)
{
	// 创建新的链式队列结点
    QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		return;
	}
	newnode->data = x;
	newnode->next = NULL;
    // 链式队列没有结点时的情况
	if (Que->head == NULL)
	{
		assert(Que->tail == NULL);

		Que->head = Que->tail = newnode;
	}
	else // 链式队列有结点时的情况
	{
		Que->tail->next = newnode;
		Que->tail = newnode;
	}

	Que->size++;  // 存储数据个数增加一个
}

// 调用
QueuePush(&Que,x); // x为入队的新数据

链式队列的出队(头删)

代码实现

// 声明
void QueuePop(Queue* Que);

// 定义
void QueuePop(Queue* Que)
{
	assert(Que);    // 判断是否传错参数
	assert(Que->head != NULL); // 空队列不能进行出队
    // 队列只有一个结点时的情况
	if (Que->head->next == NULL)
	{
		free(Que->head);
		Que->head = Que->tail = NULL;
	}
    // 队列有多个结点时的情况
	else 
	{
		QNode* next = Que->head->next;
		free(Que->head);
		Que->head = next;
	}

	Que->size--; // 存储数据个数减少一个
}

// 调用
QueuePop(&Que);

链式队列的访问队头数据

代码实现

// 声明
QueueFront(Queue* Que);

// 定义
QDatatype QueueFront(Queue* Que)
{
	assert(Que);  // 避免用户传错参数
	assert(!QueueEmpty(Que)); // 队列为空时不能访问队头数据
    return Que->head->data; // 返回队头数据
}

// 调用
QueueFront(&Que);

 链式队列的访问队尾数据

代码实现

// 声明
QDatatype QueueBack(Queue* Que);

// 定义
QDatatype QueueBack(Queue* Que)
{
	assert(Que);  // 避免用户传错参数
	assert(!QueueEmpty(Que));  // 队列为空时不能访问队尾数据
	return Que->tail->data;    // 返回队尾数据
}

// 调用
QueueBack(&Que);

链式队列的销毁

代码实现

// 声明
void QueueDestroy(Queue* Que);

// 定义
void QueueDestroy(Queue* Que)
{
	assert(Que);
	QNode* cur = Que->head;
	while (cur)
	{
		QNode* next = cur->next;
		free(cur);
		cur = next;
	}

	Que->head = Que->tail = NULL;
	Que->size = 0;
}

// 调用
QueueDestroy(&Que);

你可能感兴趣的:(【数据结构初阶(C语言实现)】,数据结构,c语言)