顺序表实现图书管理系统增删改查

2023-11-05

顺序表学习:

这个程序是用于学习数据结构而参考数据结构C语言第二版的教材实现的一个简易的图书管理系统。

逻辑结构:顺序表

线性表的顺序存储又称作顺序表。由一组地址连续的存储单元依次存储线性表的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。

特点是顺序表中的元素的逻辑顺序和物理顺序相同。

主要实现的功能

1.图书信息的录入

2.图书信息的显示

3.图书信息的插入

4.图书信息的删除

5.图书信息的存在查询

6.查看顺序表中第i个元素的信息

头文件定义

头文件中定义了书籍的结构体

//MaxSize可以进行更改,这里设置最多存储5
#define MaxSize 5

//因为C语言中没有Status,将int定义为Status与书上保持一致,返回1/0表示
typedef int Status;

typedef struct {
	//定义结构体,包含书号,书名,价格
	int bno;
	char name[20];
	int price;
}Book;
typedef Book ELemType;

//定义顺序表
typedef struct {
	ELemType* elem;
	int length;
}SqlList;

函数

1.初始化顺序表

//初始化顺序表
Status InitSqlList(SqlList *L)
{
	L->elem = (ELemType*)malloc(sizeof(ELemType) * MaxSize);//为顺序表分配一个初始空间为MaxSize的数组空间
	//exit(x)(x不为0)都表示异常退出
	if (!L->elem) exit(-1); //存储分配失败退出
	L->length = 0;//空表长度为0
	return 1;
}

2.插入顺序表

//插入
Status Insert(SqlList L, int i, ELemType e)
{

	if ((i < 1) || i > L.length + 1) return 0;
	if (L.length == MaxSize) return 0;
	for (int j = L.length;j>=i; j--)
	{
		L.elem[j] = L.elem[j-1];
	}
	L.elem[i - 1] = e;
	L.length++;
	return 1;
}

具体实现

//插入书籍的具体实现
void InsertBook(SqlList* L)
{
	ELemType e;
	printf("请输入你想插入的位置的序号\n");
	int num;
	scanf("%d", &num);
	printf("请输入你想插入的书籍编号\n");
	scanf("%d", &e.bno);
	printf("请输入你想插入的书籍名字\n");
	scanf("%s", e.name);
	printf("请输入你想插入的书籍价格\n");
	scanf("%d", &e.price);
	if (Insert(*L, num, e))
	{
		printf("插入成功!\n");
	}
	else {
		printf("插入失败!\n");
	}
}

3.删除指定元素

//删除
Status Delete(SqlList* L, int i)
{
	if (i<1 || i>L->length) return 0;
	for (int j = i-1 ; j <=L->length; j++)
	{
		L->elem[j] = L->elem[j+1];
	}
	L->length--;
	return 1;
}

删除元素的具体实现和判断

//删除书籍的具体实现
void DeleteBook(SqlList* L)
{
	printf("请输入你想删除的书籍信息\n");
	int num;
	scanf("%d", &num);
	if (Delete(L, num))
	{
		printf("删除成功\n");
	}
	else
	{
		printf("删除失败\n");
	}
}

4.根据图书编号进行查找


//根据特定位置查找
Status GetElemByID(SqlList L,ELemType e)
{
	
	for (int i = 0; i < L.length; i++)
	{
		if (L.elem[i].bno==e.bno)
		{
			return 1;
		}
	}
	return 0;
}
void FindBook(SqlList* L)
{
	ELemType e;
	printf("请输入你要查找的图书的编号\n");
	scanf("%d", &e.bno);
	if (GetElemByID(*L, e))
	{
		printf("有这本书!\n");
	}
	else
	{
		printf("查无此书!\n");
	}
}

5.取出顺序表特定元素i的值

Status GetElem(SqlList L, int i, ELemType* e)
{
	if (i<1 || i>L.length) return 0;

	*e = L.elem[i-1];
	return 1;
}
void GetBook(SqlList* L)
{
	printf("请输入你想取第几本书\n");
	int num;
	scanf("%d", &num);
	ELemType e;
	if (GetElem(*L, num, &e))
	{
		printf("编号:%d\n,书名:%s\n,价格:%d\n", e.bno,e.name, e.price);
	}
	else {
		printf("查找失败!\n");
	}
}

6.其他函数

菜单函数

void menu()
{
	printf("\n********************************\n\n");

	printf("1. 录入信息\n");

	printf("2.打印全部信息\n");

	printf("3. 查找书籍是否存在\n");

	printf("4. 在指定位置插入书籍信息\n");

	printf("5. 在指定位置删除书籍信息\n");

	printf("6. 在指定位置删除书籍信息\n");

	printf("\n********************************\n\n");
}

