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

news2025/1/13 2:54:01

目录

书籍存储的实现规划

​编辑 前置准备:

 书籍结构体:

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

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

 书籍展示的容量检查

 书籍展示的尾插实现

 书籍展示的书籍增加

 书籍展示的书籍打印

 书籍删除展示数据

书籍展示修改数据

在指定位置之前删除数据

 书籍查找展示数据

 测试文件:

 源代码文件:


书籍存储的实现规划

 前置准备:

文件前置创建:

  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, // 0
	AddBook, // 1
	DelBook, //...
	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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1570040.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学习鸿蒙基础(12)

目录 一、网络json-server配置 &#xff08;1&#xff09;然后输入&#xff1a; &#xff08;2&#xff09;显示下载成功。但是输入json-server -v的时候。报错。 &#xff08;3&#xff09;此时卸载默认的json-server &#xff08;4&#xff09;安装和nodejs匹配版本的js…

第十四篇:web后端开发-Springboot

文章目录 一、Web入门1. 什么是Spring2. SpringBootWeb入门3. HTTP 协议3.1 HTTP-概述3.2 HTTP-请求协议3.3 HTTP-响应协议 4. Web服务器4.1 Tomcat---简介4.2 基本使用 5. 请求/响应5.1 请求5.1.1 postman5.1.2 简单参数5.1.3 实体参数5.1.4 数组集合参数5.1.5 日期参数5.1.6 …

蓝桥备赛——循环+二分

