| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2112 人关注过本帖
标题:大佬们,这是一个图书馆录入与查询系统,有个问题:怎么使得输入的图书编号 ...
只看楼主 加入收藏
ivent
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2018-11-21
结帖率:50%
收藏
 问题点数:0 回复次数:2 
大佬们,这是一个图书馆录入与查询系统,有个问题:怎么使得输入的图书编号不能重复,重复就会报错!可以帮我改下代码吗。谢谢各位大佬指点
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>

struct books_list
{

 char author[20]; /*作者名*/
 char bookname[20]; /*书名*/
 char publisher[20]; /*出版单位*/
 char booknum[10]; /*书号*/
 char category[20];/*类别*/
 struct books_list * next; /*链表的指针域*/
};
struct books_list * Create_Books_Doc(); /*新建链表*/
void InsertDoc(struct books_list * head); /*插入*/
void Print_Book_Doc(struct books_list * head);/*浏览*/
void search1_book(struct books_list * head); /*查询*/
void search2_book(struct books_list * head); /*查询*/
void search3_book(struct books_list * head); /*查询*/
void search4_book(struct books_list * head); /*查询*/
void search5_book(struct books_list * head); /*查询*/
void save(struct books_list * head);/*保存数据至文件*/

/*新建链表头节点*/
struct books_list * Create_Books_Doc()
{
 struct books_list * head;
 head=(struct books_list *)malloc(sizeof(struct books_list)); /*分配头节点空间*/
 head->next=NULL; /*头节点指针域初始化,定为空*/
 return head;
}/*保存数据至文件*/
void save(struct books_list * head)
{
 struct books_list *p;
 FILE *fp;
 p=head;
 fp=fopen("data.txt","w+"); /*以写方式新建并打开data.txt文件*/
 fprintf(fp,"┏━━━┳━━━━━┳━━━━━┳━━━━━┳━━━━┳\n"); /*向文件输出表格*/
 fprintf(fp,"┃书号┃书名  ┃作者  ┃出版单位┃类别 ┃\n");
 fprintf(fp,"┣━━━╋━━━━━╋━━━━━╋━━━━━╋━━━━╋\n");
 /*指针从头节点开始移动,遍历至尾结点,依次输出图书信息*/
 while(p->next!= NULL)
 {
 p=p->next;
 fprintf(fp,"┃%-6.6s┃%-10.10s┃%-10.10s┃%-10.10s┃%-10.10s┃\n",p->booknum,p->bookname,p->author,p->publisher,p->category);
 }
 fprintf(fp,"┗━━━┻━━━━━┻━━━━━┻━━━━━┻━━━━━┻\n");
 fclose(fp);
 printf(" 已将图书数据保存到data.txt 文件\n");
}

/*插入*/
void InsertDoc(struct books_list *head)
{
 /*定义结构体指针变量s指向开辟的新结点首地址p为中间变量*/
 struct books_list *s, *p;
 char flag='Y'; /*定义flag,方便用户选择重复输入*/
 p=head;
 /*遍历到尾结点,p指向尾结点*/
 while(p->next!= NULL)
 {
 p=p->next;
 }
 /*开辟新空间,存入数据,添加进链表*/
 while(flag=='Y'||flag=='y')
 {
 s=(struct books_list *)malloc(sizeof(struct books_list));
 printf("\n 请输入图书号:");
 fflush(stdin);
 scanf("%s",s->booknum);
 printf("\n 请输入图书书名:");
 fflush(stdin);
 scanf("%s",s->bookname);
 printf("\n 请输入图书作者名:");
 fflush(stdin);
 scanf("%s",s->author);
 printf("\n 请输入图书出版社:");
 fflush(stdin);
 scanf("%s",s->publisher);
 printf("\n 请输入图书类别:");
 fflush(stdin);
 scanf("%s",s->category);
 printf("\n");
 p->next=s; /*将新增加的节点添加进链表*/
 p=s; /*p指向尾节点,向后移*/
 s->next=NULL;
 printf(" ━━━━添加成功!━━━━");
 printf("\n 继续添加?(Y/N):");
 fflush(stdin);
 scanf("%c",&flag);
 printf("\n");
 if(flag=='N'||flag=='n')
     {break;}
 else if(flag=='Y'||flag=='y')
 {continue;}
 }
 save(head); /*保存数据至文件*/
 return;
}

