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