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);
}

  

写的比较基础,也更容易扩展。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM