用顺序表实现图书信息管理(增删改查)---c语言版

2023-11-17

顺序表:

概念:用一组地址连续的存储单元依次存储线性表的数据元素,这种存储结构的线性表称为顺序表。

特点:逻辑上相邻的数据元素,物理次序也是相邻的。

实现:

用结构体定义一本图书:

typedef struct {
	int id;
	char name[20];
	double price;
}Book;//创建一本书的元素

创建线性表:

typedef struct _node {
	Book* b;
	int length;
}Seqlist;//线性表的创建

初始化顺序表:

void inlitist(Seqlist* L) {
	L->b = (Book*)malloc(sizeof(Book) * 100);//给图书信息结构体分配一块内存空间
	L->length = 0;
}//初始化链表 

顺序表的输入:

void creatlist(Seqlist* L, int n) {
	int i;

	for (i = 0; i < n; i++) {


		printf("请输入书号\n");
		scanf("%d", &L->b[i].id);
		printf("请输入书名\n");
		scanf("%s", L->b[i].name);
		printf("请输入价格\n");
		scanf("%lf", &L->b[i].price);
		L->length++;	//每输入一本图书信息,就增加表长
	}
	system("pause");
	system("cls");
}//创建链表 

顺序表的输出:

void printflist(Seqlist* L) {
	int i;
	for (i = 0; i < L->length; i++) {

		printf("%d %s %.2lf\n", L->b[i].id, L->b[i].name, L->b[i].price);

	}//历遍顺序表

}//输出链表所有的数据 

插入顺序表:

void inselem(Seqlist* L, int i) {
	int j;
	if (L->length >= 100) {
		printf("表已满,无法插入!");//此处定义的表长最大为100
	}
	if (i<1 || i>L->length) {
		printf("插入位置错误!\n");
		return error;
	}
	for (j = L->length - 1; j >= i - 1; j--) {//将最后的元素依次后移,到i-1这个条件停止(即插末尾的下标减掉插入位置的数值是要移动的次数)
		L->b[j + 1] = L->b[j];//右移(L->length-1向右移一位即是+1)
		printf("请输入插入的书号\n");
		scanf("%d", &L->b[i - 1].id);
		printf("请输入插入的书名\n");
		scanf("%s", L->b[i - 1].name);
		printf("请输入插入的价格\n");
		scanf("%lf", &L->b[i - 1].price);
		L->length++;
		return ok;
	}
	system("pause");//暂停
	system("cls");//清屏
}//插入数据

插入图解:

 注意:插入前要检查表是否已经满了以及位置是否小于表的第一个位置和表的最大长度。我们想要插入元素,就先要明白顺序表是按照顺序存储的,想要插入,就先把插入位置后面的元素全部后移一位,那从哪里开始移动呢,因为顺序结构,肯定不能从插入位置后面的元素移动,否则就就会占到他的下一个元素的位置从而丢失元素,因此先从最后一个元素开始移动。最后一个元素的下标是L->length-1,右移一个位置是+1,经过j--后将指针指向最后一个元素的前一个元素,右移一个单位,依次类推,那么,达到什么条件才能让这个循环停止,是最后一个元素的下标减去要插入位置的下标的得出的结果就是循环的次数,因此当j--等于插入位置的下标时,循环停止,插入位置后面的元素全部后移,插入的位置就空出来,就可以插入元素了,插入后防止溢出需要将表长+1

删除:

void deletelist(Seqlist* L, int i) {
	int j;
	Book* x = L->b;
	if (L->length == NULL) {
		printf("表空,无法删除\n");
		return error;
	}
	if (i<1 || i>L->length) {
		printf("不存在第i个元素\n");
		return error;
	}
	*x = L->b[i - 1];
	for (j = i; j < L->length; j++) {
		L->b[j - 1] = L->b[j];//左移
		L->length--;
		return ok;
	}
	system("pause");//暂停
	system("cls");//清屏
}//删除

图解删除:

