当前位置: 首页 > news >正文

队列实现图书信息管理(C语言)

文章目录

    • Queue.h
    • main.c
    • Queue.c

  用队列实现一个图书信息管理,这里放一下有哪些文件。(ps:我之前写的是学生信息管理,但是有人说我们的作业是写图书,就该了下内容,没有改文件名)
  队列是用链表实现的,因为涉及到队列的一些特性,选择链表比数组会更优。
在这里插入图片描述

Queue.h

  #pragma once防止库函数的重复引用,因为库函数会在预编译的时候在程序中展开,会增大程序的体积。
  通过typedef对数据重命名,之后需要修改数据就十分方便。并且其他函数不需要太多的改动。
  这里结构体传的是指针,减少没必要的内存消耗。
  队列的特性是先进先出所以和栈一样只有进出队列,不存在头插尾插、头删尾删的问题。
  这里的图书价格应该使用浮点数类型更合适,只是我之前写的是学生信息管理,不想改了,就这样吧,意思get就行。

#pragma once
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>typedef struct {char name[20];char author[20];int bno;int price;
}QDataType;
typedef struct QListNode
{struct QListNode* next;QDataType data;
}QNode;//队列的结构
typedef struct Queue
{QNode* head;QNode* tail;int size;
}Queue;//初始化队列
void QueueInit(Queue* q);//打印
void QueuePrint(Queue* q);//队尾入队列
void QueuePush(Queue* q, QDataType* data);
//队头出队列
void QueuePop(Queue* q);//获取队列头部元素 
QDataType* QueueFront(Queue* q);
//获取队列队尾元素
QDataType* QueueBack(Queue* q);//获取队列中有效元素个数
int QueueSize(Queue* q);//检测队列是否为空,如果为空返回非零结果,如果非空返回0
int QueueEmpty(Queue* q);//销毁队列
void QueueDestroy(Queue* q);

main.c

  因为重点在于数据结构队列的使用,所以直接给定一些数据,就不进行重复繁琐的数据输入工作了。

#define _CRT_SECURE_NO_WARNINGS 1#include "Queue.h"void test()
{Queue q;QueueInit(&q);QDataType book1 = { "活着", "余华", 110701, 22 };QDataType book2 = { "人血馒头", "余华", 110702, 21 };QDataType book3 = { "人间词话", "王国维", 110703, 23 };QDataType book4 = { "小词大雅", "叶嘉莹", 110704, 22 };QDataType book5 = { "且听风吟", "村上春树", 110705, 23 };QueuePush(&q, &book1);QueuePush(&q, &book2);QueuePush(&q, &book3);QueuePush(&q, &book4);QueuePush(&q, &book5);QueuePrint(&q);printf("%d\n\n", QueueSize(&q));QDataType* head = QueueFront(&q);printf("%s %d %s %d\n\n", head->name, head->bno, head->author, head->price);QDataType* tail = QueueBack(&q);printf("%s %d %s %d\n\n", tail->name, tail->bno, tail->author, tail->price);QueuePop(&q);QueuePop(&q);QueuePop(&q);QueuePrint(&q);printf("%d\n", QueueSize(&q));QueueDestroy(&q);
}int main()
{test();return 0;
}

Queue.c

  打印函数的实现,如果队列中的数据类型发生了改变,其他功能函数基本上不需要有什么变化, 打印函数对应修改一下就行了,因为打印需要涉及到具体的数据问题。

void QueuePrint(Queue* q)
{QNode* next = q->head;while(next != NULL){printf("%s %d %s %d\n", next->data.name, next->data.bno, next->data.author, next->data.price);next = next->next;}printf("\n");
}

  队列的初始化,将头尾指针都置为NULL,size置为0。

//队列初始化
void QueueInit(Queue* q)
{q->head = NULL;q->tail = NULL;q->size = 0;
}

  入队列的实现,先要创建一个节点来存放数据,然后把这个队列插入到队尾。如果这个队列的队尾指针为空,就说明这个队列中并没有数据,那么这个新插入的数据就既是队首又是队尾。如果队列的队尾指针有值,就把新节点插入到当前队尾之后,然后再把队尾指针向后移动一位。插入数据之后要将size加一。

void QueuePush(Queue* q, QDataType* x)
{assert(q);QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc fail");exit(-1);}newnode->data = *x;newnode->next = NULL;if (q->tail == NULL){q->head = q->tail = newnode;}else{q->tail->next = newnode;q->tail = newnode;}q->size++;
}

  出队列的实现。因为节点是动态开辟的空间,所以出队列之后,要将这个节点的空间释放掉。队列的特性是先入先出,所以,出队列就是删除头结点。删除头结点之前要保存第二个节点的位置,然后删除掉头结点,把第二个节点作为头结点返回。删除数据之后,要将size减一。

