C语言课程设计:用链表实现图书管理系统

纸上学来终觉浅,绝知此事要躬行。—— 陆游「冬夜读书示子聿」

题外话

C语言课程设计,对于初学者来说,主要是综合运用C语言基础知识,以实际项目的形式锻炼编程能力。从今天开始,一起轻松学做C语言课程设计常见项目,建议先运行代码,再一步步理解其实现。希望对大家的学习有所帮助,也希望大家多多支持小编,点赞+关注+收藏一波走起~

题目要求

图书管理系统提供图书信息管理以及借还管理。图书信息至少包括:图书编号、书名、价格、作者、借还状态,提供以下功能:

1.增加图书信息,录入;
2.查询已有的所有图书信息;
3.删除图书;
4.修改图书信息;
5.借阅图书;
6.归还图书;
7.退出

实现要点
  • 要求较为简单,可采用结构数组或链表实现,本文采用链表实现;
  • 使用文件保存图书信息;
  • 图书借还状态使用整数保存,1表示已还,0表示借出
编程环境

Dev-C++集成开发环境

涉及C语言知识点

结构、数组、枚举、函数、文件读写

【源码获取】:

由于平台原因,小编将完整源码放在小编自己的C语言/C++交流④群:836880131!资料共享在群文件里面,有需要的可以自行添加获取~

如果对代码有任何建议,都可以添加小编的学习交流群,欢迎大家来讨论~

源代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 书名最大长度
#define NAME_LEN   60    
// 作者姓名最大长度
#define AUTHOR_LEN 60  
// 文件名
#define BOOK_FILE "books.txt" 

// 定义书本信息结构体 
typedef struct book{
  // 编号
  int    id;
  // 书名
  char  name[NAME_LEN];
  // 价格
  double  price;
  // 作者
  char    author[AUTHOR_LEN];
  // 借出状态,1表示借出,0表示未借出
  int   state;
}BOOK;
// 定义链表结点结构类型
struct node
{
  BOOK book;
  struct node* next;
};
/*
  定义功能函数,实现图书信息的增加、删除、修改、查阅、借还等功能。
  这里使用链表实现 
*/
// 显示功能菜单
void showMenu(struct node *head);  
// 添加图书信息 传递链表头结点指针 
void addBook(struct node *head);  
// 查看所有图书信息 
void queryBook(struct node *head); 
// 根据图书ID删除图书信息 
void deleteBook(struct node *head);  
// 根据图书ID修改图书信息 
void updateBook(struct node *head);   
// 借书
void borrowBook(struct node *head);  
// 还书
void returnBook(struct node *head);  
// 定义链表基础功能函数 
struct node* createBookNode(BOOK *book);
struct node* insertBookNode(struct node* head, BOOK *book);
struct node* createBookList();
void freeBookList(struct node* head);
struct node* queryBookListById(struct node* head, int id);
int deleteBookLstById(struct node* head, int id);
int getBookListLength(struct node* head);
void printBookLstInfo(struct node* head);
void saveBookLstToFile(struct node* head);
void readBookLstFromFile(struct node* head);
void error(const char* err);

