数据结构知识铺垫4:结构体

        本文介绍一下结构体。在C语言的学习中,我们认识了数组,它是由相同类型的变量排成一列所构成的变量集。数组有哪些应用场景?我们可以用数组来表示一类数据的集合,比如全班的成绩,假如班里有50个人,就可以用一个长度为50的整型数组来存储50个人的成绩。但是这还不够,很明显只有成绩的话,我们不知道这些成绩都是哪个同学的成绩。因此我们希望这些成绩都能与同学的名字一一对应(不考虑重名的情况)。结构体可以帮助我们解决这个问题。结构体是不同类型变量组合在一起构成的变量。比如对于每个同学的成绩,我们可以定义一个结构体,它有两个分量,一个是string类型的名字,这里为例简化研究的问题,我们用char类型代替;一个是int类型的分数。结构体有两种定义方法,我们先看第一种。

1. 结构体第一种定义方法

        结构体第一种定义方法格式:

typedef struct{
    int x;
    float y;
    char z;
}结构体名称;

图1. 结构体第一种定义方法

        如图为结构体的第一种定义方法,其中Score为结构体名,由我们自己定义,{}中的是结构体的各种变量,也是由我们根据问题需要进行定义,变量的个数没有限制。typedef struct {}; 则是结构体定义的固定格式,记住即可。这里我们定义了一个Score类型的结构体,它有name和score两个成员变量。现在我们有了Score类型的结构体变量,就可以存储我们想要的数据了。

  图2. 给结构体变量赋值1 

        如图,我们定义了三个Score类型的变量a,b,c,并给每个变量的各个分量都进行了赋值。注意C与C++均用“.”来访问结构体的成员变量。现在我们想办法把三个人的成绩组织起来,假如采用顺序存储方式,该怎么组织?显然是用数组。之前的数组都是int,float等类型的,现在我们定义了一个新的变量类型Score,故数组变量也应该是Score类型的。

图3. 定义结构体数组 

        如图,定义了一个长度为3的结构体数组mateScore[];并用它存储了a,b,c三个同学的信息。下面遍历访问并输出这个数组的信息。

图4. 遍历输出结构体数组信息 

输出结果如下图:

 图5. 输出结果1

2. 结构体第二种定义方法

        现在我们知道了结构体,可以用它来定义我们需要的新的变量类型,但是还有一个问题需要解决,那就是如何存储多个结构体变量。你肯定会说:用数组不就够了?在第一种定义方法中我们就是这么做的啊。用数组存储当然可以,但是注意数组是连续存储方式,如果我们要存储的结构体数据特别多,用在内存中可能找不到那么大的连续存储空间,用数组就不是很合适,这时就只能用非连续存储方式了,怎么用非连续存储方式存储一系列结构体变量?这就要用到结构体的第二种定义方法。

        结构体第二种定义方法格式:

typedef struct 结构体名称
{
    int x;
    float y;
    char z;
    struct 结构体名称 *p;
}结构体名称;

        如上,在结构体中,除了定义我们需要的变量以外,还多定义了一个变量,即指向我们所定义的结构体类型的指针。回想一下之前讲的指针,它前面的类型是修饰它所指向的数据的,这里也是一样的,*p前面的“struct 结构体名称”也是修饰它所指向的数据的,即p中保存了一个我们定义的结构体类型的数据的地址。有了指针,我们就可以根据指针取出下一个数据了,就不需要用数组了。

        这里仍以学生的成绩为例,用第二种定义方法存储学生成绩,为了简化问题,这里只考虑成绩,不考虑学生姓名。

 图6. 结构体第二种定义方法

        如图,score为学生成绩,next指向下一个结构体结点。这里将结构体名改为LNode,这也是我们在书中常常看到的定义形式。下面定义一些结点并赋值,然后输出这些结点信息。

 图7. 定义结点,赋值并输出

        如图,定义了4个结点,其中H为头结点,不存储任何信息。链表的结构为H→A→B→C。A,B,C的分数分分别为80,90,100。输出结果如下:

​​​​​​​​​​​​​​

图8. 输出结果2

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值