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

该博客介绍了使用C语言实现的基于顺序表的简易图书管理系统,包括图书信息的录入、显示、插入、删除、查询和获取特定元素等功能。程序通过初始化、插入、删除等操作展示了顺序表的逻辑顺序与物理顺序相同的特点,以及其在数据操作上的优势和局限性。
摘要由CSDN通过智能技术生成

顺序表学习:

这个程序是用于学习数据结构而参考数据结构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.顺序表的优缺点

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

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

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

  • 8
    点赞
  • 83
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值