void QueuePop(Queue* q)
{assert(q);assert(!QueueEmpty(q));if (q->head->next == NULL){free(q->head);q->head = q->tail = NULL;q->size--;}else{QNode* del = q->head;q->head = q->head->next;q->size--;free(del);}
}

  获取队列头部元素,这里返回的是一个结构体指针,还是为了减少空间的使用,因为队列本身就具备头指针,所以获取队列头部元素就十分简单。

QDataType* QueueFront(Queue* q)
{assert(q);assert(!QueueEmpty(q));return &(q->head->data);
}

  获取队列队尾元素,一样返回的是一个结构体指针,实现和获取头部元素基本一样。

QDataType* QueueBack(Queue* q)
{assert(q);assert(!QueueEmpty(q));return &(q->tail->data);
}

  获取队列元素个数,不要太简单,本身就有个size,直接返回size就行。

int QueueSize(Queue* q)
{assert(q);return q->size;
}

  检测队列是否为空,如果为空返回非零结果,如果非空返回0。当首尾指针都为空时,队列中就必然没有数据。

int QueueEmpty(Queue* q)
{assert(q);return q->head == NULL && q->tail == NULL;
}

  队列的销毁,因为空间是动态开辟的,所以需要释放空间,如果不释放空间会造成内存泄露。逐一将队列中的节点空间释放掉,最后head和tail的next指针都为NULL,也不需要我们手动置为NULL了。

void QueueDestroy(Queue* q)
{assert(q);while (q->head){QNode* next = q->head;q->head = q->head->next;free(next);}
}

相关文章:

队列实现图书信息管理(C语言)

文章目录Queue.hmain.cQueue.c用队列实现一个图书信息管理&#xff0c;这里放一下有哪些文件。&#xff08;ps&#xff1a;我之前写的是学生信息管理&#xff0c;但是有人说我们的作业是写图书&#xff0c;就该了下内容&#xff0c;没有改文件名&#xff09;队列是用链表实现的…...

Java开发 - 读写分离初体验

前言 上一篇中&#xff0c;我们介绍了主从复制&#xff0c;相信学过的小伙伴已经能够很好的掌握主从复制的技术&#xff0c;实际上也并没有那么难&#xff0c;虽然没有讲一主多从&#xff0c;多主多从的配置&#xff0c;但是从一主一从的配置中也很容易联想到该怎么配置&#…...

图文详解CAN Log文件 - ASC文件格式

目录 1 CAN Log文件 -- ASC文件格式 1.1 Header 1.2 版本编号 1.3 经典CAN网络中的描述 1.3.1 经典CAN Standard标准帧的描述 1.3.2 经典CAN Extended扩展帧的描述 1.3.3 CAN Remote远程帧的描述 1.3.4 CAN Error错误帧的描述 1.4 CANFD网络中的描述 1.4.1 经典CAN S…...

网络编程套接字(一)

学习任务&#xff1a; 我们先来认识端口号&#xff0c;区分好主机IP和端口号的区别&#xff0c;以及涉及到进程PID和端口号的区别。 然后简单认识一下TCP协议和UDP协议&#xff0c;这两个协议都是传输层的。接着了解什么是网络字节序&#xff0c;它有什么作用。然后是网络编程的…...

Mysql数据库存储过程

1、参数分类 存储过程的参数类型可以是IN、OUT和INOUT。根据这点分类如下&#xff1a; 1、没有参数&#xff08;无参数无返回&#xff09; 2、仅仅带 IN 类型&#xff08;有参数无返回&#xff09; 3、仅仅带 OUT 类型&#xff08;无参数有返回&#xff09; 4、既带 IN 又带 O…...

当我开始学习人工智能:人工智能的学派及研究目标

上课真是不认真啊&#xff0c;现在都写不来了作业了&#xff0c;真的会谢 一、人工智能的学派及其争论 1.1 对人工智能方法的争论 三个学派 符号主义 认为人的认知基元是符号&#xff0c;认知过程即符号操作过程。 认为人是一个物理符号系统&#xff0c;计算机也是一个物理符…...

Html5钢琴块游戏制作与分享(音游可玩)

当年一款手机节奏音游&#xff0c;相信不少人都玩过或见过。最近也是将其做了出来分享给大家。 游戏的基本玩法&#xff1a;点击下落的黑色方块&#xff0c;弹奏音乐。&#xff08;下落的速度会越来越快&#xff09; 可以进行试玩&#xff0c;手机玩起来效果会更好些。 点击…...

MySQL数据库——数据库设计概念和数据库设计步骤

