c语言小超市管理系统

小超市管理系统
创建完商品档案进行其他功能时,文件里的数据变成乱码...

```c
#include
#include
#include
#include
#define MAXSIZE 50
#define SIZESG sizeof(struct Goods)
#define SIZEJD sizeof(struct Jd)

struct Goods
{
    char id[20];/*编号*/
    char name[20];/*品名*/
    double purchase_price;/*进价*/
    double selling_price;/*售价*/
    int purchase_quantity;/*进货量*/
    int sales_volume;/*销售量*/
    double amount;/*销售额*/
    int remaining_quantity;/*剩余数*/
    double gross_profit;/*毛利*/
};
struct Jd
{
    struct Goods goods;
    struct Jd *next;
};


void menu();/*菜单*/
void createFile(char *FName);/*创建文件,存放结构体数据*/
struct Jd *createchain(char *FName);/*利用文件创建链表*/
void edit(struct Jd *head);/*修改商品信息*/
void del(struct Jd *head);/*删除原有商品*/
void purchase(struct Jd *head);/*处理原有商品的新进货量*/
void sales(struct Jd *head);/*处理原有商品的新销售量*/
void baofei(struct Jd *head);/*处理原有商品的报废量*/
void sale(struct Jd *head);/*统计销售情况*/
void namechaxun(struct Jd *head);/*根据商品品名查询*/
void shuchaxun(struct Jd *head);/*根据剩余数查询*/
void xianshi(struct Jd *head);/*按原有顺序显示*/
void amountxianshi(struct Jd *head);/*销售额*/
void profitxianshi(struct Jd *head);/*毛利*/
void WriteToFile(struct Jd *head,char *FName);/*数据写入文件*/


int main()
{
    struct Jd *head=NULL;
    char FileName[128]={'\0'};
    strcpy(FileName,"data.txt");
    int i;
    while(1)
    {
        menu();
        scanf("%d",&i);
        switch(i)
        {
        case 0:
            system("cls");
            printf("已退出系统!");
            exit(0);
        case 1:
            system("cls");
            createFile(FileName);
            break;
        case 2:
            system("cls");
            head=createchain(FileName);
            edit(head);
            WriteToFile(head,FileName);
            break;
        case 3:
            system("cls");
            head=createchain(FileName);
            del(head);
            WriteToFile(head,FileName);
            break;
        case 4:
            system("cls");
            head=createchain(FileName);
            purchase(head);
            WriteToFile(head,FileName);
            break;
        case 5:
            system("cls");
            head=createchain(FileName);
            sales(head);
            WriteToFile(head,FileName);
            break;
        case 6:
            system("cls");
            head=createchain(FileName);
            baofei(head);
            WriteToFile(head,FileName);
            break;
        case 7:
            system("cls");
            head=createchain(FileName);
            sale(head);
            WriteToFile(head,FileName);
            break;
        case 8:
            system("cls");
            head=createchain(FileName);
            namechaxun(head);
            break;
        case 9:
            system("cls");
            head=createchain(FileName);
            shuchaxun(head);
            break;
        case 10:
            system("cls");
            head=createchain(FileName);
            xianshi(head);
            break;
        case 11:
            system("cls");
            head=createchain(FileName);
            amountxianshi(head);
            break;
        case 12:
            system("cls");
            head=createchain(FileName);
            profitxianshi(head);
            break;
        }
    }
}


/*菜单*/
void menu()
{
    printf("-------------------菜单-------------------\n");
    printf("|      0. 退出系统                       |\n");
    printf("|      1. 创建商品                       |\n");
    printf("|      2. 修改商品信息                   |\n");
    printf("|      3. 删除原有商品                   |\n");
    printf("|      4. 原有商品的新进货量             |\n");
    printf("|      5. 原有商品的新销售量             |\n");
    printf("|      6. 原有商品的报废量               |\n");
    printf("|      7. 统计销售情况                   |\n");
    printf("|      8. 根据商品名查询                 |\n");
    printf("|      9. 根据剩余数查询                 |\n");
    printf("|      10.按原来商品顺序显示             |\n");
    printf("|      11.按销售额由高到低的顺序显示     |\n");
    printf("|      12.按毛利由高到低的顺序显示       |\n");
    printf("|      13.添加新商品                     |\n");
    printf("------------------------------------------");
    printf("\n");
    printf("\n");
    printf("请选择您要进行的操作选项:   ");
}



/*创建文件,存放结构体数据*/
void createFile(char *FName)
{
    int i=1;
    struct Goods go;
    FILE *fp;
    if((fp=fopen(FName,"w"))==NULL)
    {
        printf("文件打开失败!\n");
        exit(0);
    }
    while(i!=0)/*给结构体各成员变量赋值*/
    {
        printf("创建商品档案:\n");
        printf("请输入商品编号: ");
        scanf("%s",go.id);
        printf("请输入商品品名: ");
        scanf("%s",go.name);
        printf("请输入商品进价: ");
        scanf("%lf",&go.purchase_price);
        printf("请输入商品售价: ");
        scanf("%lf",&go.selling_price);
        printf("请输入商品进货量: ");
        scanf("%d",&go.purchase_quantity);
        printf("请输入商品销售量: ");
        scanf("%d",&go.sales_volume);
        go.amount=(go.selling_price)*(go.sales_volume);
        printf("该商品销售额为: %lf\n",go.amount);
        go.remaining_quantity=(go.purchase_quantity)-(go.sales_volume);
        printf("该商品剩余数为: %d\n",go.remaining_quantity);
        go.gross_profit=(go.amount)-(go.purchase_price)*(go.sales_volume);
        printf("该商品毛利为: %lf\n",go.gross_profit);
        fprintf(fp,"%s %s %lf %lf %d %d %lf %d %lf\n",go.id,go.name,go.purchase_price,go.selling_price,go.purchase_quantity,go.sales_volume,go.amount,go.remaining_quantity,go.gross_profit);
        printf("是否需要输入新的数据(1=继续,0=退出)?");
        scanf("%d",&i);
    }
    fclose(fp);
}


/*利用文件创建链表*/
struct Jd *createchain(char *FName)
{
    FILE *fp;
    struct Jd *pt,*pEnd,*head=NULL;
    struct Goods go;
    if((fp=fopen(FName,"r"))==NULL)
    {
        printf("文件打开失败!\n");
        exit(0);
    }
    while(fscanf(fp,"%s %s %lf %lf %d %d %lf %d %lf\n",go.id,go.name,&go.purchase_price,&go.selling_price,&go.purchase_quantity,&go.sales_volume,&go.amount,&go.remaining_quantity,&go.gross_profit)!=EOF) /*从文件里读出一个结构体数据*/
    {
        pt=(struct Jd *)malloc(SIZEJD);  /*创建链表结点空间*/
        pt->goods=go;/*把前面读出的结构体数据赋值给结点的goods变量*/
        if(head==NULL)/*如果链表以前是空,则生成头结点*/
        {
            head=pt;
            pEnd=pt;
            pt->next=NULL;
        }
        else  /*在尾部插入结点*/
        {
            pEnd->next=pt;/*将新结点链入链表*/
            pt->next=NULL;/*将新结点的next指针置空,标识成尾结点*/
            pEnd=pt;/*让pEnd指向尾结点,为下一次插入做准备*/
        }
    }
    fclose(fp);
    return head;
};


/*修改商品信息*/
void edit(struct Jd *head)
{
    struct Jd *p=head,*p1=head;
    int flag=0;
    char num[MAXSIZE];
    printf("请输入需修改的商品的编号: \n");
    scanf("%s",num);
    while(p1)
    {
        if(strcmp(num,p1->goods.id)==0)
        {
            flag=1;
            break;
        }
        p1=p1->next;
    }
    if(flag==1)
    {
        while(p)
        {
            if(strcmp(num,p->goods.id)==0)
            {
                printf("请输入商品编号: \n");
                scanf("%s",p->goods.id);
                printf("请输入商品品名: \n");
                scanf("%s",p->goods.name);
                printf("请输入商品进价: \n");
                scanf("%lf",&p->goods.purchase_price);
                printf("请输入商品售价: \n");
                scanf("%lf",&p->goods.selling_price);
                printf("请输入商品进货量: \n");
                scanf("%d",&p->goods.purchase_quantity);
                printf("请输入商品销售量: \n");
                scanf("%d",&p->goods.sales_volume);
                p->goods.amount=(p->goods.sales_volume)*(p->goods.selling_price);
                printf("该商品销售额为: %lf\n",p->goods.amount);
                p->goods.remaining_quantity=(p->goods.purchase_quantity)-(p->goods.sales_volume);
                printf("该商品剩余数为: %d\n",p->goods.remaining_quantity);
                p->goods.gross_profit=(p->goods.amount)-(p->goods.purchase_price)*(p->goods.sales_volume);
                printf("该商品毛利为: %lf\n",p->goods.gross_profit);
                printf("\n");
                printf("修改成功!\n");
            }
            p=p->next;
        }
    }
    else
        printf("该商品不存在!\n");
}


/*删除原有商品*/
void del(struct Jd *head)
{
    int flag=0;
    struct Jd *p=head,*p1=head;
    char num[MAXSIZE];
    printf("请输入要删除的商品编号: ");
    scanf("%s",num);
    while(p1)
    {
        if(strcmp(num,p1->goods.id)==0)
        {
            flag=1;
            break;
        }
        p1=p1->next;
    }
    if(flag==1)
    {
        if(strcmp(num,p->goods.id)==0)
        {
            head=p->next;
            printf("删除成功!\n");
        }
        else
        {
            while(p)
            {
                if(p->next&&strcmp(num,p->next->goods.id)==0)
                {
                    p->next=p->next->next;
                    printf("删除成功!\n");
                }
                p=p->next;
            }
        }
    }
    else
        printf("该商品不存在!\n");
}


/*处理原有商品的新进货量*/
void purchase(struct Jd *head)
{
    int flag=0,num;
    struct Jd *p=head,*p1=head,*p2;
    p2=(struct Jd *)malloc(SIZEJD);
    p2->next=NULL;
    printf("请输入商品编号: \n");
    scanf("%s",p2->goods.id);
    while(p)
    {
        if(strcmp(p2->goods.id,p->goods.id)==0)
        {
            flag=1;
            break;
        }
        p=p->next;
    }
    if(flag==1)
    {
        printf("请输入商品新进货量: \n");
        scanf("%d",&num);
        while(p1)
        {
            if(strcmp(p1->goods.id,p2->goods.id)==0)
            {
                p1->goods.purchase_quantity+=num;
                p1->goods.remaining_quantity+=num;
            }
            p1=p1->next;
        }
    }
    else
        printf("该商品不存在!");
}


/*处理原有商品的新销售量*/
void sales(struct Jd *head)
{
    int flag=0,num;
    struct Jd *p=head,*p1=head,*p2;
    p2=(struct Jd *)malloc(SIZEJD);
    p2->next=NULL;
    printf("请输入商品编号: \n");
    scanf("%s",p2->goods.id);
    while(p)
    {
        if(strcmp(p2->goods.id,p->goods.id)==0)
        {
            flag=1;
            break;
        }
        p=p->next;
    }
    if(flag==1)
    {
        printf("请输入商品新销售量: \n");
        scanf("%d",&num);
        while(p1)
        {
            if(strcmp(p1->goods.id,p2->goods.id)==0)
            {
                p1->goods.sales_volume+=num;
                p1->goods.remaining_quantity-=num;
            }
            p1=p1->next;
        }
    }
    else
        printf("该商品不存在!\n");
}


/*处理原有商品的报废量*/
void baofei(struct Jd *head)
{
    int flag=0,num;
    struct Jd *p=head,*p1=head,*p2;
    p2=(struct Jd *)malloc(SIZEJD);
    p2->next=NULL;
    printf("请输入商品编号: \n");
    scanf("%s",p2->goods.id);
    while(p)
    {
        if(strcmp(p2->goods.id,p->goods.id)==0)
        {
            flag=1;
            break;
        }
        p=p->next;
    }
    if(flag==1)
    {
        printf("请输入商品报废量: \n");
        scanf("%d",&num);
        while(p1)
        {
            if(strcmp(p1->goods.id,p2->goods.id)==0)
            {
                if(p1->goods.remaining_quantity>=num)
                    p1->goods.remaining_quantity-=num;
                else
                {
                    printf("数据不合理!\n");
                    break;
                }
            }
            p1=p1->next;
        }
    }
    else
        printf("该商品不存在!\n");
}


/*统计销售情况*/
void sale(struct Jd *head)
{
    int flag=0;
    struct Jd *p=head,*p1=head,*p2;
    p2=(struct Jd *)malloc(SIZEJD);
    p2->next=NULL;
    printf("请输入商品编号: \n");
    scanf("%s",p2->goods.id);
    while(p)
    {
        if(strcmp(p2->goods.id,p->goods.id)==0)
        {
            flag=1;
            break;
        }
        p=p->next;
    }
    if(flag==1)
    {
        while(p1)
        {
            if(strcmp(p1->goods.id,p2->goods.id)==0)
            {
                printf("该商品的销售额为: %lf\n",p1->goods.amount);
                printf("该商品的剩余数为: %d\n",p1->goods.remaining_quantity);
                p->goods.gross_profit=(p->goods.amount)-(p->goods.purchase_price)*(p->goods.sales_volume);
                printf("该商品的毛利为: %lf\n",p1->goods.gross_profit);
            }
            p1=p1->next;
        }
    }
    else
        printf("该商品不存在!\n");
}


/*根据商品名查询*/
void namechaxun(struct Jd *head)
{
    struct Jd *p=head,*p1=head;
    int flag=0;
    char name[MAXSIZE];
    printf("请输入要查询的商品品名: ");
    scanf("%s",name);
    while(p)
    {
        if(strcmp(p->goods.name,name)==0)
        {
            flag=1;
            break;
        }
        p=p->next;
    }
    if(flag==1)
    {
        while(p1)
        {
            if(strcmp(p1->goods.name,name)==0)
            {
                printf("商品编号: %s\n",p1->goods.id);
                printf("商品品名: %s\n",p1->goods.name);
                printf("商品进价: %lf\n",p1->goods.purchase_price);
                printf("商品售价: %lf\n",p1->goods.selling_price);
                printf("商品进货量: %d\n",p1->goods.purchase_quantity);
                printf("商品销售量: %d\n",p1->goods.sales_volume);
                printf("商品销售额: %lf\n",p1->goods.amount);
                printf("商品剩余数: %d\n",p1->goods.remaining_quantity);
                printf("商品毛利: %lf\n",p1->goods.gross_profit);
            }
            p1=p1->next;
        }
    }
    else
        printf("该商品不存在!\n");
}


/*根据剩余数查询*/
void shuchaxun(struct Jd *head)
{
    struct Jd *p=head;
    int s,b;
    int flag=0;
    printf("请输入查询区间: \n");
    scanf("%d%d",&s,&b);
    if(s>b)
        printf("输入错误,请重新输入!\n");
    else
    {
        while(p)
        {
            if(p->goods.remaining_quantity>=s&&p->goods.remaining_quantity<=b)
            {
                flag=1;
                printf("商品编号: %s\n",p->goods.id);
                printf("商品品名: %s\n",p->goods.name);
                printf("商品进价: %lf\n",p->goods.purchase_price);
                printf("商品售价: %lf\n",p->goods.selling_price);
                printf("商品进货量: %d\n",p->goods.purchase_quantity);
                printf("商品销售量: %d\n",p->goods.sales_volume);
                printf("商品销售额: %lf\n",p->goods.amount);
                printf("商品剩余数: %d\n",p->goods.remaining_quantity);
                printf("商品毛利: %lf\n",p->goods.gross_profit);
            }
            p=p->next;
        }
        if(flag==0)
            printf("未找到任何记录!\n");
    }
}


/*按原来商品顺序显示*/
void xianshi(struct Jd *head)
{
    struct Jd *p=head;
    if(p!=NULL)
    {
        while(p!=NULL)
        {
            printf("商品编号: %s\n",p->goods.id);
            printf("商品品名: %s\n",p->goods.name);
            printf("商品进价: %lf\n",p->goods.purchase_price);
            printf("商品售价: %lf\n",p->goods.selling_price);
            printf("商品进货量: %d\n",p->goods.purchase_quantity);
            printf("商品销售量: %d\n",p->goods.sales_volume);
            printf("商品销售额: %lf\n",p->goods.amount);
            printf("商品剩余数: %d\n",p->goods.remaining_quantity);
            printf("商品毛利: %lf\n",p->goods.gross_profit);
            p=p->next;
        }
    }
    else
        printf("暂无商品信息!\n");
}


/*按销售额排序显示*/
void amountxianshi(struct Jd *head)
{
    struct Jd *pt1,*pt2,*pt;
    struct Goods temp;
    for(pt1=head;pt1->next!=NULL;pt1=pt1->next)
    {
        pt=pt1;
        for(pt2=pt1->next;pt2!=NULL;pt2=pt2->next)
        {
            if(pt->goods.amount>pt2->goods.amount)
                pt=pt2;
        }
        if(pt!=pt1)
        {
            temp=pt1->goods;
            pt1->goods=pt->goods;
            pt->goods=temp;
        }
    }
    xianshi(head);
}


/*按毛利显示*/
void profitxianshi(struct Jd *head)
{
    struct Jd *pt1,*pt2,*pt;
    struct Goods temp;
    for(pt1=head;pt1->next!=NULL;pt1=pt1->next)
    {
        pt=pt1;
        for(pt2=pt1->next;pt2!=NULL;pt2=pt2->next)
        {
            if(pt->goods.gross_profit>pt2->goods.gross_profit)
                pt=pt2;
        }
        if(pt!=pt1)
        {
            temp=pt1->goods;
            pt1->goods=pt->goods;
            pt->goods=temp;
        }
    }
    xianshi(head);
}


/*把链表结点数据写往文件*/
void WriteToFile(struct Jd *head,char *FName)
{
    struct Goods go;
    FILE *fp;
    struct Jd *pt;
    if((fp=fopen(FName,"w"))==NULL)
    {
        printf("文件打开失败!");
        exit(0);
    }
    pt=head;
    while(pt!=NULL)
    {
        fprintf(fp,"%s %s %lf %lf %d %d %lf %d %lf\n",go.id,go.name,go.purchase_price,go.selling_price,go.purchase_quantity,go.sales_volume,go.amount,go.remaining_quantity,go.gross_profit);
        pt=pt->next;
    }
    fclose(fp);
}




```

