【零基础学数据结构】顺序表实现书籍存储
目录
书籍存储的实现规划
编辑 前置准备:
书籍结构体:
书籍展示的初始化和文件加载
书籍展示的销毁和文件保存
书籍展示的容量检查
书籍展示的尾插实现
书籍展示的书籍增加
书籍展示的书籍打印
书籍删除展示数据
书籍展示修改数据
在指定位置之前删除数据
书籍查找展示数据
测试文件:
源代码文件:
书籍存储的实现规划
前置准备:
文件前置创建:
- BookList.h - 头文件声明
- BookList.c - 实现功能
- 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
相关文章:
【零基础学数据结构】顺序表实现书籍存储
目录 书籍存储的实现规划 编辑 前置准备: 书籍结构体: 书籍展示的初始化和文件加载 书籍展示的销毁和文件保存 书籍展示的容量检查 书籍展示的尾插实现 书籍展示的书籍增加 书籍展示的书籍打印 书籍删除展示数据 书籍展示修改数据 在指定位置之前…...
【智能算法】黑寡妇优化算法(BWO)原理及实现
目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2020年,V Hayyolalam等人受到自然界黑寡妇交配行为启发,提出了黑寡妇优化算法(Black Widow Optimization Agorithm, BWO)。 2.算法原理 2.1算法思想…...
C#-非托管代码
非托管代码是指不受.NET运行时(CLR)的管理和控制,而是直接由操作系统或其他本机执行环境(如C/C编译的代码)所执行的代码。以下是一些常见的非托管代码的例子: C/C代码:通过使用C或C等编程语言编…...
计算机视觉之三维重建(7)---多视图几何(下)
文章目录 一、透视结构恢复问题1.1 概述1.2 透视结构恢复歧义1.3 代数方法1.4 捆绑调整 二、P3P问题三、随机采样一致性 一、透视结构恢复问题 1.1 概述 1. 透视结构恢复问题:摄像机为透视相机,内外参数均未知。 2. 问题:已知 n n n 个三维…...
AUTOSAR配置工具开发教程 - 开篇
简介 本系列的教程,主要讲述如何自己开发一套简单的AUTOSAR ECU配置工具。适用于有C# WPF基础的人员。 简易介绍见:如何打造AUTOSAR工具_autosar_mod_ecuconfigurationparameters-CSDN博客 实现版本 AUTOSAR 4.0.3AUTOSAR 4.2.2AUTOSAR 4.4.0 效果 …...
配置VM开机自启动
1. 在此电脑-右键选择“管理”-服务和应用程序-服务中找到VMware Workstation Server服务(新版名称也可能是VMware自启动服务,自己找一下,服务属性里有描述信息的),将其启用并选择开机自动启动 新版参考官方文档&…...
工作的第四天
推荐一个软件分配软件 我们看一下如何使用 连接信息 AOC中国官方网站 发现打开 还是这个页面信息,发现最后出现了页面重新定向的问题 我服了 我的码 怎么解决 我想用这个软件 来看看这个软件下载就可以使用 一听到钱我使用的情绪不是很高了 算了不使用 使用…...
前端开发语言概览:从HTML、CSS到JavaScript
随着互联网的发展,前端开发领域涌现出了许多不同的编程语言和技术,用于构建各种类型的网页和应用程序。本文将介绍几种主流的前端开发语言,包括 HTML、CSS 和 JavaScript,并简要讨论它们在前端开发中的作用和特点。 1. HTML&…...
《Java面试自救指南》(专题二)计算机网络
文章目录 力推的计网神课get请求和post请求的区别在浏览器网址输入一个url后直到浏览器显示页面的过程常用状态码session 和 cookie的区别TCP的三次握手和四次挥手七层OSI模型(TCP/IP协议模型)各种io模型的知识http协议和tcp协议的区别https和http的区别…...
Android14音频进阶之<进阶调试>:Perfetto定位系统音频问题(六十六)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+AOSP…...
使用 Clickhouse 集成的表引擎同步数据方式详解
Clickhouse作为一个列式存储分析型数据库,提供了很多集成其他组件的表引擎数据同步方案。 官网介绍 一 Kafka 表引擎 使用Clickhouse集成的Kafka表引擎消费Kafka写入Clickhouse表中。 1.1 流程图 1.2 建表 根据上面的流程图需要建立三张表,分别Click…...
Linux 性能分析工具大全
vmstat--虚拟内存统计 vmstat(VirtualMeomoryStatistics,虚拟内存统计)是 Linux 中监控内存的常用工具,可对操作系统的虚拟内存、进程、CPU 等的整体情况进行监视。vmstat 的常规用法:vmstat interval times 即每隔 interval 秒采…...
FME学习之旅---day21
我们付出一些成本,时间的或者其他,最终总能收获一些什么。 教程:AutoCAD 变换 相关的文章 为您的 DWG 赋予一些样式:使用 DWGStyler、模板文件、块等 FME数据检查器在显示行的方式上受到限制。它只能显示线条颜色,而…...
volta(轻松切换管理Node.js版本)
Node.js版本管理 Volta提供了一个简单直观的命令行界面,可以轻松地安装、卸载、更新和切换Node.js版本。 Volta 既可以全局使用,也可以在项目级别使用,可以为每个项目单独设置node版本,nvm不行。 下载安装Volta 参考: …...
机器学习知识点
1鸢尾花分类 鸢尾花分类问题是一个经典的机器学习问题,旨在根据鸢尾花的花萼长度、花萼宽度、花瓣长度和花瓣宽度等特征,将鸢尾花分成三个品种:山鸢尾(setosa)、变色鸢尾(versicolor)和维吉尼亚…...
SQL注入利用学习-Union联合注入
联合注入的原理 在SQL语句中查询数据时,使用select 相关语句与where 条件子句筛选符合条件的记录。 select * from person where id 1; #在person表中,筛选出id1的记录如果该id1 中的1 是用户可以控制输入的部分时,就有可能存在SQL注入漏洞…...
zookeeper源码(12)命令行客户端
zkCli.sh脚本 这个命令行脚本在bin目录下: ZOOBIN"${BASH_SOURCE-$0}" ZOOBIN"$(dirname "${ZOOBIN}")" ZOOBINDIR"$(cd "${ZOOBIN}"; pwd)"# 加载zkEnv.sh脚本 if [ -e "$ZOOBIN/../libexec/zkEnv.sh&qu…...
深度学习的数学基础--Homework2
学习资料:https://www.bilibili.com/video/BV1mg4y187qv/?spm_id_from333.788.recommend_more_video.1&vd_sourced6b1de7f052664abab680fc242ef9bc1 神经网络的特点:它不是一个解析模型,它的储存在一堆参数里面(确定一个超平…...
什么是HW,企业如何进行HW保障?
文章目录 一、什么是HW二、HW行动具体采取了哪些攻防演练措施三、攻击方一般的攻击流程和方法四、企业HW保障方案1.建意识2.摸家底3.固城池4.配神器5.增值守 一、什么是HW 网络安全形势近年出现新变化,网络安全态势变得越来越复杂,黑客攻击入侵、勒索病…...
【Redis系列】Spring Boot 集成 Redis 实现缓存功能
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
基于LabVIEW与麦克风阵列的实时噪声源定位系统设计与实践
1. 项目概述:从“听见”到“看见”噪声在工业现场、产品研发或环境监测中,我们常常遇到一个棘手的问题:噪声到底是从哪里来的?传统的单点声压级测量只能告诉我们“这里有多吵”,却无法回答“是谁在吵”以及“它在哪里吵…...
Driftguard MCP:AI编码助手实时防代码漂移的MCP协议解决方案
1. 项目概述:当AI助手开始“自我审查”你的代码库最近在折腾AI助手集成开发环境时,发现了一个挺有意思的项目:jschoemaker/driftguard-mcp。乍一看这个名字,driftguard——漂移守卫,MCP——Model Context Protocol&…...
如何快速掌握ppInk:Windows平台上的终极屏幕标注工具指南
如何快速掌握ppInk:Windows平台上的终极屏幕标注工具指南 【免费下载链接】ppInk Fork from Gink 项目地址: https://gitcode.com/gh_mirrors/pp/ppInk 你是否曾经在演示时需要快速标注屏幕内容,却发现现有工具要么功能太简陋,要么操作…...
Draft-classic:云原生开发中Kubernetes部署的快速原型工具
1. 项目概述:从零到一的云原生应用部署加速器 如果你和我一样,长期在云原生和Kubernetes领域摸爬滚打,一定经历过这样的场景:一个应用的核心代码逻辑早已写完,但为了让它能在Kubernetes集群里跑起来,你不得…...
当AI开始检测自身缺陷:测试工具失控的风险与应对
在软件测试领域,AI正从辅助工具向核心角色转变。2026年的测试场景中,AI不仅能自动生成测试用例、自我修复失效选择器,还能以人眼精度完成视觉回归检测。这些能力让测试工程师从繁琐的重复劳动中解放出来,将精力聚焦于业务逻辑与边…...
基于Node.js与Socket.IO构建开源实时聊天应用:从架构到部署
1. 项目概述:一个为纯净对话而生的开源聊天应用在信息过载的今天,我们每天被各种应用的通知、广告和复杂功能所包围。对于即时通讯这类高频使用的工具,这种“臃肿感”尤为明显。你是否也怀念过早期聊天软件那种简洁、纯粹、专注于信息交换本身…...
MPC-HC播放器:3步打造你的专属影院级视听体验
MPC-HC播放器:3步打造你的专属影院级视听体验 【免费下载链接】mpc-hc MPC-HCs main repository. For support use our Trac: https://trac.mpc-hc.org/ 项目地址: https://gitcode.com/gh_mirrors/mpc/mpc-hc MPC-HC(Media Player Classic Home …...
数字家谱系统架构设计:从关系数据库到可视化交互的完整实现
1. 项目概述:从“家谱”到“数字家谱”的跨越最近在GitHub上看到一个挺有意思的项目,叫qiaoshouqing/familytree。光看名字,你可能会觉得,这不就是个家谱吗?没错,它的核心确实是家谱,但如果你把…...
当Agent开始自我调试、自我迭代——斯坦福CRFM最新实验揭示:自主进化阈值将在18个月内被突破
更多请点击: https://intelliparadigm.com 第一章:当Agent开始自我调试、自我迭代——斯坦福CRFM最新实验揭示:自主进化阈值将在18个月内被突破 核心突破:从工具调用到元认知闭环 斯坦福CRFM团队在2024年Q2发布的《Self-Improvi…...
卫星通信安全认证技术解析与应用指南
1. 卫星通信安全认证技术概述 卫星通信作为现代信息基础设施的重要组成部分,其安全性直接关系到国家安全和经济发展。在近地轨道卫星数量激增、天地一体化网络快速发展的背景下,传统地面网络的安全认证方案已无法满足卫星通信的特殊需求。卫星信道具有长…...