数据库设计就是根据业务系统的具体需求&#xff0c;结合我们所选用的数据库&#xff0c;建立好表结构及表与表之间的管理关系&#xff0c;为这个业务系统构造出最优秀的数据存储模型的过程。使之能有效的对应用的数据进行存储&#xff0c;并高效的对已经存储的数据进行访问。 …...

【云原生】Kubernetes(k8s)之Pod概念和使用

k8s之Pod概念和使用一、Pod简介1.1、Pod的阶段&#xff08;状态&#xff09;1.2、容器状态二、Pod的定义2.1、restartPolicy2.2、imagePullPolicy2.3、command2.4、args2.5、resources三、Pod的使用3.1、创建并访问Pod3.2、多个应用容器3.3、Init容器3.3.1、Init容器与普通容器…...

数组(九)-- LC[316][321][402] 去除重复字母

1 移掉 K 位数字 1.1 题目描述 题目链接&#xff1a;https://leetcode.cn/problems/remove-k-digits/ 1.2 思路分析 这道题让我们从一个字符串数字中删除 k 个数字&#xff0c;使得剩下的数最小。也就说&#xff0c;我们要保持原来的数字的相对位置不变。 以题目中的 num1432…...

ubuntu下Thrift安装

thrift是一种常用rpc框架&#xff0c;工作中经常会用到&#xff0c;本文记录一下其安装过程。 目录 1.下载软件包 1.1thrift下载 1.2libevent下载 1.3boost下载 2.安装&#xff08;注意步骤&#xff09; 2.1安装libevent 2.2安装boost 2.3安装与Python2.7版本对应的py…...

读懂AUTOSAR :DiagnosticLogAndTrace DLT(四)-- API解析

一、周期调用的函数&#xff1a;Dlt_TxFunction 根据参数DltGeneralTrafficShapingSupport&#xff0c;决定如何去发送DLT消息。如果为TRUE&#xff0c;那需要参考参数DltLogChannelTrafficShapingBandwidth为每个Log通道设置发送带宽&#xff1b;如果为FALSE&#xff0c;那么…...

【LeetCode】剑指 Offer 56. 数组中数字出现的次数 p275 -- Java Version

1. 题目介绍&#xff08;56. 数组中数字出现的次数&#xff09; 面试题56.&#xff1a;数组中数字出现的次数&#xff0c; 一共分为两小题&#xff1a; 题目一&#xff1a;数组中只出现一次的两个数字题目二&#xff1a;数组中唯一只出现一次的数字 2. 题目1&#xff1a;数组中…...

Zookeeper集群 + Fafka集群

目录 第一章Zookeeper 概述 1.1.Zookeeper 定义 1.2.Zookeeper 工作机制 1.3.Zookeeper 特点 1.4.Zookeeper 数据结构 1.5.Zookeeper 应用场景 1.6.Zookeeper 原理之选举机制 1.7.部署 Zookeeper 集群 总结 第二章消息队列概述 2.1消息队列需求原因 2.2消息队列的优…...

全国青少年电子信息智能创新大赛(复赛)python·模拟四卷

