BUAA_数据结构_2nd_小型图书管理系统

题目描述

小明同学特别喜欢买书看书。由于书较多,摆放杂乱,找起来非常麻烦。这学期小明同学上了数据结构与程序设计课后,决定改变这种状况:用C开发一个小型图书管理系统。系统中包含的图书信息有:书名、作者、出版社、出版日期等。首先,图书管理系统对已有的书(原始书库,存放在一个文本文件中)按书名字典序进行(按书名中各字符的ASCII码值由小到大排序)摆放(即将原始无序的图书信息文件生成一个有序的文件,即新书库),以便查找。该管理系统可以对新书库中图书条目进行如下操作:
1.录入。新增书录入到书库中(即从输入中读入一条图书信息插入到已排序好的图按书文件相关位置处)
2.查找。按书名或书名中关键字信息在书库中查找相关图书信息,若有多本书,按字典序输出。
3.删除。输入书名或书名中关键字信息,从书库中查找到相关书并将其删除,并更新书库。

输入形式

原始的图书信息(原始书库)保存在当前目录下的books.txt中。
用户操作从控制台读入,首先输入操作功能序号(1代表录入操作,2代表查找操作,3代表删除操作,0代表将已更新的图书信息保存到书库中并退出程序),然后在下一行输入相应的操作信息(录入操作后要输入一条图书信息,查找和删除操作后只要输入书名或书名中部分信息)。程序执行过程中可以进行多次操作,直到退出(输入操作0)程序。
要求:
1、原始文件中的图书信息与录入的图书信息格式相同,每条图书信息都在一行上,包括书名(不超过50个字符)、作者(不超过20个字符)、出版社(不超过30个字符)和出版日期(不超过10个字符),只由英文字母和下划线组成,用一个空格分隔。图书信息总条数不会超过500.
2、下划线字符参加排序。
3、图书不会重名。

输出形式

进行录入和删除操作,系统会更新图书信息,但不会在控制台窗口显示任何信息。
进行查找操作后,将在控制台按书名字典序分行输出查找到的图书信息,书名占50个字符宽度,作者占20个字符宽度,出版社占30个字符宽度,出版日期占10个字符宽度,都靠左对齐输出。
最终按字典排序的图书信息保存在当前目录下的ordered.txt中,每条图书信息占一行,格式与查找输出的图书信息相同。

