C语言,我明明把单链表的某个节点删除了,但单链表写入文件时还是会写入一些奇怪的东西?

图片说明

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct book
{
    long number;//ISBN
    char name[30];//书名 
    char auther[30];//作者
    char press[30];//出版社 
    float price;//价格 
    int exist;//库存 
    struct book *next;
}BOOK;
//初始化模块 
void Init(BOOK *&b)
{
    b=(BOOK *)malloc(sizeof(BOOK));
    //b->exist=0;
    b->next=NULL;
}
//查找模块 
//按ISBN查找 
void Search_number(BOOK *b,long number)//按ISBN查找 
{
    BOOK *p=b->next;
    while(p)
    {
        if(p->number!=number)
            p=p->next;
        else
            break;
    }
    if(p&&number==p->number)
    {
        printf("您所查找的ISBN为%ld的图书信息如下:\n",number);
        printf("ISBN\t书名\t\t作者名\t\t出版社名\t价格\t库存\n");
        printf("%ld\t%s\t\t%s\t\t%s\t\t%.2f\t%d\n",p->number,p->name,p->auther,p->press,p->price,p->exist);
    }
    if(!p)
        printf("没有找到ISBN为%ld的书籍!\n",number);
}
//按书名查找
void Search_name(BOOK *b,char *name)//按书名查找 
{
    BOOK *p=b->next;
    while(p)
    {
        if((strcmp(p->name,name)>0||strcmp(p->name,name)<0))
            p=p->next;
        else
            break;
    }
    if(p&&strcmp(p->name,name)==0)
    {
        printf("您所查找的书《%s》信息如下:\n",name);
        printf("ISBN\t书名\t\t作者名\t\t出版社名\t价格\t库存\n");
        printf("%ld\t%s\t\t%s\t\t%s\t\t%.2f\t%d\n",p->number,p->name,p->auther,p->press,p->price,p->exist);
    }
    else
        printf("没有找到书名为《%s》的书籍!\n",name);
}
//图书增加模块 
void Add(BOOK *&b)
{
    int flag=0;
    long number;
    BOOK *p=b->next,*q=b,*s;
    printf("\n请输入ISBN:");
    scanf("%ld",&number);
    while(p)
    {
        if(p->number==number)
        {
            printf("\n您所输入图书已存在,请选择操作:\n");
            while(1)
            {
                printf("**********    请选择       ****\n");
                printf("**********    1.入库        ****\n"); 
                printf("**********    2.退出当前界面  ****\n"); 
                printf("请输入:");
                int y;
                scanf("%d",&y);
                if(y==1)
                {
                    printf("\n请输入入库数量:");
                    int num;
                    while(1)
                    {
                        scanf("%d",&num);
                        if(num<=0)
                            printf("\n输入错误,请重新输入!");
                        if(num>0)
                            break;
                    }
                    p->exist+=num;
                    printf("入库成功!\n");
                    break;
                }
                else if(y==2)
                    break;
                else
                    printf("\n输入错误,请重新输入!"); 
            }
            flag=1;
            break;
        }
        q=p;
        p=q->next;
    }
    if(flag==0)
    {
        s=(BOOK *)malloc(sizeof(BOOK));
        s->number=number;
        printf("\n请输入书名:");
        scanf("%s",s->name);
        printf("\n请输入作者名:");
        scanf("%s",s->auther);
        printf("\n请输入出版社名:");
        scanf("%s",s->press);
        printf("\n请输入价格:");
        scanf("%f",&s->price);
        printf("\n请输入入库图书数量:"); 
        scanf("%d",&s->exist); 
        printf("\n");
        q->next=s;
        s->next=NULL;
        printf("图书增加完成!\n");
    }
}
//图书更新模块 
void Update(BOOK *&b)
{
    int flag=0;
    long number;
    BOOK *p=b->next,*q=b,*s;
    printf("\n请输入要更新的图书的ISBN:");
    scanf("%ld",&number);
    while(p)
    {
        if(p->number==number)
        {
            printf("已找到该图书,请选择操作:\n");
            for(int i=0;;i++)
            {
                printf("         @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
                printf("         !            请选择                   !\n");
                printf("         !          1.价格变更                 !\n");
                printf("         !          2.出版社变更               !\n");
                printf("         !          3.库存变更                 !\n");
                printf("         !          4.退出当前界面             !\n");
                printf("         @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
                printf("请输入:");
                int k;
                scanf("%d",&k);
                if(k==1)
                {
                    float price;
                    printf("\n请输入更新后的价格:");
                    scanf("%f",&price);
                    if(price<=0)
                        printf("\n输入错误,请重新输入!\n");
                    else
                    {
                        p->price=price;
                        printf("图书信息更新成功!\n");
                    }
                }
                else if(k==2)
                {
                    char press[30];
                    printf("\n请输入更新后的出版社:"); 
                    scanf("%s",press);
                    strcpy(p->press,press);
                    printf("图书信息更新成功!\n");
                }
                else if(k==3)
                {
                    int exist;
                    printf("\n请输入更新后的库存:"); 
                    scanf("%d",&exist);
                    if(exist==0)
                    {
                        q->next=p->next;
                        free(p);
                    }
                    if(exist<0)
                        printf("\n输入错误,请重新输入!\n");
                    if(exist>0)
                    {
                        p->exist=exist;
                        printf("图书信息更新成功!\n");
                    } 
                }
                else if(k==4)
                    break;
                else
                    printf("\n输入错误,请重新输入!\n");
            } 
            flag=1;
            break;
        }
        q=p;
        p=q->next;
    }
    if(flag==0)
    {
        printf("查无此书,是否将此书入库(y/n):");
        char ch;
        scanf(" %c",&ch);
        if(ch=='y')
        {
            s=(BOOK *)malloc(sizeof(BOOK));
            s->number=number;
            printf("请输入书名:");
            scanf("%s",s->name);
            printf("\n请输入作者名:");
            scanf("%s",s->auther);
            printf("\n请输入出版社名:");
            scanf("%s",s->press);
            printf("\n请输入价格:");
            scanf("%f",&s->price);
            printf("\n请输入入库图书数量:"); 
            scanf("%d",&s->exist); 
            printf("\n");
            s->next=NULL;
            q->next=s;
            printf("图书入库完成!\n");
        }
    }
}
//图书删除模块
void DelBook(BOOK *&b)
{
    long number;
    printf("\n请输入要删除图书的ISBN:");
    scanf("%ld",&number);
    BOOK *p=b,*q=b->next;
    while(q)//查找要删除节点
    {
        if(q->number!=number)
        {
            p=q;
            q=p->next;
        }
        else
            break;
    }
    if(q&&number==q->number)
    {
        int num;
        printf("该图书当前库存为:%d,请输入要减少的数量:",q->exist);
        while(1)
        {
            scanf("%d",&num);
            if(num<=0||num>q->exist)
                printf("输入错误,请再次输入要减少的数量:");
            if(0<num&&num<=q->exist)
                break;
        }
        if(q->exist>num)
            q->exist-=num;
        else if(q->exist==num)
        {
            //if(!q->next)
                //p->next=NULL;
            //else
                p->next=q->next;
            free(q);
        }
        printf("\n删除成功!\n");
    }
    else
    {
        printf("没有该图书,无法删除!\n");
        return;
    }
}
//删除单链表
void Del(BOOK *&b) 
{
    BOOK *pre=b,*p=b->next;
    while(p!=NULL)
    {
        free(pre);
        pre=p;
        p=pre->next;
    }
    free(pre);
}
//向book.txt写入数据 
void WriteBook(BOOK *b)
{
    BOOK *p=b->next;
    if(!p)
    {
        printf("当前链表为空,即将清空文件数据...\n");
        /*当链表为空时,以写
        的方式清空文件!*/ 
        FILE *fp;
        fp=fopen("book.txt","w");
        fclose(fp);
        printf("\n文件清空成功!\n");
        return;
    }
    else
    {
        FILE *fp;
        if((fp=fopen("book.txt","w"))==NULL)
        {
            printf("文件打开失败!\n");
            return;
        }
        fprintf(fp,"ISBN\t书名\t作者\t出版社\t价格\t库存\n");
        while(p)
        {
            fprintf(fp,"%ld\t%s\t%s\t%s\t%.2f\t%d\n",p->number,p->name,p->auther,p->press,p->price,p->exist);
            printf("%ld\t%s\t%s\t%s\t%.2f\t%d\n",p->number,p->name,p->auther,p->press,p->price,p->exist);
            printf("乱码:%d\n",p->number);
            p=p->next;
        }
        //fprintf(fp,"%ld\t%s\t%s\t%s\t%.2f\t%d\n",p->number,p->name,p->auther,p->press,p->price,p->exist);
        printf("书籍存储成功!\n");
        fclose(fp);
    }
}
//从book.txt读取图书信息
BOOK *ReadBook()
{
    FILE *fp;
    BOOK *head,*p,*q;
    Init(head);
    if((fp=fopen("book.txt","r"))==NULL)
    {
        printf("文件打开失败!\n");
        return head; 
    }
    else
    {
        fgetc(fp);
        if(!feof(fp))
        {
            char str[1000];
            rewind(fp);
            fgets(str,sizeof(str),fp);
            //printf("\n%s\n",str);
            p=(BOOK *)malloc(sizeof(BOOK));
            fscanf(fp,"%ld%s%s%s%f%d",&p->number,p->name,p->auther,p->press,&p->price,&p->exist);
            p->next=NULL;
            head->next=p;
        }
        while(!feof(fp))
        {
            q=(BOOK *)malloc(sizeof(BOOK));
            fscanf(fp,"%ld%s%s%s%f%d",&q->number,q->name,q->auther,q->press,&q->price,&q->exist);
            q->next=NULL;
            p->next=q;
            p=p->next;
            //q->next=NULL;
        }
        printf("\n书籍信息获取成功!\n");
        fclose(fp);
        return head;
    }
}
//菜单
void menu(BOOK *&b)
{
    while(1)
    {
        int x,y;
        printf("                  小型书店图书信息管理系统  \n");
        printf("         @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
        printf("         !             主菜单                  !\n");
        printf("         !          1.查询图书信息             !\n");
        printf("         !          2.图书信息增加             !\n");
        printf("         !          3.图书信息更新             !\n");
        printf("         !          4.图书信息删除             !\n");
        printf("         !          5.退出程序                 !\n");
        printf("         @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
        printf("请输入:");
        scanf("%d",&x);
        if(x==1)
        {
            printf("\n请输入查找方法\n");
            printf("1.按ISBN查找\n2.按书名查找\n");
            printf("请输入:");
            scanf("%d",&y);
            if(y==1)
            {
                long number;
                printf("请输入要查找书籍的ISBN:");
                scanf("%ld",&number);
                Search_number(b,number);
            }
            else if(y==2)
            {
                char *name;
                printf("请输入要查找书籍的书名:");
                scanf("%s",name);
                Search_name(b,name);
            }
            else
                printf("输入错误!\n");
        }
        else if(x==2)
            Add(b);
        else if(x==3)
            Update(b);
        else if(x==4)
            DelBook(b);
        else if(x==5)
            return;
        else
            printf("\n输入错误,请重新输入!\n");
    }
}
//主函数 
int main()
{
    BOOK *b;
    b=ReadBook();
    menu(b);
    WriteBook(b);
    Del(b);
    return 0;
}

1个回答

后台相关数据得一起删了啊

qq_43465781
※ᝰ 怎么个删法?求解
8 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问