/*查询操作*/
void search1_book(struct books_list *head)
{
 struct books_list * p;
 char Number[10];
 p=head;
 if(head==NULL || head->next==NULL) /*判断数据库是否为空*/
 {
     printf(" ━━━━图书库为空!━━━━\n");
 }
 else
 {
 printf("请输入您要查找的书号: ");
 fflush(stdin);
 scanf("%s",&Number);
 /*指针从头节点开始移动,遍历至尾结点,查找书目信息*/
 while(p->next!= NULL)
 {
 p=p->next;
 if(strcmp(p->booknum,Number)==0)
 {
 printf("\n图书已找到!\n");
 printf("\n");
 printf("书号: %s\t\n",p->booknum);
 printf("书名: %s\t\n",p->bookname);
 printf("作者名: %s\t\n",p->author);
 printf("出版单位: %s\t\n",p->publisher);
 printf("类别:%s\t\n",p->category);
 }
 if(p->next==NULL)
 {
 printf("\n查询完毕!\n");
 }
 }
 }
 return;
}

void search2_book(struct books_list *head)
{
 struct books_list * p;
 char temp[20];
 p=head;
 if(head==NULL || head->next==NULL) /*判断数据库是否为空*/
 {
     printf(" ━━━━图书库为空!━━━━\n");
 }
 else
 {
 printf("请输入您要查找的书名: ");
 fflush(stdin);
 scanf("%s",&temp);
 /*指针从头节点开始移动,遍历至尾结点,查找书目信息*/
 while(p->next!= NULL)
 {
 p=p->next;
 if(strcmp(p->bookname,temp)==0)
 {
 printf("\n图书已找到!\n");
 printf("\n");
 printf("书号: %s\t\n",p->booknum);
 printf("书名: %s\t\n",p->bookname);
 printf("作者名: %s\t\n",p->author);
 printf("出版单位: %s\t\n",p->publisher);
 printf("类别:%s\t\n",p->category);
 }
 if(p->next==NULL)
 {
 printf("\n查询完毕!\n");
 }
 }
 }
 return;
}
void search3_book(struct books_list *head)
{
 struct books_list * p;
 char writer[20];
 p=head;
 if(head==NULL || head->next==NULL) /*判断数据库是否为空*/
 {
     printf(" ━━━━图书库为空!━━━━\n");
 }
 else
 {
 printf("请输入您要查找的作者名: ");
 fflush(stdin);
 scanf("%s",&writer);
 /*指针从头节点开始移动,遍历至尾结点,查找书目信息*/
 while(p->next!= NULL)
 {
 p=p->next;
 if(strcmp(p->author,writer)==0)
 {
 printf("\n图书已找到!\n");
 printf("\n");
 printf("书号: %s\t\n",p->booknum);
 printf("书名: %s\t\n",p->bookname);
 printf("作者名: %s\t\n",p->author);
 printf("出版单位: %s\t\n",p->publisher);
 printf("类别:%s\t\n",p->category);
 }
 if(p->next==NULL)
 {
 printf("\n查询完毕!\n");
 }
 }
 }
 return;
}
void search4_book(struct books_list *head)
{
 struct books_list * p;
 char press[20];
 p=head;
 if(head==NULL || head->next==NULL) /*判断数据库是否为空*/
 {
     printf(" ━━━━图书库为空!━━━━\n");
 }
 else
 {
 printf("请输入您要查找的出版社: ");
 fflush(stdin);
 scanf("%s",&press);
 /*指针从头节点开始移动,遍历至尾结点,查找书目信息*/
 while(p->next!= NULL)
 {
 p=p->next;
 if(strcmp(p->publisher,press)==0)
 {
 printf("\n图书已找到!\n");
 printf("\n");
 printf("书号: %s\t\n",p->booknum);
 printf("书名: %s\t\n",p->bookname);
 printf("作者名: %s\t\n",p->author);
 printf("出版单位: %s\t\n",p->publisher);
 printf("类别:%s\t\n",p->category);
 }
 if(p->next==NULL)
 {
 printf("\n查询完毕!\n");
 }
 }
 }
 return;
}
void search5_book(struct books_list *head)
{
 struct books_list * p;
 char type[20];
 p=head;
 if(head==NULL || head->next==NULL) /*判断数据库是否为空*/
 {
     printf(" ━━━━图书库为空!━━━━\n");
 }
 else
 {
 printf("请输入您要查找的类别: ");
 fflush(stdin);
 scanf("%s",&type);
 /*指针从头节点开始移动,遍历至尾结点,查找书目信息*/
 while(p->next!= NULL)
 {
 p=p->next;
 if(strcmp(p->category,type)==0)
 {
 printf("\n图书已找到!\n");
 printf("\n");
 printf("书号: %s\t\n",p->booknum);
 printf("书名: %s\t\n",p->bookname);
 printf("作者名: %s\t\n",p->author);
 printf("出版单位: %s\t\n",p->publisher);
 printf("类别:%s\t\n",p->category);
 }
 if(p->next==NULL)
 {
 printf("\n查询完毕!\n");
 }
 }
 }
 return;
}

 /*浏览操作*/