输入函数

void inputElem(ELemType* e)
{
	printf("请输入编号\n");
	scanf("%d", &e->bno);

	printf("请输入书名\n");
	scanf("%s",e->name);

	printf("请输入价格\n");
	scanf("%d", &e->price);

	printf("输入完成\n\n");
}

void inputBook(SqlList *L)
{
	printf("请输入你要录入的信息个数");
	int n;
	scanf_s("%d",&n);
	for (int i = 0; i < n; i++)
	{
        //调用上面的函数
		inputElem(&L->elem[i]);
	}
	L->length = n;
}

输出函数

void printBook(SqlList* L, int i)
{
	printf("编号:%d\n,书名:%s\n,价格:%d\n", L->elem[i].bno, L->elem[i].name, L->elem[i].price);
}

void Output(SqlList* L)
{
	for (int i = 0; i < L->length; i++)
	{
		printBook(L, i);
	}
}

7.源文件代码

头文件代码在上,名字定义为HeadTitle.h

/*
数据结构:
用C语言实现图书管理系统-顺序表
*/
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>
#include"HeadTitle.h"

//初始化顺序表
Status InitSqlList(SqlList *L)
{
	L->elem = (ELemType*)malloc(sizeof(ELemType) * MaxSize);//为顺序表分配一个初始空间为MaxSize的数组空间
	//exit(x)(x不为0)都表示异常退出
	if (!L->elem) exit(-1); //存储分配失败退出
	L->length = 0;//空表长度为0
	return 1;
}
//插入
Status Insert(SqlList L, int i, ELemType e)
{

	if ((i < 1) || i > L.length + 1) return 0;
	if (L.length == MaxSize) return 0;
	for (int j = L.length;j>=i; j--)
	{
		L.elem[j] = L.elem[j-1];
	}
	L.elem[i - 1] = e;
	L.length++;
	return 1;
}
//插入书籍的具体实现
void InsertBook(SqlList* L)
{
	ELemType e;
	printf("请输入你想插入的位置的序号\n");
	int num;
	scanf("%d", &num);
	printf("请输入你想插入的书籍编号\n");
	scanf("%d", &e.bno);
	printf("请输入你想插入的书籍名字\n");
	scanf("%s", e.name);
	printf("请输入你想插入的书籍价格\n");
	scanf("%d", &e.price);
	if (Insert(*L, num, e))
	{
		printf("插入成功!\n");
	}
	else {
		printf("插入失败!\n");
	}
}
//删除
Status Delete(SqlList* L, int i)
{
	if (i<1 || i>L->length) return 0;
	for (int j = i-1 ; j <=L->length; j++)
	{
		L->elem[j] = L->elem[j+1];
	}
	L->length--;
	return 1;
}
//删除书籍的具体实现
void DeleteBook(SqlList* L)
{
	printf("请输入你想删除的书籍信息\n");
	int num;
	scanf("%d", &num);
	if (Delete(L, num))
	{
		printf("删除成功\n");
	}
	else
	{
		printf("删除失败\n");
	}
}
void inputElem(ELemType* e)
{
	printf("请输入编号\n");
	scanf("%d", &e->bno);

	printf("请输入书名\n");
	scanf("%s",e->name);

	printf("请输入价格\n");
	scanf("%d", &e->price);

	printf("输入完成\n\n");
}

void inputBook(SqlList *L)
{
	printf("请输入你要录入的信息个数");
	int n;
	scanf_s("%d",&n);
	for (int i = 0; i < n; i++)
	{
		inputElem(&L->elem[i]);
	}
	L->length = n;
}

void printBook(SqlList* L, int i)
{
	printf("编号:%d\n,书名:%s\n,价格:%d\n", L->elem[i].bno, L->elem[i].name, L->elem[i].price);
}

void Output(SqlList* L)
{
	for (int i = 0; i < L->length; i++)
	{
		printBook(L, i);
	}
}