题干 AC code n,kmap(int,input().split()) data[] for i in range(n):h,wmap(int,input().split())mid[]mid.append(h)mid.append(w)data.append(mid) front,tail1,100000 def find(edge_len):global kans0for wid,hei in data:ans(wid//edge_len)*(hei//edge_len)if ans>…

java Web 辅助学习管理系统idea开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 java Web 辅助学习管理系统是一套完善的信息管理系统&#xff0c;结合java 开发技术和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 前段主要技术 bootstr…

【ArcGIS微课1000例】0107:ArcGIS加载在线历史影像服务WMTS

文章目录 一、WMTS历史影像介绍二、ArcGIS加载WMTS服务三、Globalmapper加载WMTS服务一、WMTS历史影像介绍 通过访问历史影响WMTS服务,可以将全球范围内历史影像加载进来,如下所示: WMTS服务: https://wayback.maptiles.arcgis.com/arcgis/rest/services/World_Imagery/WM…

四川易点慧电子商务抖音小店品质之选,信赖之源

随着互联网的快速发展&#xff0c;电子商务以其便捷、高效的特点成为越来越多消费者购物的首选。四川易点慧电子商务抖音小店&#xff0c;作为众多电商平台中的佼佼者&#xff0c;以其卓越的品质和优质的服务赢得了广大消费者的信赖。 一、品质保证&#xff0c;消费无忧 四川易…

整合Mybatis(Spring学习笔记十二)

一、导入相关的包 junit 包 Mybatis包 mysql数据库包 Spring相关的包 Aop相关的包 Mybatis-Spring包&#xff08;现在就来学这个&#xff09; 提示jdk版本不一致的朋友记得 jdk8只支持spring到5.x 所以如果导入的spring(spring-we…

高等数学基础篇(数二)之定积分的应用

定积分的应用&#xff1a; 一、几何应用 二、物理应用 三、几何例题 四、物理例题 目录 一、几何应用 1.平面图形的面积 2.旋转体体积 3.曲线弧长 4.旋转体侧面积 二、物理应用 三、几何例题 四、物理例题 一、几何应用 1.平面图形的面积 2.旋转体体积 3.曲线弧长…

45.网络游戏逆向分析与漏洞攻防-角色管理功能通信分析-解码发送数据内容输出到日志

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果 现在的代码都是依据数据包来写的&#xff0c;如果看不懂代码&#xff0c;就说明没看懂数据包…

VUE3和SpringBoot实现ChatGPT页面打字效果SSE流式数据展示

在做这个功能之前&#xff0c;本人也是走了很多弯路&#xff08;花了好几天才搞好&#xff09;&#xff0c;你能看到本篇博文&#xff0c;那你就是找对地方了。百度上很多都是使用SseEmitter这种方式&#xff0c;这种方式使用的是websocket&#xff0c;使用这种方式就搞复杂了&…

58 vue-cli 以及 webpack 提供的默认的插件, 配置

前言 vue-cli 这边作为驱动 webpack 的一个应用 它需要构造 webpack 所需要的上下文, 以及参数 这里 我们来关注一下 vue-cli 这边为 webpack 构造的参数 的相关处理 webpack 这边上下文的配置, 主要分为了几个部分, Entry, Output, Module, Resolve, Plugin, DevServer, O…

open-cd框架调试记录

源于论文Changer: Feature Interaction Is What You Need forChange Detection 源码位置&#xff1a;open-cd/README.md at main likyoo/open-cd (github.com) 同样是基于MMSegmentation框架的代码&#xff0c;不符合本人编程习惯所以一直也没有研究这东西&#xff0c;近期打…

第15章 File类与IO流

一 java.io.File类的使用 1.1 概述 File类及本章下的各种流&#xff0c;都定义在java.io包下。一个File对象代表硬盘或网络中可能存在的一个文件或者文件目录&#xff08;俗称文件夹&#xff09;&#xff0c;与平台无关。&#xff08;体会万事万物皆对象&#xff09;File 能新…

AcWing 788. 逆序对的数量——算法基础课题解

AcWing 788. 逆序对的数量 题目描述 给定一个长度为 n 的整数数列&#xff0c;请你计算数列中的逆序对的数量。 逆序对的定义如下&#xff1a;对于数列的第 i 个和第 j 个元素&#xff0c;如果满足 i<j且 a[i]>a[j]&#xff0c;则其为一个逆序对&#xff1b;否则不是。…

基于 Rust 标准库 API 使用 200 行代码实现 Http 1.1 协议简易服务

1. 背景 早在之前学过一波 Rust&#xff0c;但是由于没用武之地&#xff0c;没过多久又荒废了&#xff0c;最近想捡起来下。刚好看见有群里小伙伴说学习 Http 网络协议太难怎么办&#xff1f;其实很多技术都是相通的&#xff0c;只要你理解了技术的本质就可以自己实现它&#…

buu刷题(2)

[护网杯 2018]easy_tornado web buuctf [护网杯 2018]easy_tornado1_[护网杯 2018]easy_tornado 1-CSDN博客 render是渲染HTML页面用到的函数 这应该是一个模板注入漏洞 访问/fllllllllllllag&#xff0c;自动跳到了这个页面&#xff0c;可以看到 url 上有个msgError, 尝试将…

Node.js------模块化

◆ 能够说出模块化的好处◆ 能够知道 CommonJS 规定了哪些内容◆ 能够说出 Node.js 中模块的三大分类各自是什么◆ 能够使用 npm 管理包◆ 能够了解什么是规范的包结构◆ 能够了解模块的加载机制 一.模块化的基本概念 1.模块化 模块化是指解决一个复杂问题时&#xff0c…

大商创多用户商城系统 多处SQL注入漏洞复现

0x01 产品简介 大商创多用户商城系统是一个功能强大、灵活多变的新零售电商系统服务商。该系统支持平台自营和商家入驻,实现多元化经营模式,能够全面整合供应商、生产商、经销商和消费者等产业链资源,提高产品多样性,加快资金流动速度,并有助于减少不必要的成本输出。 0…

交换机特性解析

​1. 端口数量和类型: RJ-45端口: 最常见的端口类型,用于连接网线。 铜缆类型: 超五类、六类、七类等,影响传输速率和距离。 PoE功能: 支持为连接的设备供电,如IP电话、无线AP等。 光纤端口: 用于连接光纤,支持更长的传输距离和更高的速率。 光纤类型: 单模、多模等,影响传…

【核弹级安全事件】XZ Utils库中发现秘密后门,影响主要Linux发行版,软件供应链安全大事件

Red Hat 发布了一份“紧急安全警报”&#xff0c;警告称两款流行的数据压缩库XZ Utils&#xff08;先前称为LZMA Utils&#xff09;的两个版本已被植入恶意代码后门&#xff0c;这些代码旨在允许未授权的远程访问。 此次软件供应链攻击被追踪为CVE-2024-3094&#xff0c;其CVS…