c语言的问题,和结构体有关,希望大神能帮忙解答

就是一个 信息系统,func1的功能是信息录入,学号num为零的表示结束录入,主函数就先不谢了,后面有错误信息,前面用结构体录入了学号,名字,性别,年龄,科目成绩
#include <stdio.h>
#include <malloc.h>
#define LEN sizeof(struct student)
#define NULL 0
struct score /*用来记录各科成绩准备后面补充的*/
{
int math;

};
struct student /*声明一个结构体用来记录学生信息*/
{
int num;
char name[20];
char sex;
int age;
struct score subject;
struct student *next;
};

void funct1()
{
printf("请录入学生信息,学号为0代表录入完成\n");
struct student *p1,*p2;
struct student.subject math;
p1=p2=( struct student*) malloc(LEN); /* 从这里开始时想做第一个信息录入*/
printf("请输入学号\n");
scanf("%d",&p1->num);
printf("\n请输入该生姓名");
gets(p1->name);
printf("\n请输入该生性别\n");
for(;p1->sex=='f'||p1->sex=='m';)
{
p1->sex=getchar();
printf( "\nerror,please input again:\n");
}
printf("\n请输入该生年龄\n");
scanf("%d",&p1->age);
printf("\n请输入该生成绩,以逗号隔开\n");
scanf("%f",&p1->subject->math); /*到这里让p1指向第一组数据结束*/
head=NULL;
while (p1->num!=0) /*循环跳出的条件是学号num为零*/
{
n=n+1;
if(n==1)head=p1;
else p2->next=p1;
p2=p1;
p1=(struct student*) malloc(LEN);
printf("请输入学号\n");
scanf("%d",&p1->num);
printf("\n请输入该生姓名");
gets(p1->name);
printf("\n请输入该生性别\n");
for(;p1->sex=='f'||p1->sex=='m';)
{
p1->sex=getchar();
printf( "\nerror,please input again:\n");
}
printf("\n请输入该生年龄\n");
scanf("%d",&p1->age);
printf("\n请输入该生成绩,以逗号隔开\n");
scanf("%f",&p1->subject->math);
}
p2->next=NULL;
}

以下是错误信息,好像一直都是一个地方出错
:\新建文件夹\student information.c(6) : warning C4005: 'NULL' : macro redefinition
d:\microsoft visual studio\vc98\include\stdio.h(212) : see previous definition of 'NULL'
D:\新建文件夹\student information.c(26) : error C2143: syntax error : missing ';' before 'type'
D:\新建文件夹\student information.c(27) : error C2143: syntax error : missing ';' before 'type'
D:\新建文件夹\student information.c(28) : error C2065: 'p1' : undeclared identifier
D:\新建文件夹\student information.c(28) : error C2065: 'p2' : undeclared identifier
D:\新建文件夹\student information.c(28) : warning C4047: '=' : 'int ' differs in levels of indirection from 'struct student *'
D:\新建文件夹\student information.c(30) : error C2223: left of '->num' must point to struct/union
D:\新建文件夹\student information.c(32) : error C2223: left of '->name' must point to struct/union
D:\新建文件夹\student information.c(32) : error C2198: 'gets' : too few actual parameters

#include <stdio.h>
#include <malloc.h>
#define LEN sizeof(struct student)
#define NULL 0

char *head;//补充的定义
int n; //补充的定义

struct score /*用来记录各科成绩准备后面补充的*/
{
int math;

};
struct student /*声明一个结构体用来记录学生信息*/
{
int num;
char name[20];
char sex;
int age;
struct score subject;
struct student *next;
};

void funct1()
{
printf("请录入学生信息,学号为0代表录入完成\n");
struct student *p1,*p2;
//struct student.subject math;这句话有问题!! student.subject不是一个关键字。直接调用p1.subject.math即可
p1=p2=( struct student*) malloc(LEN); /* 从这里开始时想做第一个信息录入*/
printf("请输入学号\n");
scanf("%d",&p1->num);
printf("\n请输入该生姓名");
gets(p1->name);
printf("\n请输入该生性别\n");
for(;p1->sex=='f'||p1->sex=='m';)
{
p1->sex=getchar();
printf( "\nerror,please input again:\n");
}
printf("\n请输入该生年龄\n");
scanf("%d",&p1->age);
printf("\n请输入该生成绩,以逗号隔开\n");
scanf("%f",&p1->subject.math); /*到这里让p1指向第一组数据结束*/ //scanf("%f",&p1->subject->math);这句话有问题!!subject是指针,math不是,不能混用
head=NULL;//这句话有问题,head未定义!! 帮你补充在函数程序开头了!
while (p1->num!=0) /*循环跳出的条件是学号num为零*/
{
n=n+1;//这句话有问题,n未定义!! 也是随便补充一下了~
if(n==1)head=p1;
else p2->next=p1;
p2=p1;
p1=(struct student*) malloc(LEN);
printf("请输入学号\n");
scanf("%d",&p1->num);
printf("\n请输入该生姓名");
gets(p1->name);
printf("\n请输入该生性别\n");
for(;p1->sex=='f'||p1->sex=='m';)
{
p1->sex=getchar();
printf( "\nerror,please input again:\n");
}
printf("\n请输入该生年龄\n");
scanf("%d",&p1->age);
printf("\n请输入该生成绩,以逗号隔开\n");
scanf("%f",&p1->subject.math);//同上!!!
}
p2->next=NULL;
}