//根据特定位置查找
Status GetElemByID(SqlList L,ELemType e)
{
	
	for (int i = 0; i < L.length; i++)
	{
		if (L.elem[i].bno==e.bno)
		{
			return 1;
		}
	}
	return 0;
}
void FindBook(SqlList* L)
{
	ELemType e;
	printf("请输入你要查找的图书的编号\n");
	scanf("%d", &e.bno);
	if (GetElemByID(*L, e))
	{
		printf("有这本书!\n");
	}
	else
	{
		printf("查无此书!\n");
	}
}
void menu()
{
	printf("\n********************************\n\n");

	printf("1. 录入信息\n");

	printf("2.打印全部信息\n");

	printf("3. 查找书籍是否存在\n");

	printf("4. 在指定位置插入书籍信息\n");

	printf("5. 在指定位置删除书籍信息\n");

	printf("6. 在指定位置删除书籍信息\n");

	printf("\n********************************\n\n");
}
//取值
Status GetElem(SqlList L, int i, ELemType* e)
{
	if (i<1 || i>L.length) return 0;

	*e = L.elem[i-1];
	return 1;
}
void GetBook(SqlList* L)
{
	printf("请输入你想取第几本书\n");
	int num;
	scanf("%d", &num);
	ELemType e;
	if (GetElem(*L, num, &e))
	{
		printf("编号:%d\n,书名:%s\n,价格:%d\n", e.bno,e.name, e.price);
	}
	else {
		printf("查找失败!\n");
	}
}
int main()
{
	menu();
	SqlList L;
	int choose;
	if (InitSqlList(&L))
	{
		printf("初始化成功!\n");
		while (1)
		{
			
			printf("请输入选择,其他键退出:");

			scanf("%d", &choose);

			switch (choose)
			{
			case 1:	inputBook(&L); 		break;
			case 2:	Output(&L); 		break;
			case 3:	FindBook(&L);	    break;
			case 4:	InsertBook(&L);		break;
			case 5:	DeleteBook(&L);		break;
			case 6: GetBook(&L);		break;
			case 7:exit(1);	            break;
				printf("已录入的学生个数为:%d\n\n", L.length);
				break;
			default:
				exit(1);
			}
		}
	}
	else {
		printf("初始化失败\n");
	}

}

8.顺序表的优缺点

顺序表最主要的特点是随机访问,即可以通过首地址和元素序号相加就可以找到指定的编号

所以他存取效率高,同时存储密度也高,每个结点只存储数据元素

缺点在于插入和删除需要移动大量的元素,对于需要经常变更数据的场景不适用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

顺序表实现图书管理系统增删改查 的相关文章

  • Nginx的安装(实践记录)

    1 安装nginx需要系统中有gcc环境 先查看本机是否安装gcc gcc version 如果没有就需要安装 gcc gcc c gcc g gcc gnat gcc java gcc objc libgcj libgcj devel l
  • C/C++ 杨辉三角形

    题目描述 还记得中学时候学过的杨辉三角形吗 具体的定义这里不再描述 你可以参考以下的图形 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 输入 输入数据包含多个测试实例 每个测试实例的输入只包含一个正整数n 1 lt n lt