对主函数,void createFile(char* FName);创建文件存放结构体数据函数,void edit(struct Jd* head) 修改商品信息函数,void del(struct Jd** head) 删除原有商品函数,void WriteToFile(struct Jd* head, char* FName)把链表结点数据写往文件函数,做了修改,改动处见注释。其余的几个函数虽然可以正常运行,但代码写的冗余,留给题主优化。

//小超市管理系统
//创建完商品档案进行其他功能时,文件里的数据变成乱码...

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#define MAXSIZE 50
#define SIZESG sizeof(struct Goods)
#define SIZEJD sizeof(struct Jd)

struct Goods
{
    char   id[20];/*编号*/
    char   name[20];/*品名*/
    double purchase_price;/*进价*/
    double selling_price;/*售价*/
    int    purchase_quantity;/*进货量*/
    int    sales_volume;/*销售量*/
    double amount;/*销售额*/
    int    remaining_quantity;/*剩余数*/
    double gross_profit;/*毛利*/
};
struct Jd
{
    struct Goods goods;
    struct Jd* next;
};


void menu();/*菜单*/
void createFile(char* FName);/*创建文件,存放结构体数据*/
struct Jd* createchain(char* FName);/*利用文件创建链表*/
void edit(struct Jd* head);/*修改商品信息*/
void del(struct Jd** head);/*删除原有商品*/                //修改
void purchase(struct Jd* head);/*处理原有商品的新进货量*/
void sales(struct Jd* head);/*处理原有商品的新销售量*/
void baofei(struct Jd* head);/*处理原有商品的报废量*/
void sale(struct Jd* head);/*统计销售情况*/
void namechaxun(struct Jd* head);/*根据商品品名查询*/
void shuchaxun(struct Jd* head);/*根据剩余数查询*/
void xianshi(struct Jd* head);/*按原有顺序显示*/
void amountxianshi(struct Jd* head);/*销售额*/
void profitxianshi(struct Jd* head);/*毛利*/
void WriteToFile(struct Jd* head, char* FName);/*数据写入文件*/


