C语言链表实现图书管理系统
之前参照网上的资料用链表实现了图书管理系统,包括简单的增删改查功能以及借书还书功能,我是VC6.0下写的一个控制台程序,格式参照的网上的。在动手编码之前,你需要理清自己的思路。首先,需要确定图书馆里系统中主要有那几个对象,这里我写了学生对象和图书对象。不妨在纸上写出或画出它们主要包括哪些属性以及其可能的对应关系,这里根据不同人的要求会有所不同。清楚这些之后,就可以设计学生和图书的数据结构,比如这里我用的结构体存储其信息。然后就需要考虑,我想要哪些功能,除了基本的增删改查之外,我还想要哪些功能?比如借书、还书,我怎么表示这之间的关系?可以通过图书的属性来记录该书的状态,及是否被借走,谁借了。主要就是这个思路,图书的增删改查是通过链表实现的,当然也可以用数组实现,只不过那会浪费较多的空间。
//MyLibManSys.cpp:Definestheentrypointfortheconsoleapplication.
// #include"stdafx.h" #include"iostream" structbook{ intid; chartitle[20]; charauthor[20]; doubleprice; charstate[20]; intstudent_id; charstudent_name[20]; structbook*next; }; structstudent{ intid; charname[20]; charsex[10]; charborrow_book[30]; structstudent*next; }; voidPrint_Book(structbook*head_book); voidPrint_Student(structstudent*head_student); structbook*Create_New_Book();/*创建新的图书库*/ structstudent*Create_New_Student();/*创建新的学生库*/ structbook*Insert_Book(structbook*head_book,structbook*new_book);/*增加图书,逐个添加*/ //voidInsert_Book(structbook*head_book,structbook*new_book);/*增加图书,逐个添加*/ //函数的参数是一个指针时,不要在函数体内部改变指针所指的地址,那样毫无作用,需要修改的只能是指针所指向的内容。即应把指针当作常量 structstudent*Insert_Student(structstudent*head_student,structstudent*new_student);/*增加学生,逐个添加*/ structbook*Search_Book_ById(intid,structbook*head_book); structbook*Search_Book_ByTitle(char*title,structbook*head_book); structbook*Search_Book_ByPrice(doubleprice_h,doubleprice_l,structbook*head_book); //boolDelete_Book(intid,book*head_book); structbook*Delete_Book(intid,book*head_book); structstudent*Search_Student(intid,structstudent*head_student); structstudent*Delete_Student(intid,student*head_student); voidLent_Book(intid,intstudent_id,structbook*head_book,structstudent*head_student); voidBack_Book(intid,intstudent_id,structbook*head_book,structstudent*head_student); intmain() { structbook*head_book,*p_book; structstudent*head_student,*p_student; intchoice,f,id,student_id; intm=1; charname[20],sex[10]; chartitle[20]; doubleprice_h,price_l,price; charauthor[20]; intsize_book=sizeof(structbook); intsize_student=sizeof(structstudent); printf("\n欢迎您第一次进入图书管理系统!\n\n"); printf("----->[向导]----->[新建图书库]\n\n"); printf("注意:当输入图书编号为0时,进入下一步.\n\n"); head_book=Create_New_Book(); system("cls"); //Print_Book(head_book); printf("\n欢迎您第一次进入图书管理系统!\n\n"); printf("----->[向导]----->[新建会员库]\n\n"); printf("注意:当输入会员学号为0时,进入主菜单.\n\n"); head_student=Create_New_Student(); system("cls"); //Print_Student(head_student); do{ printf("\n\t\t\t〓〓〓〓〓图书管理系统〓〓〓〓〓\n\n"); printf("\n"); printf("\t\t\t[1]:借书办理\t");printf("[6]:还书办理\n"); printf("\n"); printf("\t\t\t[2]:查询图书\t");printf("[7]:查询学生\n"); printf("\t\t\t[3]:添加图书\t");printf("[8]:添加学生\n"); printf("\t\t\t[4]:删除图书\t");printf("[9]:删除学生\n"); printf("\t\t\t[5]:遍历图书\t");printf("[10]:遍历学生\n\n"); printf("\t\t\t〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓\n\n"); printf("\t\t\t0:退出\n\n"); printf("请选择<0~10>:"); scanf("%d",&choice); switch(choice){ case0: system("cls"); printf("\n\t\t\t〓〓〓〓〓图书管理系统〓〓〓〓〓\n\n"); printf("\n谢谢您的使用!\n\n"); break; case1: system("cls"); printf("\n\t\t\t〓〓〓〓〓图书管理系统〓〓〓〓〓\n\n"); printf("输入借出图书编号:\n"); scanf("%d",&id); printf("输入借入学生学号:\n"); scanf("%d",&student_id); Lent_Book(id,student_id,head_book,head_student); break; case2: system("cls"); printf("\n\t\t\t〓〓〓〓〓图书管理系统〓〓〓〓〓\n\n"); printf("1.按编号查询\n\n"); printf("2.按名称查询\n\n"); printf("3.按价格区间查询\n\n"); printf("0.返回主菜单\n\n"); printf("请选择:"); scanf("%d",&f); if(f==1){ printf("请输入查询图书编号:"); scanf("%d",&id); printf("相关信息如下:\n\n"); head_book=Search_Book_ById(id,head_book); break; } elseif(f==2){ getchar(); printf("请输入查询图书名称:"); gets(title); printf("相关信息如下:\n\n"); head_book=Search_Book_ByTitle(title,head_book); break; } elseif(f==3){ printf("请输入最高价格:"); scanf("%lf",&price_h); printf("请输入最低价格:"); scanf("%lf",&price_l); printf("相关信息如下:\n\n"); head_book=Search_Book_ByPrice(price_h,price_l,head_book); break; } elseif(f==0){ break; } break; case3: system("cls"); printf("\n\t\t\t〓〓〓〓〓图书管理系统〓〓〓〓〓\n\n"); printf("请输入图书编号:"); scanf("%d",&id); printf("请输入图书名称:"); scanf("%s",title); printf("请输入作者名字:"); scanf("%s",author); printf("请输入单价:"); scanf("%lf",&price); printf("\n"); structbook*ptr_b; for(ptr_b=head_book;ptr_b;ptr_b=ptr_b->next) { if(ptr_b->id==id) { printf("此编号图书已存在\n"); m=0; break; } } if(m){ p_book=(structbook*)malloc(size_book); strcpy(p_book->title,title); p_book->id=id; p_book->price=price; p_book->student_id=-1; strcpy(p_book->author,author); strcpy(p_book->state,"存在"); strcpy(p_book->student_name,"待定"); //head_book=Insert_Book(head_book,p_book); Insert_Book(head_book,p_book); printf("\n添加图书成功!\n\n"); } break; case4: system("cls"); printf("\n\t\t\t〓〓〓〓〓图书管理系统〓〓〓〓〓\n\n"); printf("输入删除图书编号:\n"); scanf("%d",&id); /*if(Delete_Book(id,head_book)){ printf("\n删除图书成功!\n\n"); }else{ printf("删除失败"); }*/ head_book=Delete_Book(id,head_book); break; case5: system("cls"); printf("\n\t\t\t〓〓〓〓〓图书管理系统〓〓〓〓〓\n\n"); Print_Book(head_book); break; case6: system("cls"); printf("\n\t\t\t〓〓〓〓〓图书管理系统〓〓〓〓〓\n\n"); printf("输入归还图书编号:\n"); scanf("%d",&id); printf("输入归还学生学号:\n"); scanf("%d",&student_id); Back_Book(id,student_id,head_book,head_student); break; case7: system("cls"); printf("\n\t\t\t〓〓〓〓〓图书管理系统〓〓〓〓〓\n\n"); printf("请输入查询学生学号:"); scanf("%d",&id); printf("相关信息如下:\n\n"); head_student=Search_Student(id,head_student); break; case8: system("cls"); printf("\n\t\t\t〓〓〓〓〓图书管理系统〓〓〓〓〓\n\n"); printf("请输入学生编号:"); scanf("%d",&id); printf("请输入学生姓名:"); scanf("%s",name); printf("请输入学生性别:"); scanf("%s",sex); printf("\n"); structstudent*ptr_s; for(ptr_s=head_student;ptr_s;ptr_s=ptr_s->next) { if(ptr_s->id==id) { printf("此学号学生已存在\n"); m=0; break; } } if(m){ p_student=(structstudent*)malloc(size_student); p_student->id=id; strcpy(p_student->name,name); strcpy(p_student->sex,sex); strcpy(p_student->borrow_book,"无"); head_student=Insert_Student(head_student,p_student); printf("\n添加学生成功!\n\n"); } break; case9: system("cls"); printf("\n\t\t\t〓〓〓〓〓图书管理系统〓〓〓〓〓\n\n"); printf("输入删除学生学号:\n"); scanf("%d",&id); head_student=Delete_Student(id,head_student); break; case10: system("cls"); printf("\n\t\t\t〓〓〓〓〓图书管理系统〓〓〓〓〓\n\n"); Print_Student(head_student); } }while(choice!=0); return0; } structbook*Create_New_Book(){ structbook*head_book,*p_book; intid,tag; doubleprice; chartitle[20],author[20]; intsize_book=sizeof(structbook); head_book=NULL; printf("请输入图书编号:"); scanf("%d",&id); printf("请输入图书名称:"); scanf("%s",title); printf("请输入作者名字:"); scanf("%s",author); printf("请输入单价:"); scanf("%lf",&price); printf("\n"); while(true){ p_book=(structbook*)malloc(size_book); strcpy(p_book->title,title); p_book->id=id; p_book->price=price; p_book->student_id=-1; strcpy(p_book->author,author); strcpy(p_book->state,"存在"); strcpy(p_book->student_name,"待定"); head_book=Insert_Book(head_book,p_book); printf("是否继续?继续输入1,退出按任意键\n"); scanf("%d",&tag); if(tag!=1){ break; } printf("请输入图书编号:"); scanf("%d",&id); printf("请输入图书名称:"); scanf("%s",title); printf("请输入作者名字:"); scanf("%s",author); printf("请输入单价:"); scanf("%lf",&price); printf("\n"); } returnhead_book; } structstudent*Create_New_Student(){ structstudent*head_student,*p_student; intid,tag; charsex[10]; charname[20]; intsize_student=sizeof(structstudent); head_student=NULL; printf("请输入学生编号:"); scanf("%d",&id); printf("请输入学生姓名:"); scanf("%s",name); printf("请输入学生性别:"); scanf("%s",sex); printf("\n"); while(true){ p_student=(structstudent*)malloc(size_student); p_student->id=id; strcpy(p_student->name,name); strcpy(p_student->sex,sex); strcpy(p_student->borrow_book,"无"); head_student=Insert_Student(head_student,p_student); printf("是否继续?继续输入1,退出按任意键\n"); scanf("%d",&tag); if(tag!=1){ break; } printf("请输入学生编号:"); scanf("%d",&id); printf("请输入学生姓名:"); scanf("%s",name); printf("请输入学生性别:"); scanf("%s",sex); printf("\n"); } returnhead_student; } structbook*Insert_Book(structbook*head_book,structbook*new_book){ structbook*p,*q; p=q=head_book; if(head_book==NULL){//单向链表为空的情况 head_book=new_book; new_book->next=NULL; }else{ while((new_book->id>p->id)&&(p->next!=NULL)){ q=p; p=p->next; } if(new_book->id<=p->id){ new_book->next=p; if(head_book==p) head_book=new_book; else q->next=new_book; }else{ p->next=new_book; new_book->next=NULL; } } returnhead_book; }; structstudent*Insert_Student(structstudent*head_student,structstudent*new_student){ structstudent*p,*q; p=q=head_student; if(head_student==NULL){//单向链表为空的情况 head_student=new_student; new_student->next=NULL; }else{ while((new_student->id>p->id)&&(p->next!=NULL)){ q=p; p=p->next; } if(new_student->id<=p->id){ new_student->next=p; if(head_student==p) head_student=new_student; else q->next=new_student; }else{ p->next=new_student; new_student->next=NULL; } } returnhead_student; } structbook*Search_Book_ById(intid,structbook*head_book){ structbook*ptr_book=head_book; intflag=0; while(ptr_book!=NULL) { if(ptr_book->id==id){ printf("图书编号:%d\n",ptr_book->id); printf("图书名称:%s\n",ptr_book->title); printf("图书单价:%.2lf\n",ptr_book->price); printf("图书作者:%s\n",ptr_book->author); printf("存在状态:%s\n",ptr_book->state); printf("借书人姓名:%s\n",ptr_book->student_name); printf("学号:%d\n",ptr_book->student_id); printf("\n"); flag++; } if(flag>0) { break; } ptr_book=ptr_book->next; } if(flag==0){ printf("暂无此图书信息!\n\n"); } returnhead_book; }; structbook*Search_Book_ByTitle(char*title,structbook*head_book){ structbook*ptr_book=head_book; intflag=0; while(ptr_book!=NULL) { if(strcmp(ptr_book->title,title)==0){ printf("图书编号:%d\n",ptr_book->id); printf("图书名称:%s\n",ptr_book->title); printf("图书单价:%.2lf\n",ptr_book->price); printf("图书作者:%s\n",ptr_book->author); printf("存在状态:%s\n",ptr_book->state); printf("借书人姓名:%s\n",ptr_book->student_name); printf("学号:%d\n",ptr_book->student_id); printf("\n"); flag++; } if(flag>0) { break; } ptr_book=ptr_book->next; } if(flag==0){ printf("暂无此图书信息!\n\n"); } returnhead_book; }; structbook*Search_Book_ByPrice(doubleprice_h,doubleprice_l,structbook*head_book){ structbook*ptr_book=head_book; intflag=0; while(ptr_book!=NULL) { if(ptr_book->price>=price_l&&ptr_book->price<=price_h){ printf("图书编号:%d\n",ptr_book->id); printf("图书名称:%s\n",ptr_book->title); printf("图书单价:%.2lf\n",ptr_book->price); printf("图书作者:%s\n",ptr_book->author); printf("存在状态:%s\n",ptr_book->state); printf("借书人姓名:%s\n",ptr_book->student_name); printf("学号:%d\n",ptr_book->student_id); printf("\n"); flag++; } ptr_book=ptr_book->next; } if(flag==0){ printf("暂无此图书信息!\n\n"); } returnhead_book; } /*boolDelete_Book(intid,book*head_book){ boolflag=true; structbook*p,*q; p=q=head_book; if(p->id==id&&p->next==NULL){ head_book=NULL; } while(p->id!=id&&p->next!=NULL){ q=p; p=p->next; } if(p->id==id){ if(p==head_book){ head_book=p->next; }else{ q->next=p->next; } free(p); }else{ flag=false; printf("找不到该书"); } returnflag; };*/ structbook*Delete_Book(intid,book*head_book){ boolflag=true; structbook*p,*q; p=q=head_book; while(p->id!=id&&p->next!=NULL){ q=p; p=p->next; } if(p->id==id){ if(p==head_book){ head_book=p->next; }else{ q->next=p->next; } free(p); printf("删除成功!\n"); }else{ flag=false; printf("找不到该书"); } returnhead_book; }; structstudent*Delete_Student(intid,student*head_student){ boolflag=true; structstudent*p,*q; p=q=head_student; while(p->id!=id&&p->next!=NULL){ q=p; p=p->next; } if(p->id==id){ if(p==head_student){ head_student=p->next; }else{ q->next=p->next; } free(p); printf("删除成功!\n"); }else{ flag=false; printf("找不到该学生"); } returnhead_student; }; structstudent*Search_Student(intid,structstudent*head_student){ structstudent*ptr_student=head_student; intflag=0; while(ptr_student!=NULL) { if(ptr_student->id==id){ printf("学号:%d\n",ptr_student->id); printf("姓名:%s\n",ptr_student->name); printf("性别:%s\n",ptr_student->sex); printf("借书:%s\n",ptr_student->borrow_book); printf("\n"); flag++; } if(flag>0) { break; } ptr_student=ptr_student->next; } if(flag==0){ printf("暂无此学生信息!\n\n"); } returnhead_student; }; voidLent_Book(intid,intstudent_id,structbook*head_book,structstudent*head_student){ structbook*p=head_book; structstudent*q=head_student; if(p==NULL||q==NULL){ printf("书本或学生不存在\n"); return; } while(p!=NULL&&q!=NULL){ if(p->id!=id){ p=p->next; } if(q->id!=student_id){ q=q->next; } if(p->id==id&&q->id==student_id){ break; } } if(p==NULL||q==NULL){ printf("书本或学生不存在\n"); return; }else{ if(strcmp(p->state,"存在")!=0){ printf("书已借出!抱歉!"); return; }else{ p->student_id=student_id; strcpy(p->student_name,q->name); strcpy(q->borrow_book,p->title); strcpy(p->state,"已借出"); printf("已成功借出!/n"); } } }; voidBack_Book(intid,intstudent_id,structbook*head_book,structstudent*head_student){ structbook*p=head_book; structstudent*q=head_student; if(p==NULL||q==NULL){ printf("书本或学生不存在\n"); return; } while(p!=NULL&&q!=NULL){ if(p->id!=id){ p=p->next; } if(q->id!=student_id){ q=q->next; } if(p->id==id&&q->id==student_id){ break; } } if(p==NULL||q==NULL){ printf("书本或学生不存在\n"); return; }else{ if(strcmp(p->state,"存在")==0){ printf("书未借出!抱歉!"); return; }else{ p->student_id=-1; strcpy(p->student_name,"待定"); strcpy(q->borrow_book,"无"); strcpy(p->state,"存在"); printf("已成功归还!/n"); } } }; voidPrint_Book(structbook*head_book){ structbook*p=head_book; if(p==NULL){ printf("\n无记录\n\n"); return; } printf("\n图书编号\t图书名称\t图书单价\t图书作者\n\n"); while(p!=NULL) { printf("%d\t\t%s\t\t%.2lf\t\t%s\n\n",p->id,p->title,p->price,p->author); p=p->next; } } voidPrint_Student(structstudent*head_student){ structstudent*p=head_student; if(p==NULL){ printf("\n无记录\n\n"); return; } printf("\n学生姓名\t学生性别\t学生学号\n\n"); while(p!=NULL) { printf("%s\t\t%s\t\t%d\n",p->name,p->sex,p->id); p=p->next; } }
代码可以直接运行,这里我都是在控制台上直接显示的,如果想从文件读取和向文件写入学生和图书信息,只需要把相应的printf和scanf部分改为文件操作。这个是很久之前写的,详细的函数以及功能讲解这里就不介绍了。欢迎大家讨论和指导。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。