各位同志,我的图书管理系统为什么无法同时储存两个图书及以上的信息啊
#include "stdio.h"
#include "string.h"
#include "ctype.h"
#include "stdlib.h"
/*结构体定义Book,将名字、作者、出版社、ISBN号、价格定义成数组并储存进去 */
typedef struct Book {
char name[50];
char author[20];
char press[30];
char ISBN[20];
float price;
struct Book* next;/*定义下一本书的后继结点,用于构建单链表*/
}Book;/*结构体变量*/
Book* head=NULL;/*头结点,全局变量*/
/*1实现插入函数*/
void insert()
{
/*动态分配内存*/
Book *p = (Book*) malloc(sizeof(Book));
/*记录插入书籍的信息*/
printf("请输入书名:\n"); scanf_s("%s", p->name,50);
printf("请输入作者名:\n"); scanf_s("%s", p->author,20);
printf("请输入出版社:\n"); scanf_s("%s", p->press,30);
printf("请输入ISBN号:\n"); scanf_s("%s", p->ISBN,20);
printf("请输入价格:"); scanf_s("%f", &p->price);
/*插入后续结点*/
p->next = head->next;
head->next= p;
}
/*2实现查询函数*/
void search()
{
char word[50];
printf("请输入关键字:");
scanf_s("%s", word,50);
Book* p=head->next;
while (p!= NULL)
{
/*查询关键步骤,运用程序strcmp比较实现查找*/
if (strcmp(p->name, word) == 0 || strcmp(p->author, word) == 0 || strcmp(p->ISBN, word) == 0)
{
printf("%s %s %s %s %f\n", p->name, p->author, p->press, p->ISBN, p->price);
}
p= p->next;/*及时填空,终止while语句*/
return 0;
}
printf("未找到此图书\n");
}
/*3实现删除函数*/
void delete()
{
char ISBN[20];
printf("请输入ISBN号:"); scanf_s("%s", ISBN,20);
Book* p = head->next; Book* previous=head;/*记录前一个结点,便于删除*/
while (p != NULL)
{
if (strcmp(p->ISBN, ISBN) == 0)/*一个为结构体中的ISBN,一个是该函数定义的数组*/
{
head->next = p->next;
free(p);
printf("删除成功!\n");
return 0;
}
previous= p;
p = p->next;
}
printf("未找到对应图书信息!\n");
}
/*4实现修改函数*/
void modify()
{
char ISBN[20];
printf("请输入ISBN号:"); scanf_s("%s", ISBN,20);
Book* p = head->next;
while (p != NULL)
{
if (strcmp(p->ISBN, ISBN) == 0)
{
printf("请输入书名:"); scanf_s("%s", p->name,50);
printf("请输入作者名:"); scanf_s("%s", p->author,20);
printf("请输入出版社:"); scanf_s("%s", p->press,30);
printf("请输入价格:"); scanf_s("%f", &p->price);
printf("修改成功!\n");
return 0;
}
p = p->next;
}
printf("未找到对应图书信息!\n");
}
/*主函数*/
int main()
{
head = (Book*)malloc(sizeof(Book));/*创建头结点*/
head->next = NULL;
int choice;
do
{
printf("====图书管理系统====\n");
printf("1.插入新的图书信息\n");
printf("2.查询图书信息\n");
printf("3.删除图书信息\n");
printf("4.修改图书信息\n");
printf("0.退出系统\n");
printf("请输入您的选择:\n");
scanf_s("%d", &choice);
/*操作系统程序*/
switch (choice)
{
case 1:insert(); break;
case 2:search(); break;
case 3:delete(); break;
case 4:modify(); break;
case 0:printf("欢迎再次使用!\n");
break;
default:printf("输入有误,请重新输入!\n"); break;
}
}
while (choice != 0);
return 0;
}
这里有问题:
p->next = head->next; // head初始为null
head->next= p; //赋值不成功
插入节点可以分两种方式,1新节点放链尾:
Book* tail=NULL; /*尾节点指针*/
if (head==NULL)
{
head=p;
tail=p;
}
else
{
tail->next=p;
tail=p;
}
2新节点放链首
p->next=head;
head=p;
为了完成本关任务,你需要掌握: 1.字符串的存储; 2.一维字符数组; 3.字符串处理函数gets,strlen,puts等; 4.数字的ASCII码值; 5.字符串结束标志‘\0’; 6.有序字符串重组的算法。
解决方案:
这个问题可能是由于图书信息储存在相同的位置中引起的。建议在你的代码中检查储存图书信息的方式,确保每本书的信息都被正确地储存。具体来说,你需要正确设置索引和键值对,以便能够储存多本图书的信息而不是覆盖掉之前的信息。如果你不清楚怎样实现,建议参考一些流行的数据存储库和图书管理系统的例子,如MySQL, MongoDB等。这些库和系统中都有储存多个记录的示例代码,可以学习和借鉴。如果你在实践中遇到了具体的问题,可以善用调试工具,逐一分析代码中的细节并梳理出错误。同时,建议增加一些日志记录的功能,以便能够更方便地追踪问题的源头。例如,你可以写一个简单的日志文件,其中记录每次储存信息的操作,在出现问题时通过分析日志来定位问题。最后,建议优化代码的性能,例如通过一个优化后的数据结构或者算法来提高图书信息储存和检索的效率,以便满足日益增长的图书信息数量和更快速的检索要求。