复制
收藏
提问
简洁
#include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> struct books_list { char author[80]; char bookname[80]; char publisher[80]; char pbtime[80]; char loginnum[80]; float price; char classfy[80]; struct books_list * next; }; void InsertDoc(struct books_list * HEAD); void Print_Book_Doc(struct books_list * HEAD); void search_book(struct books_list * HEAD); void DeleteDoc(struct books_list * HEAD , int num); void save(struct books_list * HEAD); struct books_list * Create_Books_Doc(); 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) { int i,a; struct books_list *p; FILE *fp; p=HEAD; fp=fopen("my.txt","w+"); fprintf(fp,"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n"); fprintf(fp,"登录号┃ 书 名 ┃ 作 者┃ 出版单位 ┃ 出版时间 ┃分类号┃ 价格 \n"); fprintf(fp,"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n"); while(p->next!= NULL) { p=p->next; fprintf(fp,"┃%-10.10s┃%-10.10s┃%-10.10s┃%-10.10s┃%-12.12s┃%-10.10s┃%.2f \n",p->loginnum,p->bookname,p->author,p->publisher,p->pbtime,p->classfy,p->price); } fprintf(fp,"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n"); fclose(fp); printf(" 将图书数据保存到 my.txt 文件\n"); } void InsertDoc(struct books_list *HEAD) { struct books_list *s, *p; char flag='Y'; p=HEAD; while(p->next!= NULL) { p=p->next; } while(flag=='Y') { int inside ; s=(struct books_list *)malloc(sizeof(struct books_list)); printf("\n 请输入图书登录号:"); fflush(stdin); scanf("%s",s->loginnum); 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->pbtime); printf("\n 请输入图书分类号:"); fflush(stdin); scanf("%s",s->classfy); printf("\n 请输入图书价格:"); fflush(stdin); scanf("%f",&s->price); printf("\n"); p->next=s; p=s; s->next=NULL; printf(" ━━━━ 添加成功!━━━━"); printf("\n 继续添加?(输入Y/N):");//输入'Y'or'N' yes/no // fflush(stdin); scanf("%c",&flag); printf("\n"); if(flag=='N') {break;} else if(flag=='Y') {continue;} } save(HEAD); return ; } void search_book(struct books_list *HEAD) { struct books_list * p; char temp[80]; 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"); printf("\n图书已找到!\n"); printf("账号: %s\t\n",p->loginnum); printf("书名: %s\t\n",p->bookname); printf("作者名: %s\t\n",p->author); printf("出版单位: %s\t\n",p->publisher); printf("出版时间: %s\t\n",p->pbtime); printf("分类号: %s\t\n",p->classfy); printf("价格: %.2f\t\n",p->price); printf("\n"); } 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"); printf("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n"); printf("\n"); while(p->next!= NULL) { p=p->next; printf("┃%-6.6s┃%-10.10s┃%-10.10s┃%-10.10s┃%-12.12s┃%-6.6s┃%.2f \n",p->loginnum,p->bookname,p->author,p->publisher,p->pbtime,p->classfy,p->price); /*循环输出表格*/ } printf("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n"); printf("\n"); } void DeleteDoc(struct books_list * HEAD) { struct books_list *s,*p; char t[80]; int panduan,i; panduan=0; p=s=HEAD; printf(" [请输入您要删除的书名]:"); scanf("%s",t); while(p!= NULL) { if(strcmp(p->bookname,t)==0) { panduan++; break; } p=p->next; } if(panduan==1) { for(;s->next!=p;) { s=s->next; } s->next=p->next; free(p); printf("\n ━━━━ 删除成功! ━━━━\n"); } else { printf(" 您输入的书目不存在,请确认后输入!\n"); } return; } int main() { struct books_list * HEAD; char
3月前
回答
更专业一些
这段代码是一个简单的图书管理系统,使用C语言编写。它包含了链表数据结构来存储图书信息,以及一些基本的图书管理功能,如添加、搜索、打印和删除图书信息。下面是对代码的详细解释:
-
结构体定义:
struct books_list
定义了一个图书信息的结构体,包含作者、书名、出版社、出版时间、登录号、价格和分类号等字段,以及一个指向下一个图书节点的指针。 -
创建链表头节点:
Create_Books_Doc
函数用于创建链表的头节点,并分配内存。头节点不存储图书信息,只作为链表的起始点。 -
保存图书数据到文件:
save
函数将图书信息以表格形式写入到 "my.txt" 文件中。它首先打开文件,然后遍历链表,将每个图书的信息格式化后写入文件。 -
插入图书信息:
InsertDoc
函数允许用户输入新的图书信息,并将其添加到链表的末尾。用户可以连续添加多本图书,每次添加后都会询问用户是否继续添加。最后,调用save
函数保存数据到文件。 -
搜索图书:
search_book
函数通过书名来搜索图书,并打印出匹配的图书信息。如果链表为空或未找到图书,会给出相应的提示。 -
打印图书列表:
Print_Book_Doc
函数遍历链表,打印出所有图书的详细信息,以表格形式展示。 -
删除图书信息:
DeleteDoc
函数允许用户根据书名删除链表中的图书信息。如果找到要删除的图书,则从链表中移除该节点,并释放内存。 -
主函数:
main
函数是程序的入口点,但在您提供的代码片段中,main
函数不完整,没有展示如何使用上述定义的函数。
代码中存在一些需要注意的地方:
- 使用
fflush(stdin)
来清除输入缓冲区,但这在标准C库中是未定义行为,建议使用其他方法来处理。 - 在
DeleteDoc
函数中,删除操作没有正确处理头结点的删除情况,如果第一个节点就是要删除的节点,当前的实现会导致链表断裂。 - 在
InsertDoc
函数中,每次插入后都调用save
函数保存数据到文件,这可能会导致不必要的文件写操作,可以考虑在退出插入功能时再保存一次。
此外,代码中没有提供用户界面或交互逻辑,例如菜单选项让用户选择添加、搜索、打印或删除图书。这需要在 main
函数中实现。
研究模式展开阅读更多资料、详细回答