删除元素,先要判断表是否为空和删除的元素是否小于表的第一个元素或者大于表的最大空间,否则无元素删除。先要找到元素所处的位置(设为i),先定义一个Book类型的指针变量,将顺序表的数据域赋值给这个指针, 就可以通过这个指针对元素进行操作了,将i中的元素放入指针变量*x中,在i处(下标为i-1)就空出位置,因此要左移后面剩下的元素(可以不移动吗,我们要注意这个是顺序表,是不能空缺的,这样子才是一个完整的顺序表)。循环终止条件:依旧是最后一个元素的位置减去要插入的位置,当j=i,从i的位置(已经空出来的位置)开始一步步将元素左移,j++是移动一个下一个,直到j达到表中最后一个元素

查找:

int locate1(Seqlist* L, int i) {
	int j = 0;
	while (j < L->length && L->b[j].id != i) {
		j++;
	}
	if (j >= L->length) {
		return error;
	}
	else {
		return j + 1;
	}
}//按照书号查找
int locate2(Seqlist* L, char name1[20]) {
	int j = 0;
	while (j < L->length && L->b[j].name != name1) {
		j++;
	}
	if (j >= L->length) {
		return error;
	}
	else {
		return j + 1;
	}//按照书名查找
}int locate3(Seqlist* L, double piece1) {
	int j = 0;
	while (j < L->length && L->b[j].price != piece1) {
		j++;
	}
	if (j >= L->length) {
		return error;
	}
	else {
		return j + 1;
	}
}//按照价格查找
int getlist(Seqlist* L, int i) {

	if (i<1 || i>L->length) {
		return error;
	}
	else {
		printf("要查找的位置的数据为:\n");
		printf("%d %s %.2lf\n", L->b[i - 1].id, L->b[i - 1].name, L->b[i - 1].price);
	}

}//按照位置查找元素

以上这三个(书号、书名、价格)查找,理论上是差不多的,通过j=0(数组下标从0开始)来定位要查找元素的位置,然后输出来,最后一个查找,通过位置查找,则下标为i-1就是所查找的元素

最后源代码:


#include<stdio.h>
#include<malloc.h>
#include<conio.h>
#include<stdlib.h>
#pragma warning (disable:4996)
#define error 0		//错误
#define ok 1		//正确
typedef struct {
	int id;
	char name[20];
	double price;
}Book;//创建一本书的元素
typedef struct _node {
	Book* b;
	int length;
}Seqlist;//线性表的创建
void welcome() {
	printf("1.创建并输出链表\n");
	printf("2.插入线性表\n");
	printf("3.删除线性表\n");
	printf("4.按书号查找\n");
	printf("5.按书名查找\n");
	printf("6.按价格查找\n");
	printf("7.按照位置查找元素\n");
	printf("0.退出\n");
}//欢迎
void inlitist(Seqlist* L) {
	L->b = (Book*)malloc(sizeof(Book) * 100);
	L->length = 0;
}//初始化链表 
void creatlist(Seqlist* L, int n) {
	int i;

	for (i = 0; i < n; i++) {


		printf("请输入书号\n");
		scanf("%d", &L->b[i].id);
		printf("请输入书名\n");
		scanf("%s", L->b[i].name);
		printf("请输入价格\n");
		scanf("%lf", &L->b[i].price);
		L->length++;	//每输入一本图书信息,就增加表长
	}
	system("pause");
	system("cls");
}//创建链表 
void printflist(Seqlist* L) {
	int i;
	for (i = 0; i < L->length; i++) {

		printf("%d %s %.2lf\n", L->b[i].id, L->b[i].name, L->b[i].price);

	}//历遍顺序表

}//输出链表所有的数据 
void inselem(Seqlist* L, int i) {
	int j;
	if (L->length >= 100) {
		printf("表已满,无法插入!");//此处定义的表长最大为100
	}
	if (i<1 || i>L->length) {
		printf("插入位置错误!\n");
		return error;
	}
	for (j = L->length - 1; j >= i - 1; j--) {
		L->b[j + 1] = L->b[j];
		printf("请输入插入的书号\n");
		scanf("%d", &L->b[i - 1].id);
		printf("请输入插入的书名\n");
		scanf("%s", L->b[i - 1].name);
		printf("请输入插入的价格\n");
		scanf("%lf", &L->b[i - 1].price);
		L->length++;
		return ok;
	}
	system("pause");//暂停
	system("cls");//清屏
}//插入数据
void deletelist(Seqlist* L, int i) {
	int j;
	Book* x = L->b;
	if (L->length == NULL) {
		printf("表空,无法删除\n");
		return error;
	}
	if (i<1 || i>L->length) {
		printf("不存在第i个元素\n");
		return error;
	}
	*x = L->b[i - 1];
	for (j = i; j < L->length; j++) {
		L->b[j - 1] = L->b[j];
		L->length--;
		return ok;
	}
	system("pause");//暂停
	system("cls");//清屏
}//删除
int locate1(Seqlist* L, int i) {
	int j = 0;
	while (j < L->length && L->b[j].id != i) {
		j++;
	}
	if (j >= L->length) {
		return error;
	}
	else {
		return j + 1;
	}
}//按照书号查找
int locate2(Seqlist* L, char name1[20]) {
	int j = 0;
	while (j < L->length && L->b[j].name != name1) {
		j++;
	}
	if (j >= L->length) {
		return error;
	}
	else {
		return j + 1;
	}//按照书名查找
}int locate3(Seqlist* L, double piece1) {
	int j = 0;
	while (j < L->length && L->b[j].price != piece1) {
		j++;
	}
	if (j >= L->length) {
		return error;
	}
	else {
		return j + 1;
	}
}//按照价格查找
int getlist(Seqlist* L, int i) {

	if (i<1 || i>L->length) {
		return error;
	}
	else {
		printf("要查找的位置的数据为:\n");
		printf("%d %s %.2lf\n", L->b[i - 1].id, L->b[i - 1].name, L->b[i - 1].price);
	}

}//按照位置查找元素
int main() {
	Seqlist L;

	int n, i, loc;
	char ch1, ch2, a;
	char name1[20];
	double piece1;
	ch1 = 'y';
	while (ch1 == 'y') {
		welcome();
		ch2 = getch();
		switch (ch2) {
		case'1':
			inlitist(&L);
			printf("请输入要建立线性表的个数\n");
			scanf("%d", &n);
			creatlist(&L, n);
			printf("输入的数据为:\n");
			printflist(&L);
			break;
		case'2':
			printf("请输入要插入的位置\n");
			scanf("%d", &i);
			inselem(&L, i);
			printf("插入后的线性表为:\n");
			printflist(&L);
			break;
		case'3':
			printf("请输入要删除的位置\n");
			scanf("%d", &i);
			deletelist(&L, i);
			printf("删除后的链表为:\n");
			printflist(&L);
			break;
		case'4':
			printf("请输入要查找的书号\n");
			scanf("%d", &i);
			loc = locate1(&L, i);
			if (loc) {
				printf("查找书号%d的位置为:%d\n", i, loc);
			}
			else {
				printf("表中无该元素\n");
			}
			break;
		case'5':
			printf("请输入要查找的书名\n");
			scanf("%s", name1);
			loc = locate2(&L, name1);
			if (loc) {
				printf("查找书名%s的位置为:%d\n", name1, loc);
			}
			else {
				printf("该表中没有该书名\n");
			}
			break;
		case'6':
			printf("请输入要查找的价格\n");
			scanf("%lf", &piece1);
			loc = locate3(&L, piece1);
			if (loc) {
				printf("查找价格%.2lf的位置为:%d\n", piece1, loc);
			}
			else {
				printf("该表中没有该价格\n");
			}
			break;
		case'7':
			printf("请输入要查找位置的数据\n");
			scanf("%d", &i);
			getlist(&L, i);
			break;
		case'0':
			printf("欢迎下次使用!!!\n");
			exit(error);

			break;
		}

	}

}



最后效果:

创建并输出,在插入:

删除

 

 按照书号查找:

 按价格查找:

按位置查找: 

 最后本人是新手技术不佳,该代码还是有小bug,如有错误,请指出,我会改进

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

用顺序表实现图书信息管理(增删改查)---c语言版 的相关文章

  • 华为OD机试真题-5G网络建设-2023年OD统一考试(C卷)

    题目描述 现需要在某城市进行5G网络建设 已经选取N个地点设置5G基站 编号固定为1到N 接下来需要各个基站之间使用光纤进行连接以确保基站能互联互通 不同基站之间架设光纤的成本各不相同 且有些节点之间已经存在光纤相连 请你设计算法 计算出能
  • 特殊类设计

    1 请设计一个类 不能被拷贝 拷贝只会放生在两个场景中 拷贝构造函数 和 赋值运算符重载 c 98 将拷贝构造函数与赋值运算符重载 只声明不定义 并且将其访问权限设置为私有 即可 class Copyban Copyban const Co
  • 华为OD机试真题-密码解密-2023年OD统一考试(C卷)

    题目描述 给定一段 密文 字符串s 其中字符都是经过 密码本 映射的 现需要将 密文 解密并且输出 映射的规则 a i 分别用 1 9 表示 j z 分别用 10 26 表示 约束 映射始终唯一 输入描述 密文 字符串 输出描述 明文字符串
  • 华为OD机试真题-查找一个有向网络的头节点和尾节点-2023年OD统一考试(C卷)

    题目描述 给定一个有向图 图中可能包含有环 图使用二维矩阵表示 每一行的第一列表示起始节点 第二列表示终止节点 如 0 1 表示从0到1的路径 每个节点用正整数表示 求这个数据的首节点与尾节点 题目给的用例会是一个首节点 但可能存在多个尾节
  • c 关于数组几个查序程序

    1 查询某元素是否在数组中 int main void char i 10 2 1 7 2 10 5 2 0 1 4 10 10 1 3 1 0 8 char z 10 1 2 3 4 1 4 6 8 0 9 int zz 0 标志位 0
  • 【数据结构】单链表的定义和操作

    目录 1 单链表的定义 2 单链表的创建和初始化 3 单链表的插入节点操作 4 单链表的删除节点操作 5 单链表的查找节点操作 6 单链表的更新节点操作 7 完整代码 嗨 我是 Filotimo 很高兴与大家相识 希望我的博客能对你有所帮助
  • C语言,scanf出错时,重新输入

    问题的关键在于 把stdin中剩余的字符 吃掉 才能正常地进行下次输入 scanf出错后重新输入 使用 n 清空错误的字符 include
  • Programming Abstractions in C阅读笔记:p235-p241

    Programming Abstractions in C 学习第66天 p235 p241总结 一 技术总结 1 backtracking algorithm 回溯算法 1 定义 p236 For many real world prob
  • 华为OD机试真题-螺旋数字矩阵-2023年OD统一考试(C卷)

    题目描述 疫情期间 小明隔离在家 百无聊赖 在纸上写数字玩 他发明了一种写法 给出数字 个数n 和 行数m 0 lt n 999 0 lt m 999 从左上角的1开始 按照 顺时针螺旋向内写 方式 依次写出2 3 n 最终形成一个 m行矩
  • C/C++编程:令人印象深刻的高级技巧案例

    C C 编程语言在软件开发领域有着悠久的历史 由于其高效 灵活和底层访问能力 至今仍然被广泛应用 本文将介绍一些在C C 编程中令人印象深刻的高级技巧 帮助读者提升编程水平 更加高效地使用这两种强大的编程语言 一 指针运算与内存管理 C C
  • c语言:指针作为参数传递

    探究实参与形参它们相互独立 由于主调函数的变量 a b 与被调函数的形参 x y 它们相互独立 函数 swap 可以修改变量 x y 但是却无法影响到主调函数中的 a b 现在利用取地址运算符 分别打印它们的首地址 让我们从内存的角度 来分
  • C 库函数 - mktime()

    描述 C 库函数 time t mktime struct tm timeptr 把 timeptr 所指向的结构转换为自 1970 年 1 月 1 日以来持续时间的秒数 发生错误时返回 1 声明 下面是 mktime 函数的声明 time
  • 电商API接口接入|电商系统中的商品功能就该这么设计,稳的一批!

    商品功能作为电商系统的核心功能 它的设计可谓是非常重要的 就算不是电商系统中 只要是涉及到需要交易物品的项目 商品功能都具有很好的参考价值 今天就以mall项目中的商品功能为例 来聊聊商品功能的设计与实现 mall项目简介 这里还是简单介绍
  • C语言—每日选择题—Day54

    第一题 1 存在int类型变量x y z 其对应值为x 0x59 y 0x39 z 0x6E 则x y z的值为 A 1 0010 0111 0011 B 1 0100 0011 1111 C 1 0010 0111 0111 D 1 01
  • 华为OD机试真题-部门人力分配-2023年OD统一考试(C卷)

    题目描述 部门在进行需求开发时需要进行人力安排 当前部门需要完成N个需求 需求用requirements 表示 requirements i 表示第i个需求的工作量大小 单位 人月 这部分需求需要在M个月内完成开发 进行人力安排后每个月的人
  • linux ARM64 处理器内存屏障

    一 内存类型 ARMv8架构将系统中所有的内存 按照它们的特性 划分成两种 即普通内存和设备内存 并且它们是互斥的 也就是说系统中的某段内存要么是普通内存 要么是设备内存 不能都是 1 普通内存 Normal Memory 普通内存的特性是
  • linux ARM64 处理器内存屏障

    一 内存类型 ARMv8架构将系统中所有的内存 按照它们的特性 划分成两种 即普通内存和设备内存 并且它们是互斥的 也就是说系统中的某段内存要么是普通内存 要么是设备内存 不能都是 1 普通内存 Normal Memory 普通内存的特性是
  • 串口流控(CTS/RTS)使用详解

    1 流控概念 在两个设备正常通信时 由于处理速度不同 就存在这样一个问题 有的快 有的慢 在某些情况下 就可能导致丢失数据的情况 如台式机与单片机之间的通讯 接收端数据缓冲区已满 则此时继续发送来的数据就会丢失 流控制能解决这个问题 当接收
  • 【C语言】数组

    一维数组的创建和初始化 数组是一组相同类型元素的集合 数组的创建 数组的创建方式 type t arr name const n type t 是指数组的元素类型 const n 是一个常量表达式 用来指定数组的大小 数组创建的实例 数组创
  • 华为OD机试真题-API集群负载统计-Java-OD统一考试(C卷)

    题目描述 某个产品的RESTful API集合部署在服务器集群的多个节点上 近期对客户端访问日志进行了采集 需要统计各个API的访问频次 根据热点信息在服务器节点之间做负载均衡 现在需要实现热点信息统计查询功能 RESTful API的由多

