+-×÷=∅
2021-06-29 15:58
采纳率: 100%
浏览 56

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

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

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

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

 

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

4条回答 默认 最新

  • qzjhjxj 2021-06-29 17:33
    已采纳

    修改如下,供参考:

    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;
        }
    }
    点赞 1 评论
  • CSDN专家-link 2021-06-29 16:04

    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);

    点赞 评论
  • +-×÷=∅ 2021-06-29 16:15

     

    点赞 评论
  • +-×÷=∅ 2021-06-29 16:21

     

    点赞 评论

相关推荐 更多相似问题