帮我看一下这个c语言程序为什么不对?

我的代码是这个#include<stdio.h>#include<stdlib.h>typedefstructg{intgcode;intecode;charname[2... 我的代码是这个#include <stdio.h>#include <stdlib.h>typedef struct g{ int gcode; int ecode; char name[20]; int num; float price;}Goods;struct Linker{ Goods link; struct Linker *next;};int main(){ int n=0,i,k; struct Linker *head,*p1,*p2; head = NULL; printf("请输入组数k:\n"); scanf("%d",&k); p1=p2=(struct Linker*)malloc(sizeof(struct Linker)); printf("请输入第一个商品编号:\n"); scanf("%d",&p1->link.gcode); printf("请输入商品类别编号:\n"); scanf("%d",&p1->link.ecode); printf("请输入商品名称:\n"); scanf("%s",p1->link.name); printf("请输入库存数量:\n"); scanf("%d",&p1->link.num); printf("请输入单价:\n"); scanf("%f",&p1->link.price); while(p1->link.gcode != 0); { n = n+1; if(n == 1) head = p1; else p2->next = p1; p2 = p1; p1=(struct Linker*)malloc(sizeof(struct Linker)); printf("请输入商品编号:\n"); scanf("%d",&p1->link.gcode); printf("请输入商品类别编号:\n"); scanf("%d",&p1->link.ecode); printf("请输入商品名称:\n"); scanf("%s",p1->link.name); printf("请输入库存数量:\n"); scanf("%d",&p1->link.num); printf("请输入单价:\n"); scanf("%f",&p1->link.price); } p2->next = NULL; p1 = head; while(p1 != NULL) { printf("商品编号:%d\t商品类别编号: %d\t商品名称: %s\t库存数量: %d\t单价:%f\n",p1->link.gcode,p1->link.ecode,p1->link.name,p1->link.num,p1->link.price); p1 = p1->next; } free(p1); return 0;}但我运行的时候运行到一半(如图)就进行不下去了,怎么回事? 展开
 我来答
自我编程
2020-03-18 · 科技优质答主
自我编程
采纳数:1481 获赞数:4283

向TA提问 私信TA
展开全部

错误:循环创建链表那里,while后面多了一个分号。

根据你代码意思我进行翻译:

在循环创建链表过程中p1表示新建的节点,head表示首节点,p2表示尾节点。

循环输入节点信息,直到编号输入0时结束循环。(变量k并没有使用)。

去掉分号,代码可运行。但代码冗余,可改进。

改进1:不必要的变量i,k删除。

改进2:你已经在循环中用n来判断首节点了,首节点的输入不要单独拉出来写。

改进3:循环控制你那样写,最后一次必须输入完整个节点的信息才能结束循环。而事实只要输入第一个成员做判断就行,所以用if语句加break来控制。

下面是根据你代码精简的代码,给你参考:

#include <stdio.h>

#include <stdlib.h>

typedef struct g

{

    int gcode;

    int ecode;

    char name[20];

    int num;

    float price;

}Goods;

struct Linker

{

    Goods link;

    struct Linker *next;

};

int main()

{

    int n=0;

    struct Linker *head,*p1,*p2;

    head = NULL;

    while(1)

    {

        p1=(struct Linker*)malloc(sizeof(struct Linker));

        printf("请输入商品编号:\n");

        scanf("%d",&p1->link.gcode);

        if(!p1->link.gcode)break;

        printf("请输入商品类别编号:\n");

        scanf("%d",&p1->link.ecode);

        printf("请输入商品名称:\n");

        scanf("%s",p1->link.name);

        printf("请输入库存数量:\n");

        scanf("%d",&p1->link.num);

        printf("请输入单价:\n");

        scanf("%f",&p1->link.price);

        n = n+1;

        if(n == 1)

            head = p1;

        else

            p2->next = p1;

        p2 = p1;


    }

    p2->next = NULL;

    p1 = head;

    while(p1 != NULL)

    {

        printf("商品编号:%d\t商品类别编号: %d\t商品名称: %s\t库存数量: %d\t单价:%f\n",p1->link.gcode,p1->link.ecode,p1->link.name,p1->link.num,p1->link.price);

        p1 = p1->next;

    }

    free(p1);

    return 0;

    }

追问
你好,我想通过输入值改变组数,该怎么改
追答
什么数组,你说的是字符串长度么,用动态申请,你不是已经会写malloc了么 。动态申请的内存还可以用realloc来改变大小。具体内容太多,你看看资料吧。或者在我回答记录里找找,我以前回答的问题里有不少用到这个,比如任意长度字符串输入。
另外,你上面代码,我忘记提醒你了,malloc在申请内存失败会返回NULL,你应该在使用这个地址之前,判断一下返回值是否为NULL,否则万一后面调用到NULL会出错。
听不清啊
高粉答主

2020-03-18 · 说的都是干货,快来关注
知道顶级答主
回答量:7.8万
采纳率:89%
帮助的人:1.9亿
展开全部

#include <stdio.h>

#include <stdlib.h>

typedef struct g

{ int gcode;

  int ecode;

  char name[20];

  int num;

  float price;

} Goods;

struct Linker

{ Goods link;

  struct Linker *next;

};

int main()

{ int n=0,i,k;

  struct Linker *head,*p1,*p2;

  head = NULL;

  printf("请输入组数k:\n");

  scanf("%d",&k);

  p1=p2=(struct Linker*)malloc(sizeof(struct Linker));

  printf("请输入第一个商品编号:\n");

  scanf("%d",&p1->link.gcode);

  printf("请输入商品类别编号:\n");

  scanf("%d",&p1->link.ecode);

  printf("请输入商品名称:\n");

  scanf("%s",p1->link.name);

  printf("请输入库存数量:\n");

  scanf("%d",&p1->link.num);

  printf("请输入单价:\n");

  scanf("%f",&p1->link.price);

  while(p1->link.gcode != 0) //这儿多了分号,就是只执行“空循环”了 

  { n = n+1;

    if(n == 1) head = p1;

    else p2->next = p1;

    p2 = p1;

    p1=(struct Linker*)malloc(sizeof(struct Linker));

    printf("请输入商品编号:\n");

    scanf("%d",&p1->link.gcode);

    printf("请输入商品类别编号:\n");

    scanf("%d",&p1->link.ecode);

    printf("请输入商品名称:\n");

    scanf("%s",p1->link.name);

    printf("请输入库存数量:\n");

    scanf("%d",&p1->link.num);

    printf("请输入单价:\n");

    scanf("%f",&p1->link.price);

  }

  p2->next = NULL;

  p1 = head;

  while(p1 != NULL)

  { printf("商品编号:%d\t商品类别编号: %d\t商品名称: %s\t库存数量: %d\t单价:%f\n",p1->link.gcode,p1->link.ecode,p1->link.name,p1->link.num,p1->link.price);

    p1 = p1->next;

  }

  free(p1);

  return 0;

}

本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
2公子小白
2020-03-18 · 超过21用户采纳过TA的回答
知道答主
回答量:84
采纳率:50%
帮助的人:21.5万
展开全部
麻烦你了解一下规矩,贴代码让人指点必须把格式弄好,这么乱怎么看
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
最大的宝宝
2020-03-18 · TA获得超过828个赞
知道小有建树答主
回答量:1569
采纳率:67%
帮助的人:399万
展开全部
while (p1->link.gcode != 0) 后面多了一个分号
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式