参考代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>struct node{//节点的类型char name[100];char author[30];char publish[50];char date[20];struct node *next;//指向下一个节点的指针
};
//typedef : 数据类型重命名
typedef struct node node;
typedef struct node *node_list;//int list_insert_pre_node_temp(node_list *head,node_list *p,int element);//指定结点的前插O(n)
int list_insert_pre_node(node_list p,char name[],char author[],char publish[],char date[]);//指定结点的前插O(1)
int list_insert_next_node(node_list p,char name[],char author[],char publish[],char date[]);//指定结点的后插int list_delete_node_normal(node_list *head,node *p);//O(n)删除一个指定结点void list_print(node_list temp);node_list pubbleSort(node_list head);
int find_inf(char name[],char inf[]);char name[100];
char author[30];
char publish[50];
char date[20];
char inf[100];int main()
{FILE *sin,*sout;//sin=fopen("books.txt", "r");sin=fopen("books.txt", "r");sout=fopen("ordered.txt", "w");node_list head=(node *)malloc(sizeof(node));head->next=NULL;node *now,*tail=head;while((fscanf(sin,"%s%s%s%s",name,author,publish,date))!=EOF){//printf("%s %s %s %s\n",name,author,publish,date);now=(node *)malloc(sizeof(node));strcpy(now->name,name);strcpy(now->author,author);strcpy(now->publish,publish);strcpy(now->date,date);tail->next=now;tail=now;}tail->next=NULL;fclose(sin);//list_print(head);if(NULL!=head->next){head=pubbleSort(head);//list_print(head);}int op;while(1){scanf("%d",&op);if(op==1){//insertscanf("%s%s%s%s",name,author,publish,date);if(NULL==head->next){now=(node *)malloc(sizeof(node));strcpy(now->name,name);strcpy(now->author,author);strcpy(now->publish,publish);strcpy(now->date,date);head->next=now;tail=now;tail->next=NULL;}else{node *i=head->next;for(i;NULL!=i;i=i->next){if(strcmp(i->name,name)>0){list_insert_pre_node(i,name,author,publish,date);//list_print(head);break;}if(NULL==i->next){list_insert_next_node(i,name,author,publish,date);break;}}}}else if(op==2){//findscanf("%s",inf);//printf("%s\n",inf);node *i=head->next;for(i;NULL!=i;i=i->next){if(find_inf(i->name,inf)){printf("%-50s%-20s%-30s%s\n",i->name,i->author,i->publish,i->date);}}}else if(op==3){//deletescanf("%s",inf);node *i=head->next;for(i;NULL!=i;i=i->next){if(find_inf(i->name,inf)){list_delete_node_normal(head,i);}}}else if(op==0){node_list temp=head;temp=temp->next;while(NULL!=temp){fprintf(sout,"%-50s%-20s%-30s%s\n",temp->name,temp->author,temp->publish,temp->date);temp=temp->next;}fclose(sout);break;}}return 0;
}int find_inf(char name[],char inf[])
{int len_name=strlen(name);int len_inf=strlen(inf);for(int i=0;i<len_name;i++){if(name[i]==inf[0]){int look=0;while(look<len_inf){if(name[i+look]!=inf[look]){break;}if(look==len_inf-1){return 1;}look++;}}}return 0;
}node_list pubbleSort(node_list head)
{node *i=head->next;for(i;NULL!=i;i=i->next){for(node *j=head->next;NULL!=j;j=j->next){if(strcmp(i->name,j->name)<0){node *temp=(node *)malloc(sizeof(node));strcpy(temp->name,i->name);strcpy(temp->author,i->author);strcpy(temp->publish,i->publish);strcpy(temp->date,i->date);strcpy(i->name,j->name);strcpy(i->author,j->author);strcpy(i->publish,j->publish);strcpy(i->date,j->date);strcpy(j->name,temp->name);strcpy(j->author,temp->author);strcpy(j->publish,temp->publish);strcpy(j->date,temp->date);}}}return head;
}int list_insert_pre_node(node_list p,char name[],char author[],char publish[],char date[])//指定结点的前插O(1)
//偷天换日
{if(NULL==p) return 0;node *new_node=(node *)malloc(sizeof(node));if(NULL==new_node) return 0;new_node->next=p->next;p->next=new_node;strcpy(new_node->name,p->name);strcpy(new_node->author,p->author);strcpy(new_node->publish,p->publish);strcpy(new_node->date,p->date);strcpy(p->name,name);strcpy(p->author,author);strcpy(p->publish,publish);strcpy(p->date,date);return 1;
}int list_insert_next_node(node_list p,char name[],char author[],char publish[],char date[])//指定结点的后插
{if(NULL==p) return 0;node *new_node=(node *)malloc(sizeof(node));if(NULL==new_node) return 0;strcpy(new_node->name,name);strcpy(new_node->author,author);strcpy(new_node->publish,publish);strcpy(new_node->date,date);new_node->next=p->next;p->next=new_node;return 1;
}int list_delete_node_normal(node_list *head,node *p)//O(n)删除一个指定结点
{if(NULL==p) return 0;node_list pre;pre=head;while(pre->next!=p&&pre->next!=NULL){pre=pre->next;}if(pre->next!=NULL){pre->next=p->next;free(p);}return 1;
}void list_print(node_list temp)
{temp=temp->next;while(temp!=NULL){printf("%s %s %s %s\n",temp->name,temp->author,temp->publish,temp->date);temp=temp->next;}
}

有问题或bug 欢迎私戳/评论