//不知道你到底要干什么,但是你的BUG解决了~~~追问

谢谢大神~~~~~~···(写得那么乱还拿出来丢人)
可是我加了定义(好奇问一下,Head不是应该指向我定义引用p1.subject. math的地方都删了,结果还是有bug

追答

...........................................................
一般的说head不是应该是链表的首个节点的地址么??

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-05-23
typedef struct /*声明一个结构体用来记录学生信息*/
{
int num;
char name[20];
char sex;
int age;
struct score subject;
struct student *next;
}student;
第2个回答  2011-05-21
struct student *p1,*p2;
该为
student *p1,*p2;
试一试。追问

试过了,错误就增加了

C语言结构体编程题,求助大神啊
根据题意:一、教师信息定义为结构体,其成员年月也为结构体(可直接定义成两个成员变量,本题没有强制要求),婚姻状态采用共用体类型。二、输入信息直接写在main函数,实际软件开发应单独写输入函数,输入验证我只写了性别和婚姻状态的验证,其余成员的输入验证需要自己添加。(实际开发,验证也应单独写...

C语言,结构体问题?所占内在字节数,怎么算的???
在c语言中如何计算结构体长度和共用体长度?结构体的长度等于体内各个成员变量长度之后。如此题长度为字符串数组的长度加上两个int型变量的长度,再加上double长度,最后结果为10+2+2+8=22。解析:char 每个字符占一个字节(因为是一个十长度的字符数组)所以是10字节,int占两个字节,double占8个字节...

c语言结构体问题,
在下面代码中就可以直接单独使用student_type来定义结构体变量。在c++里很简单,直接 struct Student { int a;};于是就定义了结构体类型Student,声明变量时直接Student stu2;C语言中使用:typedef struct Student { int a;} 在声明变量的时候:可以直接Student stu1;(但是没有typedef就必须用struct ...

C语言,有关结构体变量占几个字节的问题
float 是浮点型占4个字节,char占一个字节,char c[4] 是数组共占4个字节,则r共占8字节

请问下C语言中的结构体有什么用
结构体作用:结构体和其他类型基础数据类型一样,只不过结构体可以做成你想要的数据类型。在实际项目中,结构体是大量存在的,研发人员常使用结构体来封装一些属性来组成新的类型,结构体在函数中最主要的作用就是封装,封装的便利是可以再次利用,再次使用的时候只要根据定义使用就可以,结构体可以定义一些...

C语言,结构体题目,怎么做,求大神修改一下
已经修改完成:include<stdio.h> include<stdlib.h> struct Student { int num;char name[20];char sex;int age;float chinese;float math;float english;};int main(){ struct Student stu[4]= { {1,"zhangshan",'M',20,86.3,88.5,78.5},{2,"lisi",'F',18,78.5,76.3,68.5}...

...我不理解这个题怎么求得的,求大佬帮忙解答...详解
根据结构体数组的定义可知:cnum[0].x=1;cnum[0].y=3;cnum[1].x=2;cnum[1].y=7;因此,cnum[1].y\/cnum[0].y*cnum[1].x =7\/3*2 =2*2 =4 以上7\/3之所以等于2是因为cnum[1].y和cnum[0].y都是整数,发生的是整除。

c语言结构体问题,27,26求详解,程序如下
26题:1,rec[10]代表的是建立1个结构体数组,数组的元素是结构体;2、*pr=rec,这语句是pr是结构体指针,指向数组第一个元素,也就是rec[0];所以,A选项就错在,它没有明确是数组的哪个结构体,应该跟D选项一样;BC都是利用的指针,没毛病。27题:student 只是结构体名称,而,stu1,*p是结构...

C语言结构体问题
pn->b\/n.a*(++pn)->b 你肯定认为 (++pn)->b 是指向 c (也就是5.0)的吧 你试着运行 同样错 结果为0 根本原因:知识点理解---指针类型(此处为结构体指针)struct x *pn 代表了pn是一个指向 struct x 类型的指针,所以,当 执行 (++pn)时,pn指针指向的地址增加的数量 ...

关于c语言中结构体的一点小问题
%c, 输入一个数组元素 加 &:char str[80]; i=0; scanf("%c", &str[i]); 拍入 A, str[i] 获得 字符常量 'A' (单引号)。你的 &student1.num,student1.name,&student1.score 这里成员name 是 char 数组,student1.name 已是字符串首地址,不能再加 &。

相似回答