图书管理系统
优质
小牛编辑
155浏览
2023-12-01
图书管理
案例描述
随着科技的发展,计算机的普及,计算机软件在诸多领域都得到了广泛的应用。如今,管理系统不再是大公司的专利,许多小型的管理系统,如餐厅的餐饮管理系统、超市的收银系统、学校的学生选课系统等都已逐步普及到了我们的生活中。
本案例要求实现一个基于单链表的图书管理系统,该系统可实现图书信息的增加、浏览、查询、更新、删除这五项功能,并能将链表中存储的数据保存到文件中。
案例分析
本案例要求实现基于单链表的图书管理系统,并能实现增删改查这几项基本功能。掌握单链表的基础操作是完成本案例的前提。另外图书信息应包含多项数据,所以链表结点中应为结构体类型的数据。当需要将链表中的数据保存到本地时,可以使用文件读写将数据写入创建的文件中。
案例实现
功能函数设计如下:
- 图书信息录入。该函数应实现增加数据的功能,其实质为链表结点的添加;
- 图书信息浏览。该函数应实现链表中书籍信息的输出,其实质为链表的遍历;
- 图书信息查询。该函数应能根据用户输入的某项信息,查找记录并输出;
- 图书信息修改。该函数应能根据用户输入的某项信息,修改信息并保存;
- 图书信息删除。该函数借助查询功能,查找链表中的数据,并删除;
- 图书信息保存。该函数应能将链表中的数据写入文件;
- 创建书单;
- 菜单函数。本函数可展示功能菜单,提供用户与程序交互的入口;
案例代码
StuManager.h
#include <stdio.h>
typedef struct book
{
char bnum[10]; //书籍编号
char bname[30]; //书名
char bauthor[20]; //作者
char bclassfy[10]; //类别编号
float bprice; //价格
struct book* next; //链表指针
}BookInfo;
BookInfo* CreateBooksList(); //创建链表
void Insert(BookInfo* head); //插入
void Delete(BookInfo* head); //删除
void Print(BookInfo* head); //浏览
void Search(BookInfo* head); //查询
void Update(BookInfo* head); //修改
void Save(BookInfo* head); //保存
int menu(); //菜单
StuManage.c
#define _CRT_SECURE_NO_WARNINGS
#include "StuManage.h"
#include <stdlib.h>
#include <string.h>
//创建书单
BookInfo* CreateBooksList()
{
BookInfo* head;
head = (BookInfo*)malloc(sizeof(BookInfo)); //为头结点分配空间
head->next = NULL; //初始化头指针
return head;
}
//插入记录
void Insert(BookInfo* head)
{
BookInfo *b, *p;
char flag = 'Y';
p = head;
while (p->next != NULL)
p = p->next;
//开辟新空间,存储书籍信息,并加入链表
while (flag == 'Y' || flag == 'y')
{
b = (BookInfo*)malloc(sizeof(BookInfo)); //开辟新空间
printf("请输入图书编号:"); //获取书籍信息
fflush(stdin); //清空缓冲区
scanf("%s", b->bnum);
printf("请输入书名:");
fflush(stdin);
scanf("%s", b->bname);
printf("请输入作者:");
fflush(stdin);
scanf("%s", b->bauthor);
printf("请输入类别编号:");
fflush(stdin);
scanf("%s", b->bclassfy);
printf("请输入图书价格:");
fflush(stdin);
scanf("%f", &b->bprice);
p->next = b; //将新增加的结点加入链表
p = b; //指针p向后移动,指向尾结点
b->next = NULL;
printf("添加成功!\n继续添加?(Y/N):");
fflush(stdin);
scanf("%c", &flag);
if (flag == 'N' || flag == 'n')break;
else if (flag == 'Y' || flag == 'y')continue;
}
return;
}
//删除记录
void Delete(BookInfo* head)
{
BookInfo *b, *p;
char tmp[30];
int flag; //标志位,判断是否找到了要删除的书籍
flag = 0;
b = head;
p = head;
printf("请输入要删除的书籍名:");
fflush(stdin);
scanf("%s", tmp);
//遍历链表
while (p != NULL)
{
if (strcmp(p->bname, tmp) == 0)
{
flag = 1;
break;
}
p = p->next;
}
if (flag == 1)
{
for (; b->next != p;)
b = b->next;
b->next = p->next;
free(p);
printf("删除成功!\n");
}
else
printf("该书不存在!");
return;
}
//浏览书单
void Print(BookInfo* head)
{
BookInfo *p;
if (head == NULL || head->next == NULL) //判断链表是否为空
{
printf("无记录!\n");
return;
}
p = head;
printf("┏━━━┳━━━━━┳━━━━━┳━━━━━┳━━━━┓\n");
printf("┃ 编号 ┃ 书名 ┃ 作者 ┃ 类别编号 ┃ 价格 ┃\n");
printf("┣━━━╋━━━━━╋━━━━━╋━━━━━╋━━━━┫\n");
//遍历链表,输出书籍信息
while (p->next != NULL)
{
p = p->next;
printf("┃%-6s┃%-10s┃%-10s┃%-10s┃%.2lf ┃\n", p->bnum,
p->bname, p->bauthor, p->bclassfy, p->bprice);
printf("┗━━━┻━━━━━┻━━━━━┻━━━━━┻━━━━┛\n");
}
}
//查找书籍
void Search(BookInfo* head)
{
BookInfo *p;
char tmp[30];
int flag = 0;
p = head;
if (head == NULL || head->next == NULL)
printf("清单为空!\n");
else
{
printf("请输入书名:");
fflush(stdin);
scanf("%s", tmp);
while (p->next != NULL)
{
p = p->next;
if (strcmp(p->bname, tmp) == 0)
{
flag = 1; //书籍已找到
printf("编号:%s\n书名:《%s》\n作者:%s\n分类:%s\n价格:%.2f\n",
p->bnum, p->bname, p->bauthor, p->bclassfy, p->bprice);
return;
}
if (p->next == NULL)
printf("\n查询完毕!");
}
if (flag == 0)
printf("没有找到《%s》!\n", tmp);
}
return;
}
//修改信息
void Update(BookInfo* head)
{
BookInfo *p;
int flag = 0;
char tmp[30];
p = head;
printf("请输入书名:");
fflush(stdin);
scanf("%s", tmp);
while (p->next != NULL)
{
p = p->next;
if (strcmp(p->bname, tmp) == 0)
{
flag = 1; //标志找到所要修改的书籍
printf("请输入编号:");
fflush(stdin);
scanf("%s", p->bnum);
printf("请输入书名:");
fflush(stdin);
scanf("%s", p->bname);
printf("请输入作者:");
fflush(stdin);
scanf("%s", p->bauthor);
printf("请输入类别编号:");
fflush(stdin);
scanf("%s", p->bclassfy);
printf("请输入价格:");
fflush(stdin);
scanf("%f", &p->bprice);
}
}
if (flag == 0)
printf("没有找到《%s》!\n", tmp);
return;
}
//保存书单到文件
void Save(BookInfo* head)
{
BookInfo *p;
FILE *fp;
p = head;
//以只写的方式打开文件
fp = fopen("C:\\Users\\admin\\Desktop\\bookslist.txt", "w");
fprintf(fp, "┏━━━┳━━━━━┳━━━━━┳━━━━━┳━━━━┓\n");
fprintf(fp, "┃ 编号 ┃ 书名 ┃ 作者 ┃ 类别编号 ┃ 价格 ┃\n");
fprintf(fp, "┣━━━╋━━━━━╋━━━━━╋━━━━━╋━━━━┫\n");
while (p->next != NULL)
{
p = p->next;
fprintf(fp, "┃%-6s┃%-10s┃%-10s┃%-10s┃%.2lf ┃\n",
p->bnum, p->bname, p->bauthor, p->bclassfy, p->bprice);
fprintf(fp, "┗━━━┻━━━━━┻━━━━━┻━━━━━┻━━━━┛\n");
}
fclose(fp);
printf("保存成功!\n");
printf("数据已成功保存到C:\\Users\\admin\\Desktop\\bookslist.txt\n");
}
//菜单
int menu()
{
int sec;
printf(" 图书管理系统 \n");
printf("━━━━━━━━━━━━━━━━━━ \n");
printf(" 1-图书信息录入\n");
printf(" 2-图书信息浏览\n");
printf(" 3-图书信息查询\n");
printf(" 4-图书信息修改\n");
printf(" 5-图书信息删除\n");
printf(" 6-图书信息保存\n");
printf(" 7-退出\n");
printf("━━━━━━━━━━━━━━━━━━ \n");
printf("请选择:");
fflush(stdin);
scanf("%d", &sec);
while (sec > 7 || sec < 0)
{
printf("选择有误!\n请重新输入:");
scanf("%d", &sec);
}
return sec;
}
main.c
#include "StuManage.h"
#include <Windows.h>
int main()
{
BookInfo *head;
int sel;
head = NULL;
for (;;)
{
sel = menu(); //输出菜单,并获取选择的功能
switch (sel)
{
case 1:
if (head == NULL)
head = CreateBooksList();
Insert(head);
break;
case 2:Print(head); break;
case 3:Search(head); break;
case 4:Update(head); break;
case 5:Delete(head); break;
case 6:Save(head); break;
case 7:exit(0); break;
default:break;
}
}
return 0;
}