随机推荐

  • AJAX学习笔记8 跨域问题及解决方案

    AJAX学习笔记7 AJAX实现省市联动 biubiubiu0706的博客 CSDN博客 跨域 指一个域名的网页去请求另外一个域名资源 比如百度页面去请求京东页面资源 同源与不同源三要素 协议 域名 端口 协议一致 域名一致 端口一致 才算
  • JAVA中的内存分配

    JAVA中的内存分配 栈 方法运行时使用的内存 比如main方法的运行 进入方法栈中执行 堆 存储对象或数组 new来创建的 都存储在堆内存中 方法区 存储可以运行的class文件 本地方法栈 JVM在使用操作系统功能的时候使用 和我们开发
  • 查询、关闭正在运行的Tomcat端口

    查询正在使用的端口 快捷键win R 输入cmd 回车 打开cmd窗口 查看所有的端口进程 请输入netstat ano 查看某个特定端口 输入netstat ano findstr 8089 关闭某个端口进程 输入taskkill f p
  • Javaweb

    一 创建包和类来编译servlet程序 二 编译和运行
  • 如何在老版本浏览器中丝滑地使用JS新特性(ES6)

    如何在老版本浏览器中丝滑地使用JS新特性呢 如何在老版本浏览器中丝滑地使用JS新特性呢 有两种方法可以帮助我们实现 第一种方法就是我们用JS原有的方法 自己去实现JS的新特性 不是说好的丝滑使用新特性吗 就这 哈哈哈 别急 客官留步 我还有
  • spring boot 数据库层

    项目开启 首先设计数据库以及存储表 表的联系 需要存贮的信息 基本表的性质 基本表与中间表 临时表不同 因为它具有如下四个特性 1 原子性 基本表中的字段是不可再分解的 2 原始性 基本表中的记录是原始数据 基础数据 的记录 3 演绎性 由
  • openid和unionid的区别

    openid和unionid的区别 1 微信openid和unionid长度是不一样的 openid 28 unionid 29 2 openid同一用户同一应用唯一 unionid同一用户不同应用唯一 这里的不同应用是指在同一微信开发平台
  • C++学习6

    堆 是存在于某个作用域的一个内存空间 例如 当你调用函数 函数本身会形成一个栈用来放置它所接收的参数 以及返回地址 栈 由操作系统提供的一个全局的内存空间 程序可动态分配 内存管理 生命周期 栈对象 离开堆的作用域 会调用对象的析构函数 内
  • rabbitmq分布式事务解决方案

    发送消息到mq 流程 用户下订单创建订单信息 且创建一条订单冗余信息 status 为 0 发送订单信息到mq 使用ack 消息确认机制 确认消息发送成功修改订单状态为 1 表示消息已发送 启动一个定时任务 排查 订单状态为 0 的订单 发
  • Win2003搭建网站教程

    1 搭建Win2003虚拟机 此过程略 2 开始 管理您的服务器 添加或删除角色 3 下一步 配置您的服务器向导 选择应用程序服务器 IIS asp NET 下一步 完成安装 4 打开 开始 管理工具 Internet信息服务器 IIS 管
  • 使用certbot 生成 Let‘s Encrypt 泛域名ssl证书

    文章目录 一 更新证书报错 二 Let s Encrypt 泛域名ssl证书申请 一 更新证书报错 问题描述 更新SSL证书时报 too many failed authorizations 错误 原因分析 当前要更新的域名一个小时触发失败
  • 扫码支付终结刷脸支付强势掘起

    手机支付将会終结 新的支付方式掘起 新的支付方式对很多人还是很陌生的 这就要很好的推广和布置 现在推出了二代的蜻蜓刷脸设备 向商户销售出了舒缓的二代蜻蜓刷脸支付设备 超市 快餐厅 自动贩卖机都已经实现商业直播 相信很快在每个城市 都会发现这
  • 快速排序详解

    近些天来 由于需要找工作 特将数据机构与算法中的快速排序温习总结了一下 希望对于大家学习有所帮助 首先 快速排序的基本思想是基于分治的思想 是冒泡排序的改进型 首先在数组中选择一个基准点 该基准点的选取可能影响快速排序的效率 后面讲解选取的
  • Git提交代码的两种方式

    一 Git Bash提交方式 在电脑桌面鼠标右键点击一下 然后点击Git Bash Here 开始输入命令 1 首次提交 先输入github gitlab等的用户名和邮箱 git命令 git config global user name
  • 【Altium Designer21】使用小技巧

    1 如何取消原理图的网格以及表头如下图 在Properties Visible Grid可以显示 隐藏网格 Title Block勾选上即显示表头 取消勾选即隐藏表头 图1 图2 图3 2 翻转的快捷键 空格 为90翻转 X 为水平翻转 Y
  • Eclipse 启动异常 找不到Java环境(A Java Runtime Environment....)

    点击启动Eclipse弹出异常消息 解决步骤 1 打开eclipse所在文件夹 2 用记事本打开配置文件 即下图的文件 3 找到java所在文件夹 4 复制路径并粘贴到记事本文件中 5 保存并重启Eclipse 大功告成
  • [算法]力扣刷题-动态规划 - 不同路径

    目录 题目 思路 编码 分析 修改 优化 题目 一个机器人位于一个 m x n 网格的左上角 起始点在下图中标记为 Start 机器人每次只能向下或者向右移动一步 机器人试图达到网格的右下角 在下图中标记为 Finish 问总共有多少条不同
  • Junit的基本使用(详解)

    什么是Junit Junit是xUnit的一个子集 在c paython java语言中测试框架的名字都不相同 xUnit是一套基于测试驱动开发的测试框架 其中的断言机制 将程序预期的结果与程序运行的最终结果进行比对 确保对结果的可预知性
  • Java代码质量检查工具及使用案例

    前言 在现在的软件开发中 由于软件的复杂度越来越高 业务也覆盖很广 各个业务模块业务错综复杂 这样就需要我们需要团队开发 在我们团队中开发人员的经验 代码风格样式都不一致 以及缺乏统一的标准 从而导致我们的整个项目的的代码难以阅读 不便于后
  • 顺序表实现图书管理系统增删改查

    顺序表学习 这个程序是用于学习数据结构而参考数据结构C语言第二版的教材实现的一个简易的图书管理系统 逻辑结构 顺序表 线性表的顺序存储又称作顺序表 由一组地址连续的存储单元依次存储线性表的数据元素 从而使得逻辑上相邻的两个元素在物理位置上也