目录 一、编程题 答案解析如下: 下载文档打印做题: 全国青少年电子信息智能创新大赛(复赛)python模拟四卷 一、编程题 第一题:描述 班上有学生若干名,给出每名学生的年龄《整数),求班上所有学生的平均年龄,保留到小数点后两企 输入 第一行有一个整数n (1<= n...

Redis - 介绍与使用场景

简介 Redis 的全称是 Remote Dictionary Server&#xff0c;是一个使用 C 语言编写的、开源的&#xff08;BSD 许可&#xff09;高性能非关系型&#xff08;NoSQL&#xff09;的键值对数据库。 Redis 的数据是存储在内存中的&#xff0c;所以读写速度非常快&#xff0c;被广泛…...

Spark SQL实战(07)-Data Sources

1 概述 Spark SQL通过DataFrame接口支持对多种数据源进行操作。 DataFrame可使用关系型变换进行操作&#xff0c;也可用于创建临时视图。将DataFrame注册为临时视图可以让你对其数据运行SQL查询。 本节介绍使用Spark数据源加载和保存数据的一般方法&#xff0c;并进一步介绍…...

Django DRF - 权限Permissions

权限Permissions 权限控制可以限制用户对于视图的访问和对于具体数据对象的访问。 在执行视图的dispatch()方法前&#xff0c;会先进行视图访问权限的判断在通过get_object()获取具体对象时&#xff0c;会进行对象访问权限的判断 1.提供的权限 AllowAny 允许所有用户IsAuth…...

二叉树(OJ)

单值二叉树&#xff08;力扣&#xff09; ---------------------------------------------------哆啦A梦的任意门------------------------------------------------------- 我们来看一下题目的具体要求&#xff1a; 既然我们都学了二叉树了&#xff0c;我们就应该学会如何去…...

mysql中增删改成的练习

文章目录一、表的创建1.student表的数据2、课程表的数据course3、学生成绩表的数据二、操作序列1、查询计算机系cs的全体学生学号、姓名和性别2、检索选修了课程号为2的学生号和姓名3、检索至少选修了三门课以上的学生号4、检索选修了全部课程的学生5、在原表的基础上创建一个视…...

为什么自动驾驶地铁离不开形式化方法?从法国B方法到上海15号线的实战解析

数学如何为自动驾驶地铁筑起安全屏障&#xff1a;从B方法到工业级验证的深度实践 当一列无人驾驶的地铁以80公里时速穿越隧道时&#xff0c;系统每毫秒需要处理200传感器信号、执行30余项控制决策。巴黎地铁14号线自1998年开通以来保持零重大事故记录&#xff0c;上海15号线全自…...

大厂笔试面试八股文-算法-数组常考题-final

刷了200道数组题,笔试面试还是不会做?这10道搞懂就够了 刷了200道数组题,面试还是不会做? 问题不是你刷得不够多,而是没抓住核心套路。 我整理了35道大厂真题,发现其实就5个核心技巧。今天把最重要的10道题和背后的套路,全部分享给你。 offer直通车-大厂校招大礼包&#x…...

Quartus II 13.1 NCO IP核调用失败?可能是这两个坑你没注意(附详细license配置指南)

Quartus II 13.1 NCO IP核调用深度排障指南&#xff1a;从环境配置到授权管理 1. 环境准备&#xff1a;Java运行时环境的隐形陷阱 在FPGA开发中&#xff0c;数字控制振荡器&#xff08;NCO&#xff09;IP核是实现高精度频率合成的关键组件。然而&#xff0c;当你在Quartus II 1…...

GLM-4.1V-9B-Base基础教程:3步完成图片上传→中文提问→结果解析

GLM-4.1V-9B-Base基础教程&#xff1a;3步完成图片上传→中文提问→结果解析 1. 认识GLM-4.1V-9B-Base GLM-4.1V-9B-Base是智谱开源的一款视觉多模态理解模型&#xff0c;专门用于处理图像内容识别、场景描述、目标问答和中文视觉理解任务。这个模型已经完成了Web化封装&…...

从“单点防御”到“全局联动”:手把手教你用EDR和NDR构建企业安全闭环

从“单点防御”到“全局联动”&#xff1a;手把手教你用EDR和NDR构建企业安全闭环 当企业的安全团队还在疲于应对零散的端点告警和网络流量异常时&#xff0c;攻击者早已开始采用自动化工具进行横向移动。传统孤立的防御手段就像用多个单点摄像头监控银行金库——每个摄像头都…...

新国标GB 44263实战:如何用一颗传感器搞定交/直/脉动全波形漏电检测?

第一名背后鲜为人知的“现实”我国已经建成全球规模最大的电动汽车充电网络&#xff0c;国家能源局数据显示&#xff0c;截至2026年1月底&#xff0c;我国电动汽车充电基础设施&#xff08;枪&#xff09;总数达到2069.8万个&#xff0c;公共充电设施&#xff08;枪&#xff09…...

赋能音乐自由:Unlock Music技术解密与全场景应用指南

赋能音乐自由&#xff1a;Unlock Music技术解密与全场景应用指南 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库&#xff1a; 1. https://github.com/unlock-music/unlock-music &#xff1b;2. https://git.unlock-music.dev/um/web 项目地址: https:…...

Sketch Measure: 设计标注自动化的创新实践

Sketch Measure: 设计标注自动化的创新实践 【免费下载链接】sketch-measure Make it a fun to create spec for developers and teammates 项目地址: https://gitcode.com/gh_mirrors/sk/sketch-measure 在数字化产品开发流程中&#xff0c;设计稿到代码实现的转化始终…...

抖音批量下载神器:告别手动保存,一键收藏创作者全部作品

抖音批量下载神器&#xff1a;告别手动保存&#xff0c;一键收藏创作者全部作品 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser f…...

忍者像素绘卷入门必看:Z-Image-Turbo模型结构精简与推理速度提升原理

忍者像素绘卷入门必看&#xff1a;Z-Image-Turbo模型结构精简与推理速度提升原理 1. 项目概述 忍者像素绘卷是一款基于Z-Image-Turbo深度优化的图像生成工作站&#xff0c;专为16-Bit复古游戏美学风格设计。它采用明亮的"云端"视觉设计&#xff0c;为用户提供清爽且…...