int main()
{
    struct Jd* head = NULL;
    char FileName[128] = { "data.txt" };//修改 
    //strcpy(FileName, "data.txt");     //修改
    int i;
    while (1)
    {
        menu();
        scanf("%d", &i);
        switch (i)
        {
        case 0:
            system("cls");
            printf("已退出系统!");
            exit(0);
        case 1:
            system("cls");
            createFile(FileName);
            break;
        case 2:
            system("cls");
            head = createchain(FileName);
            edit(head);
            WriteToFile(head, FileName);
            break;
        case 3:
            system("cls");
            head = createchain(FileName);
            del(&head);                    //修改
            WriteToFile(head, FileName);
            break;
        case 4:
            system("cls");
            head = createchain(FileName);
            purchase(head);
            WriteToFile(head, FileName);
            break;
        case 5:
            system("cls");
            head = createchain(FileName);
            sales(head);
            WriteToFile(head, FileName);
            break;
        case 6:
            system("cls");
            head = createchain(FileName);
            baofei(head);
            WriteToFile(head, FileName);
            break;
        case 7:
            system("cls");
            head = createchain(FileName);
            sale(head);
            WriteToFile(head, FileName);
            break;
        case 8:
            system("cls");
            head = createchain(FileName);
            namechaxun(head);
            break;
        case 9:
            system("cls");
            head = createchain(FileName);
            shuchaxun(head);
            break;
        case 10:
            system("cls");
            head = createchain(FileName);
            xianshi(head);
            break;
        case 11:
            system("cls");
            head = createchain(FileName);
            amountxianshi(head);
            break;
        case 12:
            system("cls");
            head = createchain(FileName);
            profitxianshi(head);
            break;
        default:break;                   //修改
        }
    }
}


