YYDS啊 2022-12-23 11:32 采纳率: 33.3%
浏览 42
已结题

C++使用链表,无法正常修改记事本文件

想通过链表存取记事本文件并且能对记事本文件进行 增删,修改等操作,读文件时是正常的,但是不能对记事本中的内容进行改动。

#include <stdio.h>
#include <malloc.h>
#include <string.h>
struct Book                //声明结构体 
{
 int   num;            /*编号*/
  char  cla[10];          /*分类名*/
  char name[15];          /*书名*/
  char author[8];       /*作者名*/
  char  company[20];      /*出版单位*/
  int   count;            /*数量*/ 
  float price;        /*价格*/
};

 typedef struct Book DataType;        //结构体变量 
 typedef struct     LNode
{
  DataType data;            //数据域 
  struct LNode *next;        //指针域 
 }LinkList; //结构体类型 
 LinkList *head;        //链表头指针 
 
 
 void DispList(LinkList *head);        //初始化 
 LinkList*InitList()
 {
  head=(LinkList*)malloc(sizeof(LinkList));
  head->next=NULL;        //头指针置空 
  return head;
 }
 


img

  • 写回答

1条回答 默认 最新

  • 浪客 2022-12-23 12:17
    关注

    修改了下

    #include <stdio.h>
    #include <malloc.h>
    #include <string.h>
    struct Book // 声明结构体
    {
        int num;          /*编号*/
        char cla[10];     /*分类名*/
        char name[15];    /*书名*/
        char author[8];   /*作者名*/
        char company[20]; /*出版单位*/
        int count;        /*数量*/
        float price;      /*价格*/
    };
    typedef struct Book DataType; // 结构体变量
    typedef struct LNode
    {
        DataType data;      // 数据域
        struct LNode *next; // 指针域
    } LinkList;             // 结构体类型
    LinkList *head;         // 链表头指针
    
    // 初始化
    LinkList *InitList()
    {
        head = (LinkList *)malloc(sizeof(LinkList));
        head->next = NULL; // 头指针置空
        return head;
    }
    
    void DispList(LinkList *head)
    {
        LinkList *s = head->next;
    
        // printf("\n 编号 分类\t  书名\t     \t 作者       \t出版社   \t数量   \t\t价格\n");
        printf("%-4s %-12s %-18s %-10s %-20s %-10s %-6s\n", "编号", "分类", "书名", "作者", "出版社", "数量", "价格");
    
        while (s)
        {
            printf("%-4d %-12s %-18s %-10s %-20s %-10d %-6.2f\n", s->data.num, s->data.cla, s->data.name, s->data.author, s->data.company, s->data.count, s->data.price);
            s = s->next;
        }
    }
    
    void ReadFile() // 读取文件
    {
        FILE *fp; // 指向文件的指针
        // int i=0;
        LinkList *s, *last; // 声明指针变量 Books,
        last = head;        // 令两节点地址相同
        if ((fp = fopen("jk62107_08_bk.txt", "r+")) == NULL)
        {
            printf("找不到此文件再试试!!!!\n");
            return;
        }
    
        char buf[100];
        fgets(buf, 100, fp); // 读入第一行
    
        while (!feof(fp))
        {
            s = (LinkList *)malloc(sizeof(LinkList)); // 分配内存空间
            fscanf(fp, "%d %s %s %s %s %d %f\n", &s->data.num, s->data.cla, s->data.name, s->data.author, s->data.company, &s->data.count, &s->data.price);
    
            s->next = NULL;    // s的下一节点置空
            last->next = s;    // 节点的指针域存放s节点的地址
            last = last->next; // s
        }
        printf("\n\n文件读取成功\n\n");
        fclose(fp);
        DispList(head); // 显示文件内容
    }
    
    void Searchname() // 按书名查找图书
    {
        int flag = 0; // 标记变量的初值
        char name[15];
        LinkList Books, *s, *p; // 定义指针变量
        printf("\n请输入需要查询的书名:");
        scanf("%s", name);
        printf("\n\t\t*+*+*+*+*+*+*+*+*+以下是您查找的信息*+*+*+*+*+*+*+*+*+");
        p = head->next; // p指向首元节点
        while (p != NULL)
        {
            if (strcmp(p->data.name, name) == 0) // 查找符合的图书
            {
                printf("\n\t编号:%-10d", p->data.num);
                printf("\n\t书名:%-20s", p->data.name);
                printf("\n\t作者名:%-20s", p->data.author);
                printf("\n\t分类名:%-10s", p->data.cla);
                printf("\n\t出版单位:%-20s", p->data.company);
                printf("\n\t数量:%-20d", p->data.count);
                printf("\n\t价格:%.2f", p->data.price);
                flag = 1; // 找到标记变量设为1
                // p = p->next; // 指针走到下一个节点
            }
    
            p = p->next;
        }
        if (flag == 0)
            printf("\n\t\t没有相同书名");
        getchar();
    }
    void Searchauthor() // 按作者名查找图书
    {
        int flag = 0;
        char author[10];
        LinkList Books, *s, *p;
        printf("\n请输入需要查询的作者名:");
        scanf("%s", author);
        printf("\n\t\t*+*+*+*+*+*+*+*+*+以下是您查找的信息*+*+*+*+*+*+*+*+*+");
        p = head->next;
        while (p != NULL) // 查找符合的图书
        {
            if (strcmp(p->data.author, author) == 0) /*找到图书显示信息*/
            {
                printf("\n\t编号:%-10d", p->data.num);
                printf("\n\t书名:%-20s", p->data.name);
                printf("\n\t作者名:%-20s", p->data.author);
                printf("\n\t分类名:%-10s", p->data.cla);
                printf("\n\t出版单位:%-20s", p->data.company);
                printf("\n\t数量:%-20d", p->data.count);
                printf("\n\t价格:%-10.2f", p->data.price);
                flag = 1;
            }
            p = p->next;
        }
        if (flag == 0)
            printf("\n\t\t没有相同作者名");
        getchar();
    }
    void Insert()
    {
        LinkList *p, *q;                          // 定义指向结构体的指针
        p = (LinkList *)malloc(sizeof(LinkList)); // 为结构体开辟空间
        if (p == NULL)
        {
            printf("malloc failed!\n");
            getchar();
            return;
        }
        printf("\n插入信息:\n");
        printf("请输入编号:");
        scanf("%d", &p->data.num);
        printf("请输入书名:");
        scanf("%s", p->data.name);
        printf("请输入作者:");
        scanf("%s", p->data.author);
        printf("请输入分类名:");
        scanf("%s", p->data.cla);
        printf("请输入出版社:");
        scanf("%s", p->data.company);
        printf("请输入数量:");
        scanf("%d", &p->data.count);
        printf("请输入价格:");
        scanf("%f", &p->data.price); //
        p->next = NULL;              // 将指针域置为空
    
        // if (head->next == NULL)      // 判断是否是第一次添加
        // {
        //     head->next = p; // 是,让头指针指向p
        // }
        // else // 否,让尾指针指向p
        // {
    
        // head已被初始化,不可能为NULL
        q = head;               // q指向头节点
        while (q->next != NULL) // 找到尾节点
        {
            q = q->next;
        }
        q->next = p; // 将尾节点指向p
        //}
        printf("插入成功!\n");
        getchar();
    }
    
    void Save() /*以文本文件形式保存的函数*/
    {
        FILE *fp;
        LinkList *p; //, *s
        // char file[20]; 用来存放文件保存路径以及文件名
        /*printf("请输入文件路径及文件名:");
        scanf("%s", file);
        */
        if ((fp = fopen("jk62107_08_bk.txt", "w+")) == NULL) /*判断能否打开文件*/
        {
            printf("不能打开文件!\n");
            return;
        }
        fprintf(fp, "编号 分类\t  书名\t     \t 作者       \t出版社   \t数量   \t\t价格\n");
        p = head->next;
        while (p != NULL) //
        {
            fprintf(fp, " %d   %s\t %s\t %s        %s\t  %d\t  \t%f\n", p->data.num, p->data.cla, p->data.name, p->data.author, p->data.company, p->data.count, p->data.price); // 将数据写入文件
    
            p = p->next; /*下移一个结点*/
        }
        fclose(fp); // 写入完成,关闭文件
        printf("文件已经保存!\n");
        return;
    }
    
    int main()
    {
        InitList();
        ReadFile();
        Searchname();
        Searchauthor();
        Insert();
        Save();
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月23日
  • 已采纳回答 12月23日
  • 修改了问题 12月23日
  • 修改了问题 12月23日
  • 展开全部

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。