跟着视频做的题目,建立师生链表(结构体+共同体)出现了问题,请求帮助!谢谢
//编辑器软件为C-Free;//输出时 共用体部分数据出现乱码单步调试后不清楚什么问题
//源代码如下看过视频的小伙伴 基本都知道方法
#include<stdio.h>
#include<malloc.h>
#include <stdlib.h>
#define LEN sizeof(struct somebody)
static int n=0,i=0,j=0;//全局变量 记录总人数 分别学生和老师人数
struct somebody
{
int num;
char name;
int age;
char sex;
char job;
union{
int Class;
char room;
}pos;
struct somebody *next;
};
struct somebody *creat();//建立链表并输入
void print(struct somebody *head);//打印链表
int main()
{
struct somebody *head;//获得返回值
head=creat();
print(head);
printf("\n\n");
system("pause");
}
struct somebody *creat()
{
struct somebody *head,*p1,*p2;
p1=(struct somebody *)malloc(LEN);
printf("请输入编号:");
scanf("%d",&(p1->num));
if(p1->num!=0)
{
do{
printf("分别输入名字、年龄、性别(M/F)、职业(s/t),以空格间隔\n");
scanf("%s %d %s %s",&p1->name,&p1->age,&p1->sex,&p1->job);
if(p1->job=='s')//判断job
{
printf("请输入教室编号:");
scanf("%d",&p1->pos);
i++;
}
if(p1->job=='t')
{
printf("请输入办公室名称:");
scanf("%s",&p1->pos);
j++;
}
n=i+j;//总人数
if(n==1)//头结点
{
head=p1;
p2=p1;
}
else
{
p2->next=p1;//链表的延长
p2=p1;
}
p1=(struct somebody *)malloc(LEN);
printf("请输入编号:");
scanf("%d",&p1->num); //下一节点开始
}while(p1->num!=0);//DO循环结束
p2->next=NULL;//结束
}
else head=NULL;
if(head==NULL)
printf("未建立链表\n");
return head;
}
void print(struct somebody *head)
{
struct somebody *p;
p=head;
if(p)//判断是否为空表
{
printf("\n");
printf(" num\tname\tage\tsex\tjob\tposition\n");
while(p)
{
printf(" %d\t%s\t%d\t%c\t%c\t%s",p->num,p->name,p->age,p->sex,p->job);
if(p->job=='s')
{
printf("%d\n",p->pos.Class);//问题出现在这?自己搞不明白了
}
if(p->job=='t')
{
printf("%s\n",p->pos.room);
}
p=p->next;
}
printf("共计%d名师生,其中教师%d人,学生%d人。\n",n,j,i);
}
else
{ printf("空表");}
}
你可能没有理解UNION的含义
你这个结构里没有必要用到UNION
什么时候用UNION?当某个字段可能出现多种数据类型时,则需要用到UNION
而你的 int class 和 char room是两个意义不同的字段,为什么要用UNION?
举个用UNION的例子
typedef struct tagTeacher
{
int nID; //编号
char name; //姓名
boolsex; //性别
int age; // 年龄
charlesson; //教授课程
}TEACHER, *LPTEACHER;
typedef struct tagStudent
{
intnID; //学号
charname ; //名称
boolsex; //性别
int age; //年龄
int class; //班级
charroom; //教师
}STUDENT, *LPSTUDENT;
上面定义了两个结构,一个表示教师,一个表示学生。
如果我们想用一个结构同时表示学生和老师怎么办?
typedef uniontagTeacherStudent
{
longaaa; //为了说明union,另外定义了一个long
TEACHERt;
STUDENT s;
}TS,*LPTS;
我们看结构 TEACHER 和 STUDENT结构
STUDENT结构比TEACHER多一个 int 字段
因此有:
sizeof(STUDENT) > sizeof(TEACHER) > sizeof(long)
union 的大小 = 最大的字段的大小
此时
sizeof(TS) = sizeof(STUDENT)
定义一个变量
TS a;
这个 a 只能表示一个东西
要么用 a.aaa 表示一个 long
要么用a.t 表示一个 TEACHER
要么用a.s 表示一个 STUDENT
他们的地址空间是重叠的。
看下面代码:
TS a;
TEACHERt1={...};
STUDENT s1 = {...};
long l1 = 100;
;给a赋值
a.aaa = l1;
a.t = t1;
a.s = s1;
因为union的地址空间是重叠的。
所以经上面三条语句后,实际有效的只有最后一条 a.s = s1;
a.aaa 与 a.t 都被 覆盖了。不是原来的值。
不知道我说明白了没有。
不好意思,我看错了,代码好像没什么问题。 问题出在这一句
printf(" %d\t%s\t%d\t%c\t%c\t%s",p->num,p->name,p->age,p->sex,p->job);
有6个%
应该是
printf(" %d\t%s\t%d\t%c\t%c\t",p->num,p->name,p->age,p->sex,p->job); xieglt 发表于 2016-12-2 13:23
你可能没有理解UNION的含义
你这个结构里没有必要用到UNION
什么时候用UNION?当某个字段可能出现多种数 ...
您说的 这个共用体我知道他存在的形式以及引用方法,您说的很好,我代码打得不多,只是跟着视频做的!简单改动了丢丢,就是不清楚输出时为什么出现了乱码,难道是p->pos.roomor p->pos.Class 指向的值有问题?代码我单步调试没有问题,我用的C-Free编译,您用您的编译器什么结果啊?会不会出现我的这种问题?谢谢您的回答! xieglt 发表于 2016-12-2 15:13
问题出在这一句
printf(" %d\t%s\t%d\t%c\t%c\t%s",p->num,p->name,p->age,p->sex,p->job);
有6个%
好的我去试试!如果没问题那真的是代码敲得太少了,调试的天少了!谢谢 xieglt 发表于 2016-12-2 15:13
问题出在这一句
printf(" %d\t%s\t%d\t%c\t%c\t%s",p->num,p->name,p->age,p->sex,p->job);
有6个%
谢谢刚才试过了,您的指正对了,我可能急功近利了,细节还需要注意,我分析点一直在数据引用上是否出现问题,忘记了检查输出函数的内容,确实是问题的所在!谢谢!十分感谢! 不懂
页:
[1]