/*菜单*/
void menu()
{
    printf("-------------------菜单-------------------\n");
    printf("|      0. 退出系统                       |\n");
    printf("|      1. 创建商品                       |\n");
    printf("|      2. 修改商品信息                   |\n");
    printf("|      3. 删除原有商品                   |\n");
    printf("|      4. 原有商品的新进货量             |\n");
    printf("|      5. 原有商品的新销售量             |\n");
    printf("|      6. 原有商品的报废量               |\n");
    printf("|      7. 统计销售情况                   |\n");
    printf("|      8. 根据商品名查询                 |\n");
    printf("|      9. 根据剩余数查询                 |\n");
    printf("|      10.按原来商品顺序显示             |\n");
    printf("|      11.按销售额由高到低的顺序显示     |\n");
    printf("|      12.按毛利由高到低的顺序显示       |\n");
    printf("|      13.添加新商品                     |\n");
    printf("------------------------------------------");
    printf("\n");
    printf("\n");
    printf("请选择您要进行的操作选项:   ");
}



/*创建文件,存放结构体数据*/
void createFile(char* FName)
{
    int i = 1;
    struct Goods go;
    FILE* fp;
    if ((fp = fopen(FName, "a+")) == NULL) //修改
        //if ((fp = fopen(FName, "w")) == NULL)  
    {
        printf("文件打开失败!\n");
        exit(0);
    }
    while (i != 0)/*给结构体各成员变量赋值*/
    {
        printf("创建商品档案:\n");
        printf("请输入商品编号: ");
        scanf("%s", go.id);
        printf("请输入商品品名: ");
        scanf("%s", go.name);
        printf("请输入商品进价: ");
        scanf("%lf", &go.purchase_price);
        printf("请输入商品售价: ");
        scanf("%lf", &go.selling_price);
        printf("请输入商品进货量: ");
        scanf("%d", &go.purchase_quantity);
        printf("请输入商品销售量: ");
        scanf("%d", &go.sales_volume);
        go.amount = (go.selling_price) * (go.sales_volume);
        printf("该商品销售额为: %lf\n", go.amount);
        go.remaining_quantity = (go.purchase_quantity) - (go.sales_volume);
        printf("该商品剩余数为: %d\n", go.remaining_quantity);
        go.gross_profit = (go.amount) - (go.purchase_price) * (go.sales_volume);
        printf("该商品毛利为: %lf\n", go.gross_profit);
        fprintf(fp, "%s %s %lf %lf %d %d %lf %d %lf\n", go.id, go.name, go.purchase_price, go.selling_price, 
                  go.purchase_quantity, go.sales_volume, go.amount, go.remaining_quantity, go.gross_profit);
        printf("是否需要输入新的数据(1=继续,0=退出)?");
        scanf("%d", &i);
    }
    fclose(fp);
}