int main() {
  // 创建链表保存数据
  struct node* list = createBookList(); 
  // 当文件books.txt已有图书信息时
  // 先全部读取所有书本信息
  readBookListFromFile(list);
  
  // 显示功能主菜单 
  showMenu(list);    
  char a[10]; 
  • 25
    点赞
  • 182
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
非常详细的 C语言程序!!!可以用 /*12. bookfunction.c源程序*/ /*** bookfunction.c***/ /*添加图书*/ #include "c13_book.c" void BookAdd() { FILE *fp; Book consultbook; fp=fopen("book.txt","rb");/*读方式打开文件*/ if(fp==NULL) fp=fopen("book.txt","wb"); /*写方式打开文件*/ else/*如果有书就添加*/ { fclose(fp); fp=fopen("book.txt","ab");/*追加方式打开文件*/ } ClrScr();/*清屏*/ printf("Intput new book num: ");/*逐个输入新图书的资料*/ gets(consultbook.num); gotoxy(2,4); printf("Input new book name: "); gets(consultbook.name); gotoxy(2,5); printf("Please input new book's price: "); scanf("%d%*c",&consultbook.price); strcpy(consultbook.person,""); consultbook.yes=1;/*表示书存在未借出*/ consultbook.next=NULL; fwrite(&consultbook,sizeof(Book),1,fp);/*块写*/ fclose(fp); /*关闭文件*/ ClrScr(); } /*图书查询*/ void BookConsult() { FILE *fp; Book consultbook; char bookname[20]; /*书名*/ int flag=0,i=0; ClrScr(); gotoxy(2,3); printf("Input the book name: "); gets(bookname); /*输入要查询的图书名*/ fp=fopen("book.txt","rb"); if(fp==NULL)/*没找到文件*/ { ClrScr(); gotoxy(2,3); printf("Error!"); fclose(fp); return; } else while(!feof(fp))/*查询图书资料*/ { fread(&consultbook,sizeof(Book),1,fp); if(strcmp(consultbook.name,bookname)==0)/*如果查找到*/ { ClrScr(); gotoxy(2,3+i*5); printf("This book %s information as follow:",consultbook.name); gotoxy(2,4+i*5); printf("This book num is %s",consultbook.num); gotoxy(2,5+i*5); printf("This book's price is %d",consultbook.price); gotoxy(2,6+i*5); printf("This book's is browwed by %s",consultbook.person); gotoxy(2,7+i*5); printf("This book's state is %d",consultbook.yes); i++; flag=1; /*查找数据标志*/ } } if(flag==0) { ClrScr(); gotoxy(2,3); printf("No found this book"); } fclose(fp); } /*删除图书资料*/ void BookDel() { FILE *fp; Book *head,*p,*q; char bookname[20]; fp=fopen("book.txt","rb");/*读方式打开文件*/ if(fp==NULL)/*没找到文件*/ { gotoxy(2,3); printf("Error!"); fclose(fp); return; } head=p=q=(Book*)malloc(sizeof(Book));/*将文件内容放入链表*/ fread(p,sizeof(Book),1,fp); /*读第一条记录*/ while(!feof(fp)) { q=p; p=(Book*)malloc(sizeof(Book)); fread(p,sizeof(Book),1,fp); /*读记录*/ q->next=p;/*新记录插入到链表的尾*/ } p->next=NULL;/*最后一个结点的后继为空*/ fclose(fp); ClrScr(); printf("Input the book name: "); gets(bookname); /*输入图书名*/ p=head; while(p!=NULL)/*按名字查找要删除的图书*/ { if(strcmp(p->name,bookname)==0)/*找到要删除的图书*/ { if(p==head) /*如果是第一个结点*/ head=head->next; else q->next=p->next;/*不是第一个结点*/ break; } q=p; /*指针后移*/ p=p->next; } fp=fopen("book.txt","wb");/*删除后从链表的头开始重新保存*/ while(head!=NULL) { fwrite(head,sizeof(Book),1,fp);/*块写*/ head=head->next; } fclose(fp); ClrScr(); } /*借书*/ void BookBorrow() { FILE *fp; Book consultbook; Member consultmember; char bookname[20],membername[20]; int flag=0,mflag=0; ClrScr(); gotoxy(2,3); printf("Input the mermber name: "); gets(membername); /*输入会员名*/ if((fp=fopen("member.txt","rb"))==NULL)/*没找到文件*/ { gotoxy(3,3); printf("Cannot open file\n!"); return; } else while(!feof(fp))/*查询会员资料*/ { fread(&consultmember,sizeof(Member),1,fp); if(strcmp(consultmember.name,membername)==0) { mflag=1; /*是会员标志*/ break; } } fclose(fp); if(mflag==0) { gotoxy(2,4); printf("You not is a member,pleas register!");/*不是会员不能借书*/ return; } gotoxy(3,5); printf("Input the book name: "); gets(bookname); /*输入图书名*/ ClrScr(); if((fp=fopen("book.txt","rb+"))==NULL)/*没找到文件*/ { gotoxy(2,3); printf("Cannot open file\n!"); return; } while(!feof(fp))/*查询图书资料*/ { fread(&consultbook,sizeof(Book),1,fp); if(strcmp(consultbook.name,bookname)==0) { if(consultbook.yes==0)/*图书已经借出的判断*/ { gotoxy(2,3); printf("This book has borrowed\n!"); break; } else { consultbook.yes=0; /*作借出标志*/ strcpy(consultbook.person,membername);/*登记借书会员*/ fseek(fp,-1L*sizeof(Book),1);/*从当前位置前移一条记录指针*/ fwrite(&consultbook,sizeof(Book),1,fp);/*写记录*/ gotoxy(2,3); printf("Borrowed succ!"); flag=1;/*借出书标志*/ break; } } } if(flag!=1) { ClrScr(); gotoxy(2,3); printf("Borrowed fail!\n");/*借书失败*/ } fclose(fp); } /*还书*/ void BookReturn() { FILE *fp; Book consultbook; char bookname[20]; int flag=0; ClrScr(); if((fp=fopen("book.txt","rb+"))==NULL)/*没找到文件*/ { gotoxy(2,3); printf("cannot open file\n!"); return; } printf("Input the book name: "); gets(bookname); /*输入图书名*/ ClrScr(); while(!feof(fp))/*查询图书资料*/ { fread(&consultbook,sizeof(Book),1,fp); if(strcmp(consultbook.name,bookname)==0) { if(consultbook.yes==0)/*图书已经借出的判断*/ { consultbook.yes=1;/*作图书未借书标志,表示已还书*/ strcpy(consultbook.person,""); fseek(fp,-1L*sizeof(Book),1); fwrite(&consultbook,sizeof(Book),1,fp); gotoxy(2,3); printf("Return book succ!"); flag=1; break; } } } if(flag!=1) printf("Return fail!\n"); fclose(fp); } /*清除屏幕*/ void ClrScr() { int i,j; puttext(2,3,78,23,c);/*刚开始已经用gettext把蓝色的一块地方保存下来,现在再还原*/ gotoxy(2,3); } /*会员注册*/ void MemberAdd() { FILE *fp; Member consultmember; fp=fopen("member.txt","rb"); if(fp==NULL)/*如果没会员就新建*/ fp=fopen("member.txt","wb"); else/*如果有会员就添加*/ { fclose(fp); fp=fopen("member.txt","ab");/*追加方式打开*/ } ClrScr(); gotoxy(2,3); printf("Intput new member name: ");/*逐个输入会员的资料*/ gets(consultmember.name); gotoxy(2,4); printf("Input member sex: "); gets(consultmember.sex); gotoxy(2,5); printf("Please input member age: "); scanf("%d%*c",&consultmember.age); fwrite(&consultmember,sizeof(Member),1,fp);/*写入记录*/ fclose(fp); ClrScr(); } /*查询会员*/ void MemberConsult() { FILE *fp; Member consultmember; char membername[20]; int flag=0; ClrScr(); gotoxy(2,3); printf("Input the member name: ");/*输入要查询的会员名*/ gets(membername); fp=fopen("member.txt","rb"); if(fp==NULL)/*没找到文件*/ { ClrScr(); gotoxy(2,3); printf("Error!"); fclose(fp); return; } while(!feof(fp))/*查询会员资料*/ { fread(&consultmember,sizeof(Member),1,fp); if(strcmp(consultmember.name,membername)==0)/*比较*/ { ClrScr(); gotoxy(2,3); printf("This member %s information as follow:",consultmember.name); gotoxy(2,4); printf("This member'sex is %s",consultmember.sex); gotoxy(2,5); printf("This member 's age is %d",consultmember.age); flag=1; break; } } if(flag==0) { ClrScr(); gotoxy(2,3); printf("No found this member!"); } fclose(fp); } /*删除会员资料*/ void MemberDel() { FILE *fp; Member *head,*p,*q; char membername[20]; fp=fopen("member.txt","rb"); if(fp==NULL)/*没找到文件*/ { gotoxy(2,3); printf("Error!"); fclose(fp); return; } head=p=q=(Member*)malloc(sizeof(Member));/*将文件内容放入链表*/ fread(p,sizeof(Member),1,fp); while(!feof(fp)) { q=p; p=(Member*)malloc(sizeof(Member)); fread(p,sizeof(Member),1,fp);/*读记录*/ q->next=p;/*链入到链表的尾部*/ } p->next=NULL; fclose(fp); ClrScr(); printf("Input the member name: ");/*输入会员名*/ gets(membername); p=head; while(p!=NULL)/*按名字查找要删除的书*/ { if(strcmp(p->name,membername)==0)/*查找会员*/ { if(p==head) head=head->next;/*如果是第一条记录*/ else q->next=p->next;/*不是第一条记录*/ break; } q=p; /*没找到,则指针后移继续找*/ p=p->next; } fp=fopen("member.txt","wb");/*删除后重新保存*/ while(head!=NULL) { fwrite(head,sizeof(Member),1,fp);/*块写*/ head=head->next; } fclose(fp); ClrScr(); } /*查询会员所借的图书*/ void MemberBook() { FILE *fp; Book consultbook; Member consultmember; char bookname[20],membername[20]; int flag=0,mflag=0,i=0; ClrScr(); gotoxy(2,3); printf("Input the mermber name: ");/*输入会员名*/ gets(membername); if((fp=fopen("member.txt","rb"))==NULL)/*没找到文件*/ { gotoxy(3,3); printf("Cannot open file\n!"); return; } else while(!feof(fp))/*查询会员资料,确认会员*/ { fread(&consultmember,sizeof(Member),1,fp); if(strcmp(consultmember.name,membername)==0) { mflag=1; break; } } fclose(fp); if(mflag==0) { gotoxy(2,4); printf("Not the member!"); return; } ClrScr(); if((fp=fopen("book.txt","rb+"))==NULL)/*没找到文件*/ { gotoxy(2,3); printf("Cannot open file\n!"); return; } while(!feof(fp))/*查询图书资料*/ { fread(&consultbook,sizeof(Book),1,fp); gotoxy(2,3); printf("This member %s has borrowed book as follow:",membername); gotoxy(2,4); printf("********************************************"); if(strcmp(consultbook.person,membername)==0)/*借阅人比较*/ { gotoxy(2,5+i*4); printf("Book name is %s",consultbook.name); gotoxy(2,6+i*4); printf("This book num is %s",consultbook.num); gotoxy(2,7+i*4); printf("This book's price is %d",consultbook.price); printf("\n"); i++; flag=1; } } if(flag!=1) { ClrScr(); gotoxy(2,3); printf("no Borrow book!\n"); } else { gotoxy(2,i*4+6); printf("******total is %d*********",i);/*显示总数*/ } fclose(fp); } /*帮助文件*/ void Help() { ClrScr(); DrawFrame(10,5,50,8,0,7); /*画边框*/ gotoxy(15,6); cprintf("click menu to run each funtion");/*输出字符串*/ getch(); ClrScr(); } /***版本信息***/ void Ver() { ClrScr(); DrawFrame(10,5,50,8,0,7); /*画边框*/ gotoxy(15,6); cprintf("Ver 1.0 finished by zhuyun");/*输出字符串*/ getch(); ClrScr(); } 

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值