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

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 微信小程序 用oss下载 aliyun-oss-sdk-6.18.0.min client报错
  • ¥15 ArcGIS批量裁剪
  • ¥15 labview程序设计
  • ¥15 为什么在配置Linux系统的时候执行脚本总是出现E: Failed to fetch http:L/cn.archive.ubuntu.com
  • ¥15 Cloudreve保存用户组存储空间大小时报错
  • ¥15 伪标签为什么不能作为弱监督语义分割的结果?
  • ¥15 编一个判断一个区间范围内的数字的个位数的立方和是否等于其本身的程序在输入第1组数据后卡住了(语言-c语言)
  • ¥15 Mac版Fiddler Everywhere4.0.1提示强制更新
  • ¥15 android 集成sentry上报时报错。
  • ¥15 抖音看过的视频,缓存在哪个文件