C语言 用链表实现图书管理系统
基本要求:
1)采用链式存储结构实现
2)图书信息:每种书的登记内容包括书号、书名、著作者、现存量和库存量等信息;
3)读者信息:每个读者的登记内容包括读者号、姓名、性别等信息
4)借阅信息:每条借阅信息包括读者号、书号、借阅时间、归还时间
5)系统主要功能如下:
a)读者的增删改,图书信息的增删改,其中图书的增加(采编入库):新购一种书,确定书号后,登记到图书帐目表中,如果表中已有,则只将库存量增加;
b)借阅:如果一种书的现存量大于0,则借出一本,在借阅信息中登记读者号、书号、借阅时间,改变图书现存量;
c)归还:填写对应借阅记录的归还时间,改变该书的现存量。
d)查询:可查询书籍信息、读者信息、借阅信息等
e)图书、读者、借阅信息均可保存在文件中,可从文件中调入
学校实验专周比较水,出的都是一些小题目, 从中挑了一个工程量最大的也只是这个小实验,然后我就尽量写的详细一点,把各个功能分开。
文件调用不是很熟悉,仓促学了一点皮毛就用上了,有兴趣以后自行扩展。
实验大致思路和顺序表差不多,多了一些链表基本操作,分别存储图书信息和读者信息,初始化并插入数据后开始用第三个结构体存储借阅信息,通过判断输入法内容和读者号、图书号是否一致来决定借阅成功或失败。
链式结构体中的数组是为了方便存储字符串。
#include <cstdio>
#include <cstdlib>
#include <string.h>
#define ERROR 0
#define OK 1
#define MAXSIZE 50//字符串容纳最大长度 50
typedef int Status;
typedef int ElemType;
//图书信息
typedef struct Book{
char book_id[MAXSIZE];//图书序号
char book[MAXSIZE];//书名
char author[MAXSIZE];//作者
int num;//现存量
int kucun;//库存量
char read_id[MAXSIZE];//借阅者的id
struct Book *next;
}LBook,*LinkBook;
//读者信息
typedef struct Reader{
char read_id[MAXSIZE];//读者号
char reader[MAXSIZE];//读者姓名
char ssex[MAXSIZE];//读者性别
// char borrow_book[10];
struct Reader *next;
}LReader,*LinkReader;
//查阅信息
typedef struct info{
char book_id[MAXSIZE];//图书序号
char book_name[MAXSIZE];//图书名称
char read_id[MAXSIZE];//读者序号
char reader[MAXSIZE];//读者名字
char time1[MAXSIZE];//借阅时间
char time2[MAXSIZE];//归还时间
struct info *next;
}*information,Info;
Status InitBook(LinkBook &L){
L=new Book;
if(!L) return ERROR;
L->next=NULL;
L->kucun=0;
L->num=0;
return OK;
}
//初始化读者信息
Status InitReader(LinkReader &L){
L=new Reader;
if(!L) return ERROR;
L->next=NULL;
return OK;
}
//初始化借阅信息
Status Information(information &C){
C=new Info;
if(!C) return ERROR;
C->next=NULL;
return OK;
}
//遍历图书信息
void DisBook(LinkBook L){//不改动数值可以不引用&
LBook *p;
p=L->next;//指向第一个节点
printf("开始展开所有图书信息\n");
printf("------------------>\n");
while(p)//p!=NULL
{
printf("图书序号:%s\n图书名称:%s\n图书作者:%s\n现存量:%d\n库存量:%d\n",p->book_id,p->book,p->author,p->num,p->kucun);
printf("------------------>\n");
p=p->next;
}
}
//遍历读者信息
void DisReader(LinkReader L){//不改动数值可以不引用&
LReader *p;
p=L->next;//指向第一个节点
printf("开始展开所有读者信息\n");
printf("------------------>\n");
while(p)//p!=NULL
{
printf("读者号:%s\n姓名:%s\n性别:%s\n",p->read_id,p->reader,p->ssex);
printf("------------------>\n");
p=p->next;
}
}
//遍历借阅信息
void DisBorrow(information L) {
Info *p;
p=L->next;
printf("展开所有订阅信息:\n");
printf("------------------>\n");
while(p)//p!=NULL
{
printf("图书:%s\n读者:%s\n借阅日期:%s\n归还日期:%s\n",p->book_name,p->reader,p->time1,p->time2);
printf("------------------>\n");
p=p->next;
}
}
//删除读者操作
Status DelReader(LinkReader &L,char *i)
{
LReader *p=L;
while(p->next)//
{
if(strcmp(p->next->read_id,i)==0){
Reader *s=p->next;
p->next=s->next;//p->next=p->next->next
delete s;
return OK;
}
p=p->next;
}
return ERROR;
}
//删除图书信息操作
Status DelBook(LinkBook &L,char *i)
{
LBook *p=L;
while(p->next)//
{
if(strcmp(p->next->book_id,i)==0){
Book *s=p->next;
p->next=s->next;//p->next=p->next->next
delete s;
return OK;
}
p=p->next;
}
return ERROR;
}
//添加读者信息(前插法)--量插
void AddReader(LinkReader &L,int n){
LReader *p;
L=new Reader;
L->next=NULL;
int i;
p=L->next;
printf("请输入读者号,姓名和性别:\n");
for(i=n;i>0;--i)
{
p=new Reader;
scanf("%s %s %s",p->read_id,p->reader,p->ssex);
p->next=L->next;
L->next=p;
}
}
//初始添加图书信息(前插法)--单插
Status AddBook(LinkBook &L,ElemType e){
LBook *p;
L=new Book;
L->next=NULL;
int i,j;
p=L->next;
for(i=0;i<e;i++){
p=new LBook;
p->num=p->kucun=0;
printf("请选择图书编号和数量:\n");
scanf("%s%d",p->book_id,&j);
printf("请插入图书的名字和作者名:\n");
scanf("%s%s",p->book,p->author);
p->num+=j;
p->kucun+=j;
p->next=L->next;
L->next=p;
}
}
//Insert 后续添加图书
Status InsertBook(LinkBook &L,char *n,ElemType e) {
LBook *p,*s;
p=L->next;
while(p){
if(strcmp(p->book_id,n)==0){//如果存在过这本书
p->kucun+=e;
p->num+=e;
return OK;
}
p=p->next;
}
p=new LBook;
p->num=p->kucun=0;
printf("请插入图书的名字和作者名:\n");
scanf("%s%s",p->book,p->author);
p->num=e;
p->kucun=e;
p->next=L->next;
L->next=p;
}
//后续添加读者号
Status InsertReader(LinkReader &L,char *n) {
LReader *p,*s;
p=L->next;
while(p){
if(strcmp(p->read_id,n)==0){//如果读者号已存在
printf("该账户已经被注册!\n");
return OK;
}
p=p->next;
}
p=new LReader;
strcpy(p->read_id,n);
printf("请插入读者的名字和性别:\n");
scanf("%s%s",p->reader,p->ssex);
p->next=L->next;
L->next=p;
}
//按图书序号查找图书信息
Status GetBook(LinkBook L,char *n)
{
LBook *p = L->next;
while(p)//p!=NULL
{
if(strcmp(p->book_id,n)==0)
{
printf("查找的结果为:\n");
printf("图书序号:%d\n图书名称:%s\n图书作者:%s\n现存量:%d\n库存量:%d\n",p->book_id,p->book,p->author,p->num,p->kucun);
printf("------------------>\n");
return OK;
}
p=p->next;
}
printf("没找到该图书,请核对输入是否正确\n");
}
//搜索图书序号修改图书信息
Status AlterBook(LinkBook L,char *n)
{
LBook *p = L->next;
while(p)//p!=NULL
{
if(strcmp(p->book_id,n)==0)
{
printf("图书查到,请修改:\n");
printf("图书序号为:%s\n请修改:",p->book_id);
scanf("%s",p->book_id);
printf("书名为:%s\n请修改:",p->book);
scanf("%s",p->book);
printf("作者:%s\n请修改:",p->author);
scanf("%s",p->author);
printf("现存量和库存量为%d和%d\n请修改:",p->num,p->num);
scanf("%d,%d",&p->num,&p->kucun);
printf("------------------>\n");
return OK;
}
p=p->next;
}
printf("没找着该图书,请重新检查!\n");
return ERROR;
}
//按读者号查找读者信息
Status GetReader(LinkReader L,char *n)
{
LReader *p = L->next;
while(p)//p!=NULL
{
if(strcmp(p->read_id,n)==0)
{
printf("查找的结果为:\n");
printf("读者号:%s\n姓名:%s\n性别:%s\n",p->read_id,p->reader,p->ssex);
printf("------------------>\n");
return OK;
}
p=p->next;
}
printf("没找到该读者,请核对输入是否正确\n");
}
//通过读者号修改读者信息
Status AlterReader(LinkReader L,char *n)
{
LReader *p = L->next;
while(p)//p!=NULL
{
if(strcmp(p->read_id,n)==0)
{
printf("读者信息查到,请修改:\n");
printf("读者号:\n");
scanf("%s",&p->read_id);
printf("读者名:\n");
scanf("%s",p->reader);
printf("读者性别:\n");
scanf("%s",p->ssex);
printf("------------------>\n");
return OK;
}
p=p->next;
}
printf("没找到该读者,请核对输入是否正确\n");
}
//借阅书
Status Borrow(LinkBook &L,LinkReader &S,information &C ){
LBook *p=L->next;
LReader *q=S->next;
Info *s=C->next;
char n[10],m[10];
printf("请输入读者证号和图书号进行借阅:\n");
scanf("%s%s",m,n);
while(p){
if(strcmp(p->book_id,n)==0){
s=new Info;
strcpy(s->book_id,n); //字符串赋值,需要函数
strcpy(s->book_name,p->book);
if(p->kucun>0){//判断是否还有库存
p->kucun--; //借走了,该书库存-1
}
else {
printf("这本书已经被借完了!\n");
delete s;
return ERROR;
}
break;
}
p=p->next;
}
while(q){
if(strcmp(q->read_id,m)==0){
strcpy(s->read_id,m);//字符串赋值
strcpy(s->reader,q->reader);
// strcpy(q->borrow_book,p->book);
break;
}
q=q->next;
}
if(q==NULL){
printf("读者号或者图书号错误,请检查输入是否有误!\n");
return ERROR;
}
printf("请填写借阅和归还日期:\n");
scanf("%s%s",s->time1,s->time2);
s->next=C->next;
C->next=s;
return OK;
}
//归还书
Status Return(LinkBook &L,LinkReader &S,information &C ){
LBook *p=L->next;
LReader *q=S->next;
Info *s=C->next;
char n[10],m[10];
printf("请输入读者证号和图书号进行归还:\n");
scanf("%s%s",m,n);
while(p){
if(strcmp(p->book_id,n)==0){
s=new Info;
strcpy(s->book_id,"已归还"); //原来的信息填写为已归还,做个记录,也可以删掉 都行啊;
strcpy(s->book_name,"已归还");//删掉代码:略了
p->kucun++; //归还了,库存+1
Info *S=C;
Info *P=S->next;
S->next=P->next;
delete P;
break;
while(q){
if(strcmp(s->read_id,m)==0){
// strcpy(q->borrow_book,"暂无");
strcpy(p->book_id,0);
return OK;
}
q=q->next;
}
}
p=p->next;
}
return ERROR;
}
//保存到txt中 --路径默认选择到我的桌面,可更改
void saveBook(LinkBook L,LinkReader S,information &C) {
FILE *fp=NULL;
LBook *p=L->next;
LReader *q=S->next;
Info *s=C->next;
fp=fopen("C:/Users/23211/Desktop/books.txt","w+");
while(p){
fprintf(fp,"%s %s %s %d %d\n",p->book_id,p->author,p->book,p->num,p->kucun);
p=p->next;
}
fp=fopen("C:/Users/23211/Desktop/Readers.txt","w+");
while(q){
fprintf(fp,"%s %s %s\n",q->read_id,q->reader,q->ssex);
q=q->next;
}
fp=fopen("C:/Users/23211/Desktop/Borrow.txt","w+");
while(s){
fprintf(fp,"%s %s %s %s %s %s\n",s->book_id,s->book_name,s->read_id,s->reader,s->time1,s->time2);
s=s->next;
}
printf("更新完成!\n");
}
//从文件中读取
void ReadBook(LinkBook L,LinkReader S,information &C) {
LBook *p=L->next;
LReader *q=S->next;
Info *s=C->next;
p=new LBook;
q=new LReader;
s=new Info;
FILE * fp=NULL;
printf("--------------------------------------------------->\n");
printf("展开图书信息:\n");
fp=fopen("C:/Users/23211/Desktop/books.txt","r");
while(fscanf(fp,"%s%s%s%d%d",p->book_id,p->author,p->book,&p->num,&p->kucun)!=EOF){
printf("图书序号:%s,作者:%s,书名:%s,数量:%d,库存:%d\n",p->book_id,p->author,p->book,p->num,p->kucun);
p-p->next;
}
printf("--------------------------------------------------->\n");
printf("展开读者信息:\n");
fp=fopen("C:/Users/23211/Desktop/Readers.txt","r");
while(fscanf(fp,"%s%s%s\n",q->read_id,q->reader,q->ssex)!=EOF){
printf("读者号:%s,姓名:%s,性别:%s\n",q->read_id,q->reader,q->ssex);
// q=q->next;
}
printf("--------------------------------------------------->\n");
printf("展开借阅信息\n");
fp=fopen("C:/Users/23211/Desktop/Borrow.txt","r");
while(fscanf(fp,"%s%s%s%s%s%s\n",s->book_id,s->book_name,s->read_id,s->reader,s->time1,s->time2)!=EOF){
printf("图书号:%s\n,图书名:%s\n,读者号:%s\n,读者姓名:%s\n,借阅日期:%s\n,归还日期:%s\n",s->book_id,s->book_name,s->read_id,s->reader,s->time1,s->time2);
s=s->next;
}
printf("--------------------------------------------------->\n");
printf("提取完成完成!\n");
}
void function(){//功能菜单
printf("<------------------------------------------------>\n");
printf("<-----------0-欢迎来到鳝溪校区阅览室!-0---------->\n");
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("<---------------8.修改读者信息------------------->\n");
printf("<---------------9.修改图书信息------------------->\n");
printf("<---------------10.查询读者信息------------------>\n");
printf("<---------------11.查询图书信息------------------>\n");
printf("<---------------12.查询借阅信息------------------>\n");
printf("<---------------13.导出读者、图书和借阅信息------>\n");
printf("<---------------14.导入读者,图书和借阅信息------>\n");
printf("<---------------15.查看功能菜单------------------>\n");
printf("<---------------16.添加图书信息------------------>\n");
printf("<---------------17.添加读者信息------------------>\n");
printf("<---------------18.归还图书---------------------->\n");
printf("<-------------------0.退出----------------------->\n");
}
void tool(LinkBook L,LinkReader S,information &C){//功能实现
int i,choose;
char n[MAXSIZE];
ElemType e;
while(1){
printf("请输入你要选择的功能:\n请选择:");
scanf("%d",&choose);
switch(choose){
case 1:
printf("请插入多少种不同的图书:\n");
scanf("%d",&e);
AddBook(L,e);
break;
case 2:
printf("请选择插入读者数量:\n");
scanf("%d",&e);
AddReader(S,e);
break;
case 3:
DisBook(L);
break;
case 4:
DisReader(S);
break;
case 5://添加读者借阅信息
if(Borrow(L,S,C))
printf("添加成功!\n");
else printf("添加失败!\n");
break;
case 6:
printf("请输入要删除的读者号:\n");
scanf("%s",n);
if(DelReader(S,n)){
printf("删除成功!\n");
}
else{
printf("该读者号不存在,请检查是否有这个读者号!\n");
}
break;
case 7:
printf("请输入要删除的图书序号:\n");
scanf("%s",n);
if(DelBook(L,n)){
printf("删除成功!\n");
}
else{
printf("该图书不存在,请检查是否有这个图书号!\n");
}
break;
case 8:
printf("请输入要修改的读者号:\n");
scanf("%s",n);
AlterReader(S,n);
break;
case 9:
printf("请输入要修改的图书号:\n");
scanf("%s",n);
AlterBook(L,n);
break;
case 10:
printf("请输入要查询的读者号:\n");
scanf("%s",n);
GetReader(S,n);
break;
case 11:
printf("请输入要查询的图书序号:\n");
scanf("%s",n);
GetBook(L,n);
break;
case 12://遍历借阅信息
DisBorrow(C);
break;
case 13://导出读者、图书和借阅信息
saveBook(L,S,C);
break;
case 14://导入读者、图书和借阅信息
ReadBook(L,S,C);
break;
case 15://功能菜单
function();
break;
case 16:
printf("插入图书信息:\n");
printf("请输入图书号和数量:\n");
scanf("%s%d",n,&e);
InsertBook(L,n,e);
break;
case 17:
printf("插入读者信息:\n");
printf("请输入读者号:\n");
scanf("%s",n);
InsertReader(S,n);
break;
case 18://归还
Return(L,S,C);
break;
case 0://退出程序
printf("拜拜!\n");
exit(0);
default:
printf("不在选择范围内,更多功能请等待扩展。\n请重新选择!\n");
}
}
}
int main()
{
LinkBook L;
LinkReader S;
information C;
InitReader(S);
InitBook(L);
Information(C);
function();
tool(L,S,C);
}
写的比较基础,也更容易扩展。

浙公网安备 33010602011771号