这个程序是用于学习数据结构而参考数据结构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;
//初始化顺序表
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");
}
}
//根据特定位置查找
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");
}
}
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");
}
}
菜单函数
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);
}
}
头文件代码在上,名字定义为HeadTitle.h
/*
数据结构:
用C语言实现图书管理系统-顺序表
*/
#include
#include
#include
#include
#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");
}
}
顺序表最主要的特点是随机访问,即可以通过首地址和元素序号相加就可以找到指定的编号
所以他存取效率高,同时存储密度也高,每个结点只存储数据元素
缺点在于插入和删除需要移动大量的元素,对于需要经常变更数据的场景不适用。