/*利用文件创建链表*/
struct Jd* createchain(char* FName)
{
    FILE* fp;
    struct Jd* pt, * pEnd, * head = NULL;
    struct Goods go;
    if ((fp = fopen(FName, "r")) == NULL)
    {
        printf("文件打开失败!\n");
        return head;  //exit(0);
    }
    while (fscanf(fp, "%s %s %lf %lf %d %d %lf %d %lf\n", go.id, go.name, &go.purchase_price, &go.selling_price,      //修改 
                 &go.purchase_quantity, &go.sales_volume, &go.amount, &go.remaining_quantity, &go.gross_profit) == 9) //修改
        //&go.purchase_quantity, &go.sales_volume, &go.amount, &go.remaining_quantity, &go.gross_profit) != EOF) /*从文件里读出一个结构体数据*/
    {
        pt = (struct Jd*)malloc(SIZEJD);  /*创建链表结点空间*/
        pt->goods = go;/*把前面读出的结构体数据赋值给结点的goods变量*/
        pt->next = NULL;                                               //修改
        if (head == NULL)/*如果链表以前是空,则生成头结点*/
        {
            head = pt;
            pEnd = pt;
        }
        else  /*在尾部插入结点*/
        {
            pEnd->next = pt;/*将新结点链入链表*/
            pEnd = pt;/*让pEnd指向尾结点,为下一次插入做准备*/
        }
    }
    fclose(fp);
    return head;
};