BUAA_数据结构_2nd_小型图书管理系统相关推荐

  1. BUAA小型图书管理系统

    [问题描述] 小明同学特别喜欢买书看书.由于书较多,摆放杂乱,找起来非常麻烦.这学期小明同学上了数据结构与程序设计课后,决定改变这种状况:用C开发一个小型图书管理系统.系统中包含的图书信息有:书名.作 ...

  2. BUAA(2021春)小型图书管理系统

    BUAA数据结构第二次编程题--小型图书管理系统 看前须知 第二次上机题汇总 题目内容 问题描述 输入形式 输出形式 样例 样例说明 题解 易错点和难点 参考代码 补充测试的数据 推荐题单 看前须知 ...

  3. C语言——小型图书管理系统(课程设计)

    [文末获取资源] 该系统包括以下功能: 01.注册账号 02.登录账号 03.修改密码 04.录入功能 05.添加功能 06.删除功能 07.修改功能 08.浏览功能 09.查询密码 10.排序功能 ...

  4. 基于SpringBoot的社区小型图书管理系统的设计与实现

    作者主页:Designer 小郑 作者简介:Java全栈软件工程师一枚,来自浙江宁波,负责开发管理公司OA项目,专注软件前后端开发(Vue.SpringBoot和微信小程序).系统定制.远程技术指导. ...

  5. C++ 实现小型图书管理系统

    因为课程设计的原因,需要实现一个小型图书管理系统 包含功能: 问题描述: 设计一个系统,对图书信息进行管理,信息描述:有关该系统基本信息的描述,如:图书名称.图书编号.单价.作者.存在状态.借书人姓名 ...

  6. Java小项目--小型图书管理系统(含完整代码及工具)

    写在前面 对于一个java项目来说,我理解的整个流程是这样的: (1)进行需求分析 (2)设计数据库(重要) (3)编写java代码 注:数据库设计非常重要,特别是数据类型的定义,表与表之间的关系,如 ...

  7. 自制小型图书管理系统 - 简单版(锻炼java基础语法的使用)

    文章目录 前言 1. 小型图书管理系统框架思想 2. 实现框架 2.1 构建书架:存放书籍 2.2 使用者的构建 - user 2.3 主函数构建 - Main 2.4 操作的构建 - operate ...

  8. 数据结构课程设计--图书管理系统

    //主函数模块#include "library.h" int main() {FILE *fp_book,*fp_reader; /*创建文件型指针*/Denglu();if(( ...

  9. 数据结构课程设计图书管理系统,C语言版。

    目录 一.功能描述 二.设计要求 三.实现的功能 四.代码 一.功能描述 设计一个图书管理程序满足图书馆基本业务需求. 二.设计要求 每种书的登记内容包括书号.书名.著作者.现存量和库存量等: 对书号 ...

最新文章

  1. 剑指offer:面试题17. 打印从1到最大的n位数
  2. linux监控哪些目录,linux管理文件和目录的命令
  3. box-sizing的使用
  4. RHEL6   Kickstart 无人值守安装
  5. Python分析「我们为什么这么穷」
  6. playframe 项目搭建
  7. java 参数 python_java可变参数
  8. 《盘古开天地》的故事内容,《盘古开天地》的启示
  9. opengl画的弧线 为什么有一个半径_6个1画生日蛋糕,也太简单啦【图文+视频教程】...
  10. DSP sawtooth锯齿波与square方波matlab产生(M2.2)
  11. Linux运维学习笔记
  12. Springboot如何实现自定义错误页面(错误处理机制详解)
  13. 将数据库中的表结构导出到excel中(写数据库设计说明书)
  14. 计算机学院校运会解说词,大学学院运动会入场解说词
  15. iOS内存分配与五大区域
  16. 数据库事务的概念和ACID特性!你懂了吗,小老弟?!
  17. 自主开发的小型Web服务器
  18. 亚马逊美国风扇ul507标准解析
  19. SVN冲突解决方案总结
  20. 多版本opencv管理 --pkg-config

热门文章

  1. MUX实现不同的门电路功能
  2. 从企业微信、钉钉、班聊、纷享逍客,看企业服务
  3. 大数据的一生一世——谈数据冷热分离技术
  4. C++Primer第五版 第十二章习题答案(1~10)
  5. php 文本编辑器 ueditor
  6. py实战项目进度甘特图绘制
  7. bzoj3784 树上的路径 点分治+RMQ+优先队列
  8. 微型计算机原理实验程序,微机原理实验(含程序).doc
  9. Spring中Singleton模式的线程安全
  10. Excel出现“向程序发送命令时出现问题”错误