slmdunk 发表于 2016-12-1 22:39:14

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

//编辑器软件为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("空表");}
}

xieglt 发表于 2016-12-2 13:23:21

你可能没有理解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 都被 覆盖了。不是原来的值。

不知道我说明白了没有。

xieglt 发表于 2016-12-2 13:57:02

不好意思,我看错了,代码好像没什么问题。

xieglt 发表于 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);

slmdunk 发表于 2016-12-2 21:17:27

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

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

slmdunk 发表于 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个%


好的我去试试!如果没问题那真的是代码敲得太少了,调试的天少了!谢谢

slmdunk 发表于 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个%


谢谢刚才试过了,您的指正对了,我可能急功近利了,细节还需要注意,我分析点一直在数据引用上是否出现问题,忘记了检查输出函数的内容,确实是问题的所在!谢谢!十分感谢!

15701168680 发表于 2017-1-4 16:50:26

不懂
页: [1]
查看完整版本: 跟着视频做的题目,建立师生链表(结构体+共同体)出现了问题,请求帮助!谢谢