//200601128 计算机21-3 李买瑞 个人书籍信息管理系统
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
//定义枚举书籍类别
enum Type{
professial=0,
reference,
report,
novel,
others
};
//定义单一书籍信息结构体
struct Book{
char num[10];
char Title[10];
char Name[10];
char pbler[10];
enum Type type;
};
//定义节点
typedef struct _node{
struct Book Data;
struct _node *next;
}Node;
//录入书籍信息
void AddData(Node *data){
Node *last,*p;
last = data;
//last 指向最后一个节点
while( last->next != NULL ){
last = last->next;
}
char n[10];
while( 1 ){
printf("----按0退出录入\n");
printf("请输入书籍序号:\n");
scanf("%s",n);
if( strcmp(n,"0") == 0 ){
break;
}
//查重
Node *q;
for( q = data->next; q; q = q->next ){
if( strcmp(q->Data.num,n) == 0){
printf("输入序号重复!\n");
return;
}
}
p = (Node *)malloc(sizeof(Node));
strcpy(p->Data.num,n);
printf("请输入书名:\n");
scanf("%s",&p->Data.Title);
printf("请输入作者:\n");
scanf("%s",&p->Data.Name);
printf("请输入出版社:\n");
scanf("%s",&p->Data.pbler);
printf("请输入类别:0.专业书;1.工具书;2.报告;3.小说;4.其他;\n");
enum Type t;
scanf("%d",&t);
while( t != 0&& t != 1&& t != 2&& t != 3&& t != 4){
printf("请输入正确序号!\n");
scanf("%d",&t);
}
p->Data.type = t;
printf("已经完成一个记录的添加!\n");
p->next = NULL;
last->next = p;
last = p;
}
}
//保存书籍信息
void save(Node *data){
int n;
Node *p = NULL;
FILE *fp;
printf("是否保存到文档?\n----0.不保存\n----1.保存\n");
scanf("%d",&n);
if( n == 1){
if( data->next == NULL ){
printf("没有记录!\n");
}
else{
p = data->next;
}
if( (fp = fopen("DataBase.txt","wb")) == NULL ){
printf("文件打开失败!\n");
}
else{
while (p != NULL){
fprintf(fp, "%s\t %s\t %s\t %s\t %d\t \r\n",
p->Data.num, p->Data.Title, p->Data.Name,
p->Data.pbler,p->Data.type);
p = p->next;
}
fclose(fp);
printf("保存成功!\n");
}
}
}
//浏览书籍信息
int print(Node *data){
Node *p;
p = data->next;
if( p == NULL ){
printf("没有可供读取的信息!\n");
return 0;
}
printf(" 编号 书名 作者 出版社 类别 \n");
while( p != NULL ){
printf("%s\t %s\t %s\t %s\t ",
p->Data.num,p->Data.Title,p->Data.Name,p->Data.pbler );
switch( p->Data.type ){
case 0: printf(" professial\t \n"); break;
case 1: printf(" reference\t \n"); break;
case 2: printf(" report\t \n"); break;
case 3: printf(" novel\t \n"); break;
case 4: printf(" others\t \n"); break;
}
p = p->next;
}
}
//按照书名查询
void SearchTitle(Node *data){
char T[10];
printf("\n请输入书名:\n");
scanf("%s",T);
Node *p = NULL;
if( data->next == NULL ){
printf("没有可供查询的信息!\n");
}
else{
p = data->next;
printf("查找到的信息如下:\n");
printf(" 编号 书名 作者 出版社 类别 \n");
while( p != NULL){
if( strcmp(p->Data.Title,T) == 0){
printf("%s\t %s\t %s\t %s\t ",
p->Data.num,p->Data.Title,p->Data.Name,p->Data.pbler );
switch( p->Data.type ){
case 0: printf(" professial\t \n"); break;
case 1: printf(" reference\t \n"); break;
case 2: printf(" report\t \n"); break;
case 3: printf(" novel\t \n"); break;
case 4: printf(" others\t \n"); break;
}
}
p = p->next;
}
printf("查询结束!\n");
}
}
//按照作者查询
void SearchName(Node *data){
char N[10];
printf("\n请输入作者名:\n");
scanf("%s",N);
Node *p = NULL;
if( data->next == NULL){
printf("没有可供查询的信息!\n");
}
else{
p = data->next;
printf("查找到的信息如下:\n");
printf(" 编号 书名 作者 出版社 类别 \n");
while( p != NULL){
if( strcmp(p->Data.Name,N) == 0){
printf("%s\t %s\t %s\t %s\t ",
p->Data.num,p->Data.Title,p->Data.Name,p->Data.pbler );
switch( p->Data.type ){
case 0: printf(" professial\t \n"); break;
case 1: printf(" reference\t \n"); break;
case 2: printf(" report\t \n"); break;
case 3: printf(" novel\t \n"); break;
case 4: printf(" others\t \n"); break;
}
}
p = p->next;
}
printf("查询结束!\n");
}
}
//按照出版社查询
void SearchPbler(Node *data){
char P[10];
printf("\n请输入出版社:\n");
scanf("%s",P);
Node *p = NULL;
if( data->next == NULL){
printf("没有可供查询的信息!\n");
}
else{
p = data->next;
printf("查找到的信息如下:\n");
printf(" 编号 书名 作者 出版社 类别 \n");
while( p != NULL){
if( strcmp(p->Data.pbler,P) == 0){
printf("%s\t %s\t %s\t %s\t ",
p->Data.num,p->Data.Title,p->Data.Name,p->Data.pbler );
switch( p->Data.type ){
case 0: printf(" professial\t \n"); break;
case 1: printf(" reference\t \n"); break;
case 2: printf(" report\t \n"); break;
case 3: printf(" novel\t \n"); break;
case 4: printf(" others\t \n"); break;
}
}
p = p->next;
}
printf("查询结束!\n");
}
}
//按照类别查询
void SearchType(Node *data){
printf("\n请输入你要查询的类别:0.专业书;1.工具书;2.报告;3.小说;4.其他;\n");
enum Type t;
scanf("%d",&t);
while( t != 0&& t != 1&& t != 2&& t != 3&& t != 4){
printf("请输入正确序号!\n");
scanf("%d",&t);
}
Node *p = NULL;
if( data->next == NULL){
printf("没有可供查询的信息!\n");
}
else{
p = data->next;
printf("查找到的信息如下:\n");
printf(" 编号 书名 作者 出版社 类别 \n");
while( p != NULL){
if( t == p->Data.type ){
printf("%s\t %s\t %s\t %s\t ",
p->Data.num,p->Data.Title,p->Data.Name,p->Data.pbler );
switch( p->Data.type ){
case 0: printf(" professial\t \n"); break;
case 1: printf(" reference\t \n"); break;
case 2: printf(" report\t \n"); break;
case 3: printf(" novel\t \n"); break;
case 4: printf(" others\t \n"); break;
}
}
p = p->next;
}
printf("查询结束!\n");
}
}
//查询课程基本信息
void search(Node *data){
int flag;
printf("输入你要查询的信息:\n");
printf("1.按书名\n2.按作者\n3.按出版社\n4.按类别\n");
scanf("%d",&flag);
switch( flag ){
case 1: SearchTitle(data); break;
case 2: SearchName(data); break;
case 3: SearchPbler(data); break;
case 4: SearchType(data); break;
default: printf("请输入正确的序号!\n");
break;
}
}
//增加书籍信息
void input(Node *data){
Node *last;
last = data;
//last 指向最后一个节点
while( last->next != NULL ){
last = last->next;
}
Node *p;
p = (Node *)malloc( sizeof(Node) );
char n[10];
printf("请输入要添加的书籍序号:\n");
scanf("%s",n);
//查重
Node *q;
for( q = data->next; q; q = q->next ){
if( strcmp(q->Data.num,n) == 0){
printf("输入序号重复!\n");
return;
}
}
strcpy(p->Data.num,n);
printf("请输入书名:\n");
scanf("%s",p->Data.Title);
printf("请输入作者:\n");
scanf("%s",p->Data.Name);
printf("请输入出版社:\n");
scanf("%s",p->Data.pbler);
printf("请输入类别:0.专业书;1.工具书;2.报告;3.小说;4.其他;\n");
scanf("%d",&p->Data.type);
printf("已经完成一个记录的添加!\n");
p->next = NULL;
last->next = p;
last = p;
printf("即将保存至文件......\n");
save(data);
}
//删除书籍信息
void Delete(Node *data){
Node *p = NULL;
if( data->next == NULL){
printf("没有可供删除的信息!\n");
}
else{
char n[10];
printf("请输入需要删除书籍序号:\n");
scanf("%s",n);
p = data->next;
Node *q;
for( q=NULL; p!=NULL ; q=p,p=p->next ){
if( strcmp(p->Data.num,n) == 0 ){
printf("找到了你要删除的书籍序号:\n");
int flag;
printf("是否删除?\n----1.删除\n----2.取消\n");
scanf("%d",&flag);
if( flag == 2 ) break;
//删除目标节点p
if( q != NULL ){
q->next = p->next;
}
else{
data->next = p->next;
}
printf("删除成功!\n");
free(p);
break;
}
}
}
printf("即将保存至文件......\n");
save(data);
}
//修改书籍信息
void amend(Node *data){
Node *p = NULL;
if( data->next == NULL){
printf("没有可供修改的信息!\n");
}
else{
char n[10];
printf("请输入要修改的书籍序号:\n");
scanf("%s",n);
p = data->next;
while( p != NULL ){
if( strcmp(p->Data.num,n) == 0 ){
break;
}
p = p->next;
}
if( p != NULL ){
printf("找到了!\n");
printf("查找到的信息如下:\n");
printf("\n\n 编号 书名 作者 出版社 类别 \n");
printf("%s\t %s\t %s\t %s\t ",
p->Data.num,p->Data.Title,p->Data.Name,p->Data.pbler );
switch( p->Data.type ){
case 0: printf(" professial\t \n"); break;
case 1: printf(" reference\t \n"); break;
case 2: printf(" report\t \n"); break;
case 3: printf(" novel\t \n"); break;
case 4: printf(" others\t \n"); break;
}
while( 1 ){
int flag;
printf("\n\n输入你要修改的信息序号:\n");
printf("1.按书名\n2.按作者\n3.按出版社\n4.按类别\n5.退出修改\n");
scanf("%d",&flag);
if( flag == 5){
break;
}
switch( flag ){
case 1:
printf("请输入新的书名:\n");
scanf("%s",p->Data.Title); break;
case 2:
printf("请输入新的作者名:\n");
scanf("%s",p->Data.Name); break;
case 3:
printf("请输入新的出版社:\n");
scanf("%s",p->Data.pbler); break;
case 4:
printf("请输入新的类别:\n");
scanf("%d",&p->Data.type); break;
default:
printf("请输入正确序号!\n");
return; break;
}
}
printf("即将保存至文件......\n");
save(data);
}
else{
printf("没有你要修改的信息!\n");
}
}
}
//统计与枚举成员变量相同的个数
int count(Node *data,int flag){
Node *p;
p = data->next;
int cnt=0;
while( p != NULL){
if( flag == p->Data.type){
cnt++;
}
p = p->next;
}
return cnt;
}
//按类别统计书籍数量
int statistics(Node *data){
printf("请输入需要统计的书籍类别:0.专业书;1.工具书;2.报告;3.小说;4.其他;\n");
int flag;
int cnt;
scanf("%d",&flag);
switch( flag ){
case 0: cnt = count(data,flag); break;
case 1: cnt = count(data,flag); break;
case 2: cnt = count(data,flag); break;
case 3: cnt = count(data,flag); break;
case 4: cnt = count(data,flag); break;
default: printf("请输入正确编号!");
return 0; break;
}
return cnt;
}
//按书名对书籍进行排序(冒泡排序)
void BubbleSort(Node *data){
Node *i,*j;
for( i=data->next,j=data; i!=NULL; i=j->next,j=i ){
for( ; i->next!=NULL; i=i->next ){
if( strcmp(i->Data.Title, i->next->Data.Title) == 1 ){
struct Book tmp;
tmp = i->Data;
i->Data = i->next->Data;
i->next->Data = tmp;
}
else if( strcmp(i->Data.Title, i->next->Data.Title) == 0){
if( strcmp(i->Data.num,i->next->Data.num) == 1){
struct Book tmp;
tmp = i->Data;
i->Data = i->next->Data;
i->next->Data = tmp;
}
}
}
}
printf("排序完成,是否输出:1.输出;2.返回主菜单\n");
int c;
scanf("%d",&c);
switch( c ){
case 1: print(data); break;
case 2: break;
default: printf("请输入正确序号!");
break;
}
}
//主函数
int main()
{
//定义第一个节点
Node *data;
data = (Node*)malloc( sizeof(Node) );
data -> next = NULL;
int n;
while( 1 ){
//用户界面
printf("\n\n\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("---------------------------------------------------\n");
printf("********************谢谢使用***********************\n");
printf("请选择1-10:");
scanf("%d",&n);
printf("\n\n");
switch( n ){
case 1: AddData(data); break;
case 2: save(data); break;
case 3: print(data); break;
case 4: search(data); break;
case 5: input(data); break;
case 6: Delete(data); break;
case 7: amend(data); break;
case 8: int cnt;
printf("\n这个类别的书有:%d本",statistics(data)); break;
case 9: BubbleSort(data); break;
case 10: free( data );
return 0; break;
default: printf("请输入1-10之间的数字!");
break;
}
}
}
|