针对考研的C语言学习(循环队列-链表版本以及2019循环队列大题)

题目

【注】此版本严格按照数字版循环队列的写法,rear所代表的永远是空数据

图解

1.初始化部分和插入部分

2出队

3.分部代码解析

初始化

cpp 复制代码
void init_cir_link_que(CirLinkQue& q)
{
	q.rear = q.front = (LinkList)malloc(sizeof(LNode));
	q.front->next = NULL;
	q.rear->next = q.front;
}

入队

cpp 复制代码
bool insert_que(CirLinkQue& q, ElemType data)
{
	//此版本严格按照数组版本的结构,rear节点所代表数据永远为空
	if (q.rear->next == q.front)
	{
		//表示现有空间已满,需额外开辟空间
		LinkList pnew = (LinkList)malloc(sizeof(LNode));
		q.rear->data = data;
		q.rear->next = pnew;
		pnew->next = q.front;
		q.rear = pnew;
		return true;
	}
	//不需要额外开辟空间
	//意思就是已经有出去过的数据了,但没有断链,可重复使用
	q.rear->data = data;
	q.rear = q.rear->next;
	return true;
}

出队

cpp 复制代码
bool pop_que(CirLinkQue& q, ElemType& data)
{
	//出队
	//判空
	if (q.rear == q.front)
	{
		return false;
	}
	data = q.front->data;
	q.front->data = NULL;//可写可不写,后面新插入的数据会覆盖这些不要的数据
	q.front = q.front->next;
	return true;
}

全部可运行代码

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct node {
	ElemType data;
	struct node* next;
}LNode, * LinkList;

typedef struct {
	LinkList front;
	LinkList rear;
}CirLinkQue;

void init_cir_link_que(CirLinkQue& q)
{
	q.rear = q.front = (LinkList)malloc(sizeof(LNode));
	q.front->next = NULL;
	q.rear->next = q.front;
}

bool insert_que(CirLinkQue& q, ElemType data)
{
	//此版本严格按照数组版本的结构,rear节点所代表数据永远为空
	if (q.rear->next == q.front)
	{
		//表示现有空间已满,需额外开辟空间
		LinkList pnew = (LinkList)malloc(sizeof(LNode));
		q.rear->data = data;
		q.rear->next = pnew;
		pnew->next = q.front;
		q.rear = pnew;
		return true;
	}
	//不需要额外开辟空间
	//意思就是已经有出去过的数据了,但没有断链,可重复使用
	q.rear->data = data;
	q.rear = q.rear->next;
	return true;
}

bool pop_que(CirLinkQue& q, ElemType& data)
{
	//出队
	//判空
	if (q.rear == q.front)
	{
		return false;
	}
	data = q.front->data;
	q.front->data = NULL;//可写可不写,后面新插入的数据会覆盖这些不要的数据
	q.front = q.front->next;
	return true;
}
int main()
{
	CirLinkQue q;
	ElemType data;
	init_cir_link_que(q);
	insert_que(q, 1);
	insert_que(q, 2);
	insert_que(q, 3);
	pop_que(q, data);
	insert_que(q, 4);
	/*pop_que(q, data);
	insert_que(q, 5);
	pop_que(q, data);
	pop_que(q, data) ? puts("true") : puts("false");*/
	return 0;
}

4.运行结果图

动图展示也不太清晰,若不懂的可以手动操作一下感受一下

相关推荐
sunshine22 girl5 小时前
Java学习二 基本语法2, 算术运算符
java·学习
派葛穆6 小时前
Lerobot -飞特舵机ST-3215双舵机联动(ESP_NOW)
c语言
零依赖极客6 小时前
Day 6·1 ARMv8.2 dotprod——vdotq_s32 一条指令做 4 个点积
c语言·开发语言·人工智能·矩阵·arm·vllm
衡石科技8 小时前
Data_Agent记忆机制与经验复用衡石分析智能体会话记忆与长期学习技术解析
人工智能·科技·学习·算法·企业级bi
传奇开心果编程8 小时前
【Xilem基础语法学与练】第7课:Xilem与Masonry底层构建技术解析
学习·rust·前端框架
想要入门的程序猿9 小时前
回调函数学习
java·网络·学习
码上上班9 小时前
iptables学习; firewalld学习;ufw学习
学习
RisunJan9 小时前
丝连族谱 0452 — 功能拆解与使用手册
学习
老王爱玩车10 小时前
深入理解指针2
c语言·开发语言·学习
那年窗外下的雪.11 小时前
AIDC 学习日志|第 22 天|All-Active/Single-Active 故障演练设计
服务器·网络·学习·算法·哈希算法