无何不可v 2022-01-07 14:26 采纳率: 0%
浏览 38

怎么把文件中的信息读入链表

问题遇到的现象和发生背景

需要实现查询功能

问题相关代码,请勿粘贴截图
#include<stdio.h>                                                                                  
#include<stdlib.h> 
#include<string.h>
typedef struct BOOKSTORE
{
    char title[100];//书名 
    char author[100];//作者 
    char press[100];//出版社 
    float date;//出版日期 
    float price;//价格 
    int count;//数量 
    int position;//清单位置
    struct BOOKSTORE *next;
}shudian;
shudian *head;
FILE *fp;  
shudian *fd() //创建信息 
{    
    int a;
    shudian *p=NULL,*pr=NULL; //定义指针变量 
    pr=head=(shudian *)malloc(sizeof(shudian)); //申请内存 
    head->next=NULL;
    while(1)
    {
        p=(shudian*)malloc(sizeof (shudian)); 
        printf("请输入书籍的以下信息:\n"); 
        printf("书名:\n");
        scanf("%s",&p->title);
        printf("作者:\n");
        scanf("%s",&p->author);
        printf("出版社:\n"); 
        scanf("%s",&p->press);
        printf("出版日期:\n");
        scanf("%f",&p->date); 
        printf("价格:\n");
        scanf("%f",&p->price);
        printf("库存:\n");
        scanf("%d",&p->count);
        printf("清单位置:\n");
        scanf("%d",&p->position);
        printf("\n");
        pr->next=p;
        pr=p;
        printf("是否继续创建书籍信息? 否:输1 继续: 输2\n");
        scanf("%d",&a);
        if(a==1)
        {
            pr->next=NULL;
            p=NULL;   //return head;
            break;
        }
        printf("\n");
        if(a>2)
        {
            printf("输入错误!\n");
            system("pause");
        } 
    }
    pr->next=NULL;   // free(p);
    p=NULL;
    return head;
}
void save(shudian *head)
{
   shudian*p,*p1;
   p=head->next;
   FILE *fp;
   fp=fopen("sbooks.txt","a");
   if(fp==NULL) {
         printf("文件保存失败!");
        return ; }
   if(p==NULL) {
   printf("链表为空!"); 
   return; }
   p=head->next;
   while(p!=NULL)
   {
   fprintf(fp,"%s %s %s %f %f %d %d \n",p->title,p->author,p->press,p->date,p->price,p->count,p->position);
   p=p->next;
   }
   fclose(fp);
   printf("信息保存成功!\n");
   return ;
}
void find(shudian *head)//查询信息 
{     
    shudian *p=NULL;
    int n,i=0;
    char name1[100],bookname[100];
    printf("\t\t 请选择方式查找书籍信息: \n");
    printf("\t\t 1.通过书名查找 2.通过作者查找\n"); //两种方式查询
    p=head->next; 
    if(p==NULL)
    {
        printf("暂无书籍信息!\n");
    }
    printf("请输入您的选择: 1 或 2 \n");
    scanf("%d",&n);
    if(n==1) 
    {
        printf("请输入书名:\n");
        scanf("%s",bookname);
        while(p!=NULL) 
        {
            if(bookname==p->title) 
            {
                printf("成功找到此书信息!\n");
                printf("此书的信息如下:\n");
                printf("书名:%s\n",p->title);
                printf("作者:%s\n",p->author);
                printf("出版社:%s\n",p->press);
                printf("出版日期:%f\n",p->date);
                printf("价格:%f\n",p->price);
                printf("库存:%d\n",p->count);
                printf("清单位置:%d\n",p->position);
                i=1;
                printf("请输入需要购买的数量:\n");
                int b;
                scanf("%d",&b);
                if(b<=p->count)
                {
                    printf("总价为%.2f",b*p->count);break;
                }
                else
                {
                    printf("库存不足!\n");
                    break;
                }    
            }                                                                   
            p=p->next; 
            if(i==0)
            {
            printf("未查找到此书信息!\n");
            }
        }
    }
    else if(n==2) 
    {
        printf("请输入作者:\n");
        scanf("%s",&name1);
        while(p!=NULL) 
        {
            if(strcmp(p->author,name1)==0) 
            {
                printf("成功找到此书信息!\n");
                printf("此书的信息如下:\n");
                printf("书名:%s\n",p->title);
                printf("作者:%s\n",p->author);
                printf("出版社:%s\n",p->press);
                printf("出版日期:%f\n",p->date);
                printf("价格:%f\n",p->price);
                printf("库存:%d\n",p->count);
                printf("清单位置:%d\n",p->position);
                i=1;
                break;
            }
            p=p->next;
            if(i==0)
            {
            printf("未查找到此书信息!\n");
            }
        }
    }
    else 
        {
        printf("操作有误!\n");
        find(head);
        }
}
void add(shudian *head) //添加信息 
{
    int n;
    FILE *fp;
    fp=fopen("sbooks.txt","a");
    shudian *p=NULL,*p1=NULL;
    p=head->next;
    while(p->next!=NULL)
    {
        p=p->next; 
    }
   while(1)
    {
    p1=(shudian*)malloc(sizeof(shudian));
    printf("请输入你所想添加的信息:\n");
    printf("书名:\n");
    scanf("%s",&p1->title);
    printf("作者:\n");
    scanf("%s",&p1->author);
    printf("出版社:\n");
    scanf("%s",&p1->press);
    printf("出版日期:\n");
    scanf("%f",&p1->date); 
    printf("价格:\n");
    scanf("%f",&p1->price);
    printf("库存:\n");
    scanf("%d",&p1->count);
    printf("清单位置:\n");
    scanf("%d",&p1->position);
    p->next=p1;
    p=p1;
    p1->next=NULL; 
    save(head);
    break; 
    }  
}

void dele(shudian *head) //删除信息 
{
    int i=0; 
    shudian *p=NULL,*pr=NULL;
    char name4[100];
    pr=head;
    p=head->next; 
    if(p==NULL)
    {
        printf("没有书籍信息!\n");
    }
    printf("请输入要删除的书籍书名:\n");
    scanf("%s",&name4);
    while(p!=NULL) 
    { 
        if(strcmp(p->title,name4)==0)//比较 
        {
            pr->next=p->next;
            free(p);
            p=NULL;
            printf("已将该书籍信息删除!\n");
            i=1;
            save(head);
            break;
        }
        pr=p;
        p=p->next;    
    }
    if(i==0)
    printf("未找到需要删除书籍信息!\n");
}

void menu()  //目录 
{  
    printf("1.录入书籍\n");
    printf("2.添加书籍\n"); 
    printf("3.查询/购买书籍\n");
    printf("4.删除书籍\n");
    printf("5.退出系统\n") ;
    printf("请输入相关选项 :"); 
    int ch;
    scanf("%d",&ch);
    switch(ch)
    {   
        case 1:head=fd();save(head);break;
        case 2:add(head);break;
        case 3:find(head);break;
        case 4:dele(head);break;
        case 5:printf("欢迎下次使用!\n");break; 
        default: printf("操作错误!\n");
    }
}
int main()  //主函数 
{  
    FILE *fp;
    
    menu();
    int ch;
    scanf("%d",&ch);
    save(head);
    printf("是否退出系统:1,否 2.是\n");
    int m;
    scanf("%d",&m);
    if(m==1)
    {
        menu();
    }
    if(m==2)
    {  
        printf("欢迎下次使用!");
        return 0;
    } 
}


运行结果及报错内容

不能进行除添加以外的功能

我想要达到的结果

能够直接进行查询功能

  • 写回答

3条回答 默认 最新

  • CSDN专家-link 2022-01-07 14:46
    关注

    105行应该用strcmp进行字符串相等判断

    评论

报告相同问题?

问题事件

  • 创建了问题 1月7日

悬赏问题

  • ¥15 使用MATLAB进行余弦相似度计算加速
  • ¥15 服务器安装php5.6版本
  • ¥15 我想用51单片机和数码管做一个从0开始的计数表 我写了一串代码 但是放到单片机里面数码管只闪烁一下然后熄灭
  • ¥20 系统工程中,状态空间模型中状态方程的应用。请猛男来完整讲一下下面所有问题
  • ¥15 我想在WPF的Model Code中获取ViewModel Code中的一个参数
  • ¥15 arcgis处理土地利用道路 建筑 林地分类
  • ¥20 使用visual studio 工具用C++语音,调用openslsx库读取excel文件的sheet问题
  • ¥100 寻会做云闪付tn转h5支付链接的技术
  • ¥15 DockerSwarm跨节点无法访问问题
  • ¥15 使用dify通过OpenAI 的API keys添加OpenAI模型时报了“Connection Error”错误