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

【零基础学数据结构】顺序表实现书籍存储

目录

书籍存储的实现规划

​编辑 前置准备:

 书籍结构体:

书籍展示的初始化和文件加载

书籍展示的销毁和文件保存

 书籍展示的容量检查

 书籍展示的尾插实现

 书籍展示的书籍增加

 书籍展示的书籍打印

 书籍删除展示数据

书籍展示修改数据

在指定位置之前删除数据

 书籍查找展示数据

 测试文件:

 源代码文件:


书籍存储的实现规划

 前置准备:

文件前置创建:

  1. BookList.h  -  头文件声明
  2. BookList.c  -  实现功能
  3. text.c           -  测试文件
  • 创建书籍结构体
  • 创建动态内存

  BookList 结构体的创建
 为了方便后续更改,我们有以下定义
 1.书名  2.作者  3.价格  4.分类  5.编号

#define BOOKNAME 100
#define AUTHOR 50
#define TYPE 30
#define ID 50

 书籍结构体:

typedef struct BookList
{char book_name[BOOKNAME]; //书名char author[AUTHOR];      //作者float price;			  //价格char type[TYPE];		  //分类char id[ID];			  //编号
}BookList;

 定义类型方便更改

typedef BookList SLDataType;

创建动态顺序表 

typedef struct Book
{SLDataType* arr;        //指针变量,指向结构体类型元素的数组int size;				//有效数据的个数int capacity;			//空间容量大小
}Book;

书籍展示的初始化和文件加载

void BookInit(Book* book);
void LoadBook(Book* book);
// 书籍展示的初始化和文件加载
void BookInit(Book* book)
{book->arr = NULL;book->size = book->capacity = 0;LoadBook(book);
}void LoadBook(Book* book)
{FILE* pf = fopen("booklist", "rb");if (NULL == pf){perror("fopen booklist error!");return;}//加载文件BookList b2;while (fread(&b2, sizeof(BookList), 1, pf)){//尾插BookPushBack(book, b2);}printf("数据加载成功!\n");fclose(pf);pf = NULL;
}

书籍展示的销毁和文件保存

void BookDestroy(Book* book);
void SaveBook(Book* book);
// 书籍展示的销毁和文件保存
void SLDestroy(Book* ps)
{if (ps->arr==NULL)   //判断ps->arr是否为NULL,如果不为NULL,说明空间需要释放{free(ps->arr);}ps->arr = NULL;ps->size = ps->capacity = 0;
}void BookDestroy(Book* book)
{SaveBook(book);SLDestroy(book);
}// 图书书籍存储
void SaveBook(Book* book)
{FILE* pd = fopen("booklist", "wb");if (NULL == pd){perror("fopen booklist error!");return;}// 存储书籍数据for (int i = 0; i < book->size; i++){fwrite(book->arr+i, sizeof(BookList), 1, pd);}printf("数据保存成功!\n");fclose(pd);pd = NULL;
}

 书籍展示的容量检查