/*修改商品信息*/
void edit(struct Jd* head)            //修改
{
    struct Jd* p = head, * p1 = head;
    int flag = 0;
    char num[MAXSIZE];
    printf("请输入需修改的商品的编号: \n");
    scanf("%s", num);
    while (p)
    {
        if (strcmp(num, p->goods.id) == 0)  
        {
            flag = 1;
            printf("请输入商品编号: \n");
            scanf("%s", p->goods.id);
            printf("请输入商品品名: \n");
            scanf("%s", p->goods.name);
            printf("请输入商品进价: \n");
            scanf("%lf", &p->goods.purchase_price);
            printf("请输入商品售价: \n");
            scanf("%lf", &p->goods.selling_price);
            printf("请输入商品进货量: \n");
            scanf("%d", &p->goods.purchase_quantity);
            printf("请输入商品销售量: \n");
            scanf("%d", &p->goods.sales_volume);
            p->goods.amount = (p->goods.sales_volume) * (p->goods.selling_price);
            printf("该商品销售额为: %lf\n", p->goods.amount);
            p->goods.remaining_quantity = (p->goods.purchase_quantity) - (p->goods.sales_volume);
            printf("该商品剩余数为: %d\n", p->goods.remaining_quantity);
            p->goods.gross_profit = (p->goods.amount) - (p->goods.purchase_price) * (p->goods.sales_volume);
            printf("该商品毛利为: %lf\n", p->goods.gross_profit);
            printf("\n");
            printf("修改成功!\n");
            break;
        }
        p = p->next;
    }
    if(!flag)
        printf("该商品不存在!\n");
}


/*删除原有商品*/
void del(struct Jd** head)  //修改
{
    int flag = 0;
    struct Jd* p = (*head), * p1 = NULL;
    char num[MAXSIZE];
    printf("请输入要删除的商品编号: ");
    scanf("%s", num);
    if (strcmp(num, p->goods.id) == 0)     //修改
    {
        flag = 1;
        (*head) = p->next;
        free(p);                         //修改  
        printf("删除成功!\n");
    }
    else
    {
        while (p)
        {
            if (p->next && strcmp(num, p->next->goods.id) == 0) //修改
            {
                flag = 1;
                p1 = p->next;
                p->next = p1->next;
                free(p1);               //修改
                printf("删除成功!\n");
            }
            p = p->next;
        }
    }
    if(!flag)
        printf("该商品不存在!\n");
}


