针对考研的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.运行结果图

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

相关推荐
小嘉丶学长14 小时前
Day14 · 字典与集合
java·开发语言·网络·python·学习·1024程序员节
小李不想当小白14 小时前
SPI通信外设与W25Q64 (硬件SPI)(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
adinnet202618 小时前
电商客服对话知识库的自学习闭环与质量演进机制
学习
Zwawa18 小时前
从 printf 到曲线:把数据送上 VOFA+
c语言·单片机·嵌入式
lazy H19 小时前
【计算机网络】第 13 篇:NAT 和端口映射是什么?为什么本地服务外网访问不了?
java·网络·网络协议·学习·计算机网络·408
试剂界的爱马仕20 小时前
α-Cyano-4-hydroxycinnamic acid(CHCA)用作 MALDI-TOF 基质的配制与使用
大数据·人工智能·深度学习·学习
小向是个Der20 小时前
嵌入式进阶——编译与链接
汇编·单片机·学习·编译原理·交叉编译
学网安的肆伍21 小时前
认证机制攻防学习|PortSwigger Authentication 靶场复现总结(二):用户名枚举进阶
学习·web安全·网络安全·burpsuite·portswigger·认证安全·靶场复现
海绵宝宝转agent21 小时前
Leetcode二叉树算法个人理解
笔记·学习·算法·leetcode·深度优先
小oo呆21 小时前
【学习心得】MCP工具开发学习笔记
笔记·学习