void BookCheckCapacity(Book* book);
// 书籍展示的容量检查
void BookCheckCapacity(Book* book)
{if (book->capacity == book->size){int newcapacity = book->capacity == 0 ? 4 : book->capacity * 2;//动态内存分配SLDataType* tmp = (SLDataType*)realloc(book->arr, newcapacity * sizeof(SLDataType));if (NULL == tmp){perror("realloc error!");return;}book->arr = tmp;book->capacity = newcapacity;}
}

 书籍展示的尾插实现

void BookPushBack(Book* book, SLDataType x);
// 书籍展示的尾插实现
void BookPushBack(Book* book, SLDataType x)
{assert(book);//尾插之前检查内存是否够BookCheckCapacity(book);//进行尾插book->arr[book->size++] = x;
}

 书籍展示的书籍增加

void BookAdd(Book* book);
// 书籍展示的书籍增加
void BookAdd(Book* book)
{// 1.书名  2.作者  3.价格  4.分类  5.编号BookList b1;printf("请输入你要添加的书籍名字:\n");scanf("%s", b1.book_name);printf("请输入你要添加的书籍作者:\n");scanf("%s", b1.author);printf("请输入你要添加的书籍价格:\n");scanf("%f", &(b1.price));printf("请输入你要添加的书籍分类:\n");scanf("%s", b1.type);printf("请输入你要添加的书籍编号:\n");scanf("%s", b1.id);// 添加数据BookPushBack(book, b1);printf("添加成功!\n");
}

 书籍展示的书籍打印

void BookPint(Book* book);
// 书籍展示的书籍打印
void BookPint(Book* book)
{// 1.书名  2.作者  3.价格  4.分类  5.编号printf("%-10s %-10s %-10s %-10s %-15s\n", "书名", "作者", "价格", "分类", "编号");printf("-------------------------------------------------------------\n");for (int i = 0; i < book->size; i++){printf("%-10s %-10s %-10.1f %-10s %-15s\n",book->arr[i].book_name,book->arr[i].author,book->arr[i].price,book->arr[i].type,book->arr[i].id);}
}

 书籍删除展示数据

void BookDel(Book* book);
//删除书籍展示数据
void BookDel(Book* book)
{// 在删除之前先检查数据存不存在char name[BOOKNAME];printf("请输入您需要删除的书籍:\n");scanf("%s", name);int find = FindByName(book, name);if (find < 0){printf("无法找到需要删除的图书\n");return;}SLErase(book, find);printf("删除成功!\n");
}

书籍展示修改数据

void BookModify(Book* book);
//书籍展示修改数据
void BookModify(Book* book)
{//要修改的书籍需要存在char name[BOOKNAME];printf("请输入你需要修改的图书名字:\n");scanf("%s", name);//查找书籍看是否存在int find = FindByName(book, name);if (find < 0){printf("无法找到需要修改的图书\n");return;}//直接修改printf("请输入新的图书名字:\n");scanf("%s", book->arr[find].book_name);printf("请输入新的图书作者:\n");scanf("%s", book->arr[find].author);printf("请输入新的图书价格:\n");scanf("%f", &(book->arr[find].price));printf("请输入新的图书分类:\n");scanf("%s", book->arr[find].type);printf("请输入新的图书编号:\n");scanf("%s", book->arr[find].id);printf("修改成功!\n");
}

在指定位置之前删除数据

void SLErase(Book* book, int pos);
//在指定位置之前删除数据
void SLErase(Book* book, int pos)
{assert(book);//断言防止传入空指针//判断删除的数据是否合法if (pos >= 0 && pos < book->size){// 删除数据for (int i = pos; i < book->size - 1; i++){book->arr[i] = book->arr[i + 1];//ps->[size-2]=ps->arr[size-1]}--book->size;}
}

 书籍查找展示数据

void BookFind(Book* book);
//查找图书数据
void BookFind(Book* book)
{char name[BOOKNAME];printf("请输入你要查找的书籍名字:\n");scanf("%s", name);//检查图书数据是否存在int find = FindByName(book, name);if (find < 0){printf("您要查找的书籍不存在!\n");return;}// 1.书名  2.作者  3.价格  4.分类  5.编号printf("%-10s %-10s %-10s %-10s %-15s\n", "书名", "作者", "价格", "分类", "编号");printf("-------------------------------------------------------------\n");//找到了printf("%-10s %-10s %-10.1f %-10s %-15s\n",book->arr[find].book_name,book->arr[find].author,book->arr[find].price,book->arr[find].type,book->arr[find].id);
}

 测试文件:

#define _CRT_SECURE_NO_WARNINGS 1
#include "BookList.h"
#include <windows.h>enum book_name
{ExitBook, // 0AddBook, // 1DelBook, //...PrintBook,ChangeBook,CheckBook
};void book_print()
{printf("*****************书籍录*********************\n");printf("*************1. 增添图书********************\n");printf("*************2. 删除图书********************\n");printf("*************3. 打印图书********************\n");printf("*************4. 修改图书********************\n");printf("*************5. 查找图书********************\n");printf("*************0. 退出图书录******************\n");
}int main()
{Book b1;// 创建通讯录对象,实际上就是顺序表对象,等价于 SL sl//顺序表的创建BookInit(&b1);int op = -1;do{book_print();printf("请选择你的操作:\n");scanf("%d", &op);switch (op){case ExitBook:printf("退出图书录系统...\n");Sleep(1000);break;case AddBook:BookAdd(&b1);Sleep(1000);break;case DelBook:BookDel(&b1);Sleep(1000);break;case PrintBook:BookPint(&b1);Sleep(1000);break;case ChangeBook:BookModify(&b1);Sleep(1000);break;case CheckBook:BookFind(&b1);Sleep(1000);break;default:printf("选择错误,请重新选择\n");Sleep(1000);break;}} while (op != 0);// 顺序表的销毁BookDestroy(&b1);return 0;
}

 源代码文件:

BookList_2024_4_5 · 34c38d2 · 阳区欠/C语言学习路程 - Gitee.com

相关文章:

【零基础学数据结构】顺序表实现书籍存储

目录 书籍存储的实现规划 ​编辑 前置准备&#xff1a; 书籍结构体&#xff1a; 书籍展示的初始化和文件加载 书籍展示的销毁和文件保存 书籍展示的容量检查 书籍展示的尾插实现 书籍展示的书籍增加 书籍展示的书籍打印 书籍删除展示数据 书籍展示修改数据 在指定位置之前…...

【智能算法】黑寡妇优化算法(BWO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2020年&#xff0c;V Hayyolalam等人受到自然界黑寡妇交配行为启发&#xff0c;提出了黑寡妇优化算法&#xff08;Black Widow Optimization Agorithm, BWO&#xff09;。 2.算法原理 2.1算法思想…...

C#-非托管代码

非托管代码是指不受.NET运行时&#xff08;CLR&#xff09;的管理和控制&#xff0c;而是直接由操作系统或其他本机执行环境&#xff08;如C/C编译的代码&#xff09;所执行的代码。以下是一些常见的非托管代码的例子&#xff1a; C/C代码&#xff1a;通过使用C或C等编程语言编…...

计算机视觉之三维重建(7)---多视图几何(下)

文章目录 一、透视结构恢复问题1.1 概述1.2 透视结构恢复歧义1.3 代数方法1.4 捆绑调整 二、P3P问题三、随机采样一致性 一、透视结构恢复问题 1.1 概述 1. 透视结构恢复问题&#xff1a;摄像机为透视相机&#xff0c;内外参数均未知。 2. 问题&#xff1a;已知 n n n 个三维…...

AUTOSAR配置工具开发教程 - 开篇

简介 本系列的教程&#xff0c;主要讲述如何自己开发一套简单的AUTOSAR ECU配置工具。适用于有C# WPF基础的人员。 简易介绍见&#xff1a;如何打造AUTOSAR工具_autosar_mod_ecuconfigurationparameters-CSDN博客 实现版本 AUTOSAR 4.0.3AUTOSAR 4.2.2AUTOSAR 4.4.0 效果 …...

配置VM开机自启动

1. 在此电脑-右键选择“管理”-服务和应用程序-服务中找到VMware Workstation Server服务&#xff08;新版名称也可能是VMware自启动服务&#xff0c;自己找一下&#xff0c;服务属性里有描述信息的&#xff09;&#xff0c;将其启用并选择开机自动启动 新版参考官方文档&…...

工作的第四天

推荐一个软件分配软件 我们看一下如何使用 连接信息 AOC中国官方网站 发现打开 还是这个页面信息&#xff0c;发现最后出现了页面重新定向的问题 我服了 我的码 怎么解决 我想用这个软件 来看看这个软件下载就可以使用 一听到钱我使用的情绪不是很高了 算了不使用 使用…...

前端开发语言概览:从HTML、CSS到JavaScript

随着互联网的发展&#xff0c;前端开发领域涌现出了许多不同的编程语言和技术&#xff0c;用于构建各种类型的网页和应用程序。本文将介绍几种主流的前端开发语言&#xff0c;包括 HTML、CSS 和 JavaScript&#xff0c;并简要讨论它们在前端开发中的作用和特点。 1. HTML&…...

《Java面试自救指南》(专题二)计算机网络

文章目录 力推的计网神课get请求和post请求的区别在浏览器网址输入一个url后直到浏览器显示页面的过程常用状态码session 和 cookie的区别TCP的三次握手和四次挥手七层OSI模型&#xff08;TCP/IP协议模型&#xff09;各种io模型的知识http协议和tcp协议的区别https和http的区别…...

Android14音频进阶之<进阶调试>:Perfetto定位系统音频问题(六十六)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+AOSP…...

使用 Clickhouse 集成的表引擎同步数据方式详解

Clickhouse作为一个列式存储分析型数据库&#xff0c;提供了很多集成其他组件的表引擎数据同步方案。 官网介绍 一 Kafka 表引擎 使用Clickhouse集成的Kafka表引擎消费Kafka写入Clickhouse表中。 1.1 流程图 1.2 建表 根据上面的流程图需要建立三张表&#xff0c;分别Click…...

Linux 性能分析工具大全

vmstat--虚拟内存统计 vmstat&#xff08;VirtualMeomoryStatistics&#xff0c;虚拟内存统计&#xff09;是 Linux 中监控内存的常用工具,可对操作系统的虚拟内存、进程、CPU 等的整体情况进行监视。vmstat 的常规用法&#xff1a;vmstat interval times 即每隔 interval 秒采…...

FME学习之旅---day21

我们付出一些成本&#xff0c;时间的或者其他&#xff0c;最终总能收获一些什么。 教程&#xff1a;AutoCAD 变换 相关的文章 为您的 DWG 赋予一些样式&#xff1a;使用 DWGStyler、模板文件、块等 FME数据检查器在显示行的方式上受到限制。它只能显示线条颜色&#xff0c;而…...

volta(轻松切换管理Node.js版本)

Node.js版本管理 Volta提供了一个简单直观的命令行界面&#xff0c;可以轻松地安装、卸载、更新和切换Node.js版本。 Volta 既可以全局使用&#xff0c;也可以在项目级别使用&#xff0c;可以为每个项目单独设置node版本&#xff0c;nvm不行。 下载安装Volta 参考&#xff1a; …...

机器学习知识点

1鸢尾花分类 鸢尾花分类问题是一个经典的机器学习问题&#xff0c;旨在根据鸢尾花的花萼长度、花萼宽度、花瓣长度和花瓣宽度等特征&#xff0c;将鸢尾花分成三个品种&#xff1a;山鸢尾&#xff08;setosa&#xff09;、变色鸢尾&#xff08;versicolor&#xff09;和维吉尼亚…...

SQL注入利用学习-Union联合注入

联合注入的原理 在SQL语句中查询数据时&#xff0c;使用select 相关语句与where 条件子句筛选符合条件的记录。 select * from person where id 1; #在person表中&#xff0c;筛选出id1的记录如果该id1 中的1 是用户可以控制输入的部分时&#xff0c;就有可能存在SQL注入漏洞…...

zookeeper源码(12)命令行客户端

zkCli.sh脚本 这个命令行脚本在bin目录下&#xff1a; ZOOBIN"${BASH_SOURCE-$0}" ZOOBIN"$(dirname "${ZOOBIN}")" ZOOBINDIR"$(cd "${ZOOBIN}"; pwd)"# 加载zkEnv.sh脚本 if [ -e "$ZOOBIN/../libexec/zkEnv.sh&qu…...

深度学习的数学基础--Homework2

学习资料&#xff1a;https://www.bilibili.com/video/BV1mg4y187qv/?spm_id_from333.788.recommend_more_video.1&vd_sourced6b1de7f052664abab680fc242ef9bc1 神经网络的特点&#xff1a;它不是一个解析模型&#xff0c;它的储存在一堆参数里面&#xff08;确定一个超平…...

什么是HW,企业如何进行HW保障?

文章目录 一、什么是HW二、HW行动具体采取了哪些攻防演练措施三、攻击方一般的攻击流程和方法四、企业HW保障方案1.建意识2.摸家底3.固城池4.配神器5.增值守 一、什么是HW 网络安全形势近年出现新变化&#xff0c;网络安全态势变得越来越复杂&#xff0c;黑客攻击入侵、勒索病…...

【Redis系列】Spring Boot 集成 Redis 实现缓存功能

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代&#xff0c;海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构&#xff0c;在处理大规模数据抓取任务时展现出强大的能力。然而&#xff0c;随着业务规模的不断扩大和数据抓取需求的日益复杂&#xff0c;传统…...