鱼C论坛

 找回密码
 立即注册
查看: 1896|回复: 7

跟着视频做的题目,建立师生链表(结构体+共同体)出现了问题,请求帮助!谢谢

[复制链接]
发表于 2016-12-1 22:39:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
//编辑器软件为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[10];
        int age;
        char sex;
        char job;
     union{
                int Class;
                char room[8];
              }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("空表");}
}

结果出现如图

结果出现如图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-12-2 13:23:21 | 显示全部楼层
你可能没有理解UNION的含义
你这个结构里没有必要用到UNION
什么时候用UNION?当某个字段可能出现多种数据类型时,则需要用到UNION
而你的 int class 和 char room[8]是两个意义不同的字段,为什么要用UNION?
举个用UNION的例子

typedef struct   tagTeacher
{
         int      nID;         //编号
         char   name[8]; //姓名
         bool  sex;         //性别
         int     age;        // 年龄
         char  lesson[8]; //教授课程
}TEACHER, *LPTEACHER;

typedef struct tagStudent
{   
        int  nID;       //学号
        char  name[8] ; //名称
        bool  sex;        //性别
        int    age;         //年龄
        int    class;       //班级
        char  room[8]; //教师
}STUDENT, *LPSTUDENT;

上面定义了两个结构,一个表示教师,一个表示学生。
如果我们想用一个结构同时表示学生和老师怎么办?

typedef union  tagTeacherStudent
{
         long  aaa;                   //为了说明union,另外定义了一个long
         TEACHER  t;
         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;
TEACHER  t1={...};
STUDENT s1 = {...};
long l1 = 100;

;给a赋值
a.aaa = l1;
a.t = t1;
a.s = s1;

因为union的地址空间是重叠的。
所以经上面三条语句后,实际有效的只有最后一条 a.s = s1;
a.aaa 与 a.t 都被 覆盖了。不是原来的值。

不知道我说明白了没有。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-2 13:57:02 | 显示全部楼层
不好意思,我看错了,代码好像没什么问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-2 15:13:13 | 显示全部楼层
问题出在这一句
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);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-12-2 21:17:27 | 显示全部楼层
xieglt 发表于 2016-12-2 13:23
你可能没有理解UNION的含义
你这个结构里没有必要用到UNION
什么时候用UNION?当某个字段可能出现多种数 ...

您说的 这个共用体我知道他存在的形式以及引用方法,您说的很好,我代码打得不多,只是跟着视频做的!简单改动了丢丢,就是不清楚输出时为什么出现了乱码,难道是p->pos.room  or p->pos.Class 指向的值有问题?代码我单步调试没有问题,我用的C-Free编译,您用您的编译器什么结果啊?会不会出现我的这种问题?谢谢您的回答!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-2 21:19:04 | 显示全部楼层
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个%

好的我去试试!如果没问题那真的是代码敲得太少了,调试的天少了!谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-2 21:22:53 | 显示全部楼层
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个%

谢谢  刚才试过了,您的指正对了,我可能急功近利了,细节还需要注意,我分析点一直在数据引用上是否出现问题,忘记了检查输出函数的内容,确实是问题的所在!谢谢!十分感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-4 16:50:26 | 显示全部楼层
不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-27 20:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表