帮我看一下这个c语言程序为什么不对?
错误:循环创建链表那里,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会出错。
#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;
}