c语言在链表上添加文件

struct sp
{
    int id;            //商品编号
    char name[20];        //商品名称
    char Catagory[10];    //商品类别
    int kcl;           //商品库存量
    int xsl;        //商品销售量
    int N;
    struct sp*next;  //指向下一节点
};

void tongji(sp *L)  //统计文件中商品销售量并排序
{
    sp *p,*q,*tail,*l;

    FILE *fp;          //打开已有商品信息的文件
    if((fp=fopen("sp.txt","r+"))==NULL)
    {
        printf("不能打开文件!\n");
        exit(0);
    }
    const int P=100;  //此为循环录入到p
    for(int i=0;i<P;i++)
    {
        p=(sp *)malloc(sizeof(sp));
        fscanf(fp,"%s %d %s %d %d ",&p->name,&p->id,&p->Catagory,&p->kcl,&p->xsl);

    }  
    tail=NULL;   //尾节点置空
    while((L->next->next)!=tail)  //链表的一种冒泡排序
    {
        p=L;
        q=L->next;
        while(q->next!=tail)
        {
            if((q->xsl)>(q->next->xsl))
            {
                p->next=q->next;
                q->next=q->next->next;
                p->next->next=q;
                q=p->next;
            }
            q=q->next;
            p=p->next;
        }
        tail=q;
    }
    printf("商品销售量,销售比例从小到大结果如下:\n");
    l=L->next;int sum=0;float xsbl;
    while(l!=NULL)  //求出销售总数
    {
        sum=sum+l->xsl;
        l=l->next;
    }    
    l=L->next;
    while(l!=NULL) //打印出销售量 销售比例
    {
        xsbl=(l->xsl)/sum;
        printf("%s(%d)(%.2f) ",l->name,l->xsl,xsbl);
        l=l->next;
    }
}

删除所有文件操作,代码无错误。

在加入文件时,可以打开文件并进行循环赋值。

后续排序输出等无法进行。

 

修改如下,供参考:

struct sp
{
    int  id;            //商品编号
    char name[32];     //商品名称
    char Catagory[32]; //商品类别
    int  kcl;           //商品库存量
    int  xsl;           //商品销售量
    int  N;
    struct sp*next;  //指向下一节点
};
void tongji(sp *L)  //统计文件中商品销售量并排序
{
    struct sp *p,*q,*tail,*l;
    FILE *fp;          //打开已有商品信息的文件
    if((fp=fopen("sp.txt","r+"))==NULL)
    {
        printf("不能打开文件!\n");
        return;  //exit(0);
    }
    //const int P=100;  //此为循环录入到p
    while(1)//for(int i=0;i<P;i++)
    {
        p=(struct sp *)malloc(sizeof(struct sp));
        p->next = NULL;
        if(fscanf(fp,"%d %s %s %d %d",
                      &p->id,p->name,p->Catagory,&p->kcl,&p->xsl)!=5)break;
        p->next = L->next;
        L->next = p;
    }
    free(p);

    tail=NULL;   //尾节点置空
    while((L->next)!=tail)//while((L->next->next)!=tail)  //链表的一种冒泡排序
    {
        p=L;
        q=L->next;
        while(q->next!=tail)
        {
            if((q->xsl)>(q->next->xsl))
            {
                p->next=q->next;
                q->next=q->next->next;
                p->next->next=q;
                q=p->next;
            }
            q=q->next;
            p=p->next;
        }
        tail=q;
    }
    printf("商品销售量,销售比例从小到大结果如下:\n");
    l=L->next;int sum=0;float xsbl;
    while(l!=NULL)  //求出销售总数
    {
        sum = sum + l->xsl;
        l=l->next;
    }
    l=L->next;
    while(l!=NULL) //打印出销售量 销售比例
    {
        xsbl=(float)(l->xsl)/sum;
        printf("%s (%d)(%.2f)\n",l->name,l->xsl,xsbl);
        l=l->next;
    }
}

 

fscanf(fp,"%s %d %s %d %d ",&p->name,&p->id,&p->Catagory,&p->kcl,&p->xsl);

改为

fscanf(fp,"%s %d %s %d %d ",p->name,&p->id,p->Catagory,&p->kcl,&p->xsl);