/*处理原有商品的新进货量*/
void purchase(struct Jd* head)
{
    int flag = 0, num;
    struct Jd* p = head, * p1 = head, * p2;
    p2 = (struct Jd*)malloc(SIZEJD);
    p2->next = NULL;
    printf("请输入商品编号: \n");
    scanf("%s", p2->goods.id);
    while (p)
    {
        if (strcmp(p2->goods.id, p->goods.id) == 0)
        {
            flag = 1;
            break;
        }
        p = p->next;
    }
    if (flag == 1)
    {
        printf("请输入商品新进货量: \n");
        scanf("%d", &num);
        while (p1)
        {
            if (strcmp(p1->goods.id, p2->goods.id) == 0)
            {
                p1->goods.purchase_quantity += num;
                p1->goods.remaining_quantity += num;
            }
            p1 = p1->next;
        }
    }
    else
        printf("该商品不存在!");
}


/*处理原有商品的新销售量*/
void sales(struct Jd* head)
{
    int flag = 0, num;
    struct Jd* p = head, * p1 = head, * p2;
    p2 = (struct Jd*)malloc(SIZEJD);
    p2->next = NULL;
    printf("请输入商品编号: \n");
    scanf("%s", p2->goods.id);
    while (p)
    {
        if (strcmp(p2->goods.id, p->goods.id) == 0)
        {
            flag = 1;
            break;
        }
        p = p->next;
    }
    if (flag == 1)
    {
        printf("请输入商品新销售量: \n");
        scanf("%d", &num);
        while (p1)
        {
            if (strcmp(p1->goods.id, p2->goods.id) == 0)
            {
                p1->goods.sales_volume += num;
                p1->goods.remaining_quantity -= num;
            }
            p1 = p1->next;
        }
    }
    else
        printf("该商品不存在!\n");
}


/*处理原有商品的报废量*/
void baofei(struct Jd* head)
{
    int flag = 0, num;
    struct Jd* p = head, * p1 = head, * p2;
    p2 = (struct Jd*)malloc(SIZEJD);
    p2->next = NULL;
    printf("请输入商品编号: \n");
    scanf("%s", p2->goods.id);
    while (p)
    {
        if (strcmp(p2->goods.id, p->goods.id) == 0)
        {
            flag = 1;
            break;
        }
        p = p->next;
    }
    if (flag == 1)
    {
        printf("请输入商品报废量: \n");
        scanf("%d", &num);
        while (p1)
        {
            if (strcmp(p1->goods.id, p2->goods.id) == 0)
            {
                if (p1->goods.remaining_quantity >= num)
                    p1->goods.remaining_quantity -= num;
                else
                {
                    printf("数据不合理!\n");
                    break;
                }
            }
            p1 = p1->next;
        }
    }
    else
        printf("该商品不存在!\n");
}


/*统计销售情况*/
void sale(struct Jd* head)
{
    int flag = 0;
    struct Jd* p = head, * p1 = head, * p2;
    p2 = (struct Jd*)malloc(SIZEJD);
    p2->next = NULL;
    printf("请输入商品编号: \n");
    scanf("%s", p2->goods.id);
    while (p)
    {
        if (strcmp(p2->goods.id, p->goods.id) == 0)
        {
            flag = 1;
            break;
        }
        p = p->next;
    }
    if (flag == 1)
    {
        while (p1)
        {
            if (strcmp(p1->goods.id, p2->goods.id) == 0)
            {
                printf("该商品的销售额为: %lf\n", p1->goods.amount);
                printf("该商品的剩余数为: %d\n", p1->goods.remaining_quantity);
                p->goods.gross_profit = (p->goods.amount) - (p->goods.purchase_price) * (p->goods.sales_volume);
                printf("该商品的毛利为: %lf\n", p1->goods.gross_profit);
            }
            p1 = p1->next;
        }
    }
    else
        printf("该商品不存在!\n");
}


/*根据商品名查询*/
void namechaxun(struct Jd* head)
{
    struct Jd* p = head, * p1 = head;
    int flag = 0;
    char name[MAXSIZE];
    printf("请输入要查询的商品品名: ");
    scanf("%s", name);
    while (p)
    {
        if (strcmp(p->goods.name, name) == 0)
        {
            flag = 1;
            break;
        }
        p = p->next;
    }
    if (flag == 1)
    {
        while (p1)
        {
            if (strcmp(p1->goods.name, name) == 0)
            {
                printf("商品编号: %s\n", p1->goods.id);
                printf("商品品名: %s\n", p1->goods.name);
                printf("商品进价: %lf\n", p1->goods.purchase_price);
                printf("商品售价: %lf\n", p1->goods.selling_price);
                printf("商品进货量: %d\n", p1->goods.purchase_quantity);
                printf("商品销售量: %d\n", p1->goods.sales_volume);
                printf("商品销售额: %lf\n", p1->goods.amount);
                printf("商品剩余数: %d\n", p1->goods.remaining_quantity);
                printf("商品毛利: %lf\n", p1->goods.gross_profit);
            }
            p1 = p1->next;
        }
    }
    else
        printf("该商品不存在!\n");
}


/*根据剩余数查询*/
void shuchaxun(struct Jd* head)
{
    struct Jd* p = head;
    int s, b;
    int flag = 0;
    printf("请输入查询区间: \n");
    scanf("%d%d", &s, &b);
    if (s > b)
        printf("输入错误,请重新输入!\n");
    else
    {
        while (p)
        {
            if (p->goods.remaining_quantity >= s && p->goods.remaining_quantity <= b)
            {
                flag = 1;
                printf("商品编号: %s\n", p->goods.id);
                printf("商品品名: %s\n", p->goods.name);
                printf("商品进价: %lf\n", p->goods.purchase_price);
                printf("商品售价: %lf\n", p->goods.selling_price);
                printf("商品进货量: %d\n", p->goods.purchase_quantity);
                printf("商品销售量: %d\n", p->goods.sales_volume);
                printf("商品销售额: %lf\n", p->goods.amount);
                printf("商品剩余数: %d\n", p->goods.remaining_quantity);
                printf("商品毛利: %lf\n", p->goods.gross_profit);
            }
            p = p->next;
        }
        if (flag == 0)
            printf("未找到任何记录!\n");
    }
}


/*按原来商品顺序显示*/
void xianshi(struct Jd* head)
{
    struct Jd* p = head;
    if (p != NULL)
    {
        while (p != NULL)
        {
            printf("商品编号: %s\n", p->goods.id);
            printf("商品品名: %s\n", p->goods.name);
            printf("商品进价: %lf\n", p->goods.purchase_price);
            printf("商品售价: %lf\n", p->goods.selling_price);
            printf("商品进货量: %d\n", p->goods.purchase_quantity);
            printf("商品销售量: %d\n", p->goods.sales_volume);
            printf("商品销售额: %lf\n", p->goods.amount);
            printf("商品剩余数: %d\n", p->goods.remaining_quantity);
            printf("商品毛利: %lf\n", p->goods.gross_profit);
            p = p->next;
        }
    }
    else
        printf("暂无商品信息!\n");
}


/*按销售额排序显示*/
void amountxianshi(struct Jd* head)
{
    struct Jd* pt1, * pt2, * pt;
    struct Goods temp;
    for (pt1 = head; pt1->next != NULL; pt1 = pt1->next)
    {
        pt = pt1;
        for (pt2 = pt1->next; pt2 != NULL; pt2 = pt2->next)
        {
            if (pt->goods.amount > pt2->goods.amount)
                pt = pt2;
        }
        if (pt != pt1)
        {
            temp = pt1->goods;
            pt1->goods = pt->goods;
            pt->goods = temp;
        }
    }
    xianshi(head);
}


/*按毛利显示*/
void profitxianshi(struct Jd* head)
{
    struct Jd* pt1, * pt2, * pt;
    struct Goods temp;
    for (pt1 = head; pt1->next != NULL; pt1 = pt1->next)
    {
        pt = pt1;
        for (pt2 = pt1->next; pt2 != NULL; pt2 = pt2->next)
        {
            if (pt->goods.gross_profit > pt2->goods.gross_profit)
                pt = pt2;
        }
        if (pt != pt1)
        {
            temp = pt1->goods;
            pt1->goods = pt->goods;
            pt->goods = temp;
        }
    }
    xianshi(head);
}


/*把链表结点数据写往文件*/
void WriteToFile(struct Jd* head, char* FName)
{
    FILE* fp;
    struct Jd* pt;
    if ((fp = fopen(FName, "w")) == NULL)
    {
        printf("文件打开失败!");
        exit(0);
    }
    pt = head;
    while (pt != NULL)
    {
        fprintf(fp, "%s %s %lf %lf %d %d %lf %d %lf\n", pt->goods.id, pt->goods.name, pt->goods.purchase_price, pt->goods.selling_price,//修改
            pt->goods.purchase_quantity, pt->goods.sales_volume, pt->goods.amount, pt->goods.remaining_quantity, pt->goods.gross_profit);//修改
        //fprintf(fp, "%s %s %lf %lf %d %d %lf %d %lf\n", go.id, go.name, go.purchase_price, go.selling_price, 
        //go.purchase_quantity, go.sales_volume, go.amount, go.remaining_quantity, go.gross_profit);
        pt = pt->next;
    }
    fclose(fp);
}


不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^