随机推荐

  • java 读取property文件

    java 读取property文件package com import java io IOException import java io UnsupportedEncodingException import java util Pro
  • 泛谈HWND和CWnd

    一 略析 HWND Windows系统中对所有窗口的一种标识 即窗口句柄 一个SDK概念而已 并没有实际对象操作的地址空间 它只是一个32位的无符号整型数值 代表了句柄号handle CWnd MFC类库中所有窗口类的基类 MFC中所有窗口
  • 思维导图软件哪个好?盘点10款好用的思维导图软件

    思维导图是表达发散性思维的有效图形思维工具 被大家广泛应用在工作 学习或生活中 目前市面上制作思维导图的软件也非常多 很容易让大家在选择时出现选择困难症 下面N妹就整理了十款好用的思维导图软件 一起来看看哪款适合自己吧 1 MindNow
  • Linux之系统管理——15

    一 进程管理 进程简介 1 什么是进程管理 那么到底什么是进程呢 进程是正在执行的一个程序或命令 每个进程都是一个运行的实体 都有自己的地址空间 并占用一定的系统资源 那么什么是程序呢 程序是人使用计算机语言编写的可以实现特定目标或解决特定
  • Python——Python基础编程题目

    1 编写程序 求1 100中偶数之和 2 利用字典编写程序实现统计字符串str skdaskerkjsalkj 请统计出该字符串各字母出现的次数 3 已知列表li num1 4 5 2 7 和li num2 3 6 请编程将这个两个列表合并
  • Ubuntu下初始化root用户密码

    在用户安装Ubuntu成功之后 以真机为例 进入图形登录界面之后 Ubuntu会默认用户使用新创建的用户帐号密码登录 例 在配置Ubuntu时 我设本用户账户为 zzh 设本用户密码为 123456 因此 我所登录的即为zzh这个账户 而在
  • ES6入门:let、const、 var区别及注意事项

    ES6入门 let const var区别及注意事项 一 let const 1 用来声明变量或声明常量 2 let 代替 var 声明变量 const 声明常量 为了那些一旦初始化就不希望重新赋值的情况设计的 3 var let声明的就是
  • Early Orders单调栈

    链接 题目描述 You are given a list of integers n and a number k It is guaranteed that each i from 1 to k appears in the list a
  • Java EasyExcel高效读取保存excel文件

    文章目录 前言 JAVA解析Excel工具 网站 引入EasyExcel依赖 快速开始 读Excel 写Excel web上传 下载 前言 阿里开源出一款易上手 且比较节省内存的Excel操作框架 EasyExcel EasyExcel是一
  • 【c++中的细节问题】C++何时需要自定义析构函数呢?

    请见 https blog csdn net love9099 article details 43086945
  • pycharm和navigator打开时出现报错,无法正常打开

    1 navigator打开时出现提示 原因是 python exe有多个任务在占用 解决办法 1 打开cmd 2 输入 tasklist findstr pythonw 3 有几个线程就kill几个线程 使用命令 tskill PIN码 如
  • Web综合应用实验(html css javascript)

  • crontab用法

    crontab用法 几个例子 我们来看一个超级用户的crontab文件 crontab 用法 crontab 命令用于安装 删除或者列出用于驱动 cron 后台进程的表格 也就是说 用户把需要执行的命令序列放到 crontab 文件中以获得
  • MySQL中IF()、IFNULL()、NULLIF()、ISNULL()函数的使用

    在MySQL中可以使用IF IFNULL NULLIF ISNULL 函数进行流程的控制 1 IF 函数的使用 IF expr1 expr2 expr3 如果expr1的值为true 则返回expr2的值 如果expr1的值为false 则
  • react路由使用

    1 插件添加 cnpm install react router dom S 2 app js书写 import React Component from react 路由的2种形式 hash HashRouter H5的historyAp
  • mysql最大连接数修改

    当mysql出现 Too many connections 异常时 说明mysql数据库连接数过高 增加方法如下 如果可以登录 可以使用以下语句临时增加连接数 重启后失效 set GLOBAL max connections 1024 永久
  • zbrush插件布尔运算插件perfectbool安装方法

    zbrush插件直接复制粘贴到此路径的文件夹里 D Program Files Pixologic ZBrush 2020 1 3 ZStartup ZPlugs64 安装好了后 重启zb软件 即可在右侧面板最下面找到该插件了
  • MybatisPlus常用方法

    1 in QueryWrapper
  • 如何用matlab写一个电动汽车空调仿真模型

    首先 您可以研究电动汽车空调的工作原理 并了解其相关的物理参数 例如空调系统的热量转移 制冷剂流动以及空气循环等 然后 您可以使用 MATLAB 的 Simulink 模块开发模型 Simulink 是一个基于图形的仿真工具 可以方便地模拟
  • 用顺序表实现图书信息管理(增删改查)---c语言版

    顺序表 概念 用一组地址连续的存储单元依次存储线性表的数据元素 这种存储结构的线性表称为顺序表 特点 逻辑上相邻的数据元素 物理次序也是相邻的 实现 用结构体定义一本图书 typedef struct int id char name 20