void Print_Book_Doc(struct books_list * head)
{
 struct books_list * p;
 if(head==NULL || head->next==NULL) /*判断数据库是否为空*/
 {
 printf("\n ━━━━没有图书记录! ━━━━\n\n");
 return;
 }
 p=head;
 printf("┏━━━┳━━━━━┳━━━━━┳━━━━━┳━━━━━┳\n");
 printf("┃书号┃书名  ┃作者  ┃出版单位┃类别   ┃\n");
 printf("┣━━━╋━━━━━╋━━━━━╋━━━━━╋━━━━━╋\n");
 /*指针从头节点开始移动,遍历至尾结点,依次输出图书信息*/
 while(p->next!= NULL)
 {
     p=p->next;
 printf("┃%-6.6s┃%-10.10s┃%-10.10s┃%-10.10s┃%-10.10s┃\n",p->booknum,p->bookname,p->author,p->publisher,p->category); /*循环输出表格*/
 }      
 printf("┗━━━┻━━━━━┻━━━━━┻━━━━━┻\n");
 printf("\n");
}
int main(void)
{
 struct books_list * head;
 char choice;
 head=NULL;
 for(;;) /*实现反复输入选择*/
 {
     system("color 3C");
 printf(" ┏━┓***************************************┏━┓\n");
 printf(" ┃┃图书管理系统┃┃\n");
 printf(" ┃┗━━━━━━━━━━━━━━━━━━━┛┃\n");
 printf(" ┃[1]图书信息录入┃\n");
 printf(" ┃┃\n");
 printf(" ┃[2]图书信息浏览┃\n");
 printf(" ┃┃\n");
 printf(" ┃[3]按书号查询┃\n");
 printf(" ┃┃\n");
 printf(" ┃[4]按书名查询┃\n");
 printf(" ┃┃\n");
 printf(" ┃[5]按作者查询┃\n");
 printf(" ┃┃\n");
 printf(" ┃[6]按出版社查询┃\n");
 printf(" ┃┃\n");
 printf(" ┃[7]按类别查询┃\n");
 printf(" ┃┃\n");
 printf(" ┃[8]退出系统┃\n");
 printf(" ┗**********************************************┛\n");
 printf(" 请选择:");
 fflush(stdin);
 scanf("%c",&choice);
 if(choice=='1')
 {
     if(head==NULL)
     {
         head=Create_Books_Doc();
     }
     InsertDoc(head);

 }
 else if(choice=='2')
 {
 Print_Book_Doc(head);
 }
 else if(choice=='3')
 {
 search1_book(head);
 }
 else if(choice=='4')
 {
 search2_book(head);
 }
 else if(choice=='5')
 {
 search3_book(head);
 }
 else if(choice=='6')
 {
 search4_book(head);
 }
 else if(choice=='7')
 {
 search5_book(head);
 }
 else if(choice=='8')
 {
 printf("\n");
 printf(" ━━━━━━━━感谢使用图书管理系统━━━━━━━━\n");
 break;
 }
 else
 {
 printf(" ━━━━输入错误,请重新输入!━━━━");
 break;
 }
 }
 return 0;
}


搜索更多相关主题的帖子: struct next head NULL printf 
2018-12-17 09:52
Mr_doge
Rank: 5Rank: 5
等 级:贵宾
威 望:10
帖 子:159
专家分:385
注 册:2018-6-28
收藏
得分:0 
大概理解了你的想法,作为一个懒人,帮忙改恕我拒绝,思路可以给你
1:额外添加个函数,每次输入图书编号则调用该函数对链表遍历并检查输入字符串是否有一致的,有则报错并释放错误分配的空间,无则继续正常作业

2:建立一个哈希表进行表管理(简易的哈希表的实现不比链表复杂),当哈希后取得的表位置一致时,检查该位置的此结构成员存储的字符串,一致则报错,不一致则使用链表对此位置进行扩展(简易哈希表哈希后冲突常用的解决方式)

两者的区别不多说了,后者代码量会多一丢丢
2018-12-20 00:24
ivent
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2018-11-21
收藏
得分:0 
回复 2楼 Mr_doge
谢谢谢谢!!
2018-12-30 13:54
快速回复:大佬们,这是一个图书馆录入与查询系统,有个问题:怎么使得输入的图书 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.029716 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved