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

修改了下

#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;
}