8.1上节课作业讲解
中级阶段:
二叉树和排序都会用到递归,我们要把他的思想掌握。
先要读取输入:
都我们的递归公式放在第二个return。
逻辑或||
也要结束条件:
使用归纳演绎法:
最后用result来存储但会结果
也可以直接在result处放函数表达式。
8.2结构体——结构体对齐——结构体数组(写数据结构的时候用到结构体的概率很高。)
1.结构体的定义,初始化,结构体数组
有时候需要要将不同类型的数组组合组合成一个整体,以便于引用。
例如一个学生由学号,姓名,性别,年龄,地址等属性,如果针对学生的学号姓名,年龄的等都单独定义一个变量,那么在有多名学生时,变量就难以分清。
为此,C语言提供结构体来管理不同类型的数据组合。(一个变量就可以访问这么多属性)
声明一个结构体类型的一般形式为:
结构体的关键字struct
结构体类型与整型,浮点类型,数组类型等不一样
别人并不知道你要把多少变量组合成一个结构体类型
先声明结构体的类型,再定义变量名:
结构体初始化
一定要对应上,而且结构体只能一个一个地去访问。
怎么将数据通过scanf读到struct里面
再强调一遍,跟python不一样的地方,字符是单引号,字符串是双引号。
%d等其他占位符会跳过空白符(空格,换行,制表位)
%c不会会存储空白符,所以要前面加上一个空格。
这里重新理解一下
请看上面的程序,我们输入100后,咦,怎么程序中止了,马上输入结果了? 但真的是终止了吗?别忘了,标准输入流中除了100外,还有一个换行符'\n'。 第一次scanf()读取了100后, 把'\n'留在了标准输入流,第二个scanf()就从输入流中获取换行符了
下面介绍结构体数组的使用即输入和输出:
struct student s; //定义结构体变量
先构造结构体数组:
struct student sarr[3]; //定义结构体数组变量
再通过for循环读取数据,再通过for循环输出数据:
构造输入数据如下:
1001 lele M 20 821.123 SHENZHEN
2000 lili F 19 99.12 BEIJING
2012 LEILEI M 23 213.1 Shanghai
执行结果如下:
2.结构体对齐:
对于考研初试完全没有必要,考研初试只需要记住一条,结构体的大小必须是最大成员的整数倍!
下面我们通过例子来实战:
size:4+20+1+4+4+30=63
但其实呢是68个字节
WHY:
数组不算,所以最大成员是4个字节。
由于char类型原来是一个字节,所以需要增加3个字节。
30不是4的整数倍,需要加上2.
63+3+2=68
20个字节正好是4的整数倍。
那结构体为什么要按照最大成员的倍数去对齐呢?
就是为了CPU高效的去取内存上的数据。
通过地址总线通知内存,内存通过数据总线传递数据。
(32位数据总线一次传输4个字节/64位一次传输8个字节)
浮点型分为两种:一种就是double占用8个字节,另外一种是float占用4个字节。
short和int都是整型,占用两个字节。
当其他类型(写在一起的)之和小于最大成员占用内存,可以归并为1个进行计算。
8.3结构体指针与typedef的使用
我们定义结构体变量的时候以前都是使用:
struct student s;
如果说我们不想写这么长
就可以写结构体指针
1.结构体指针(对考研来说非常重要)
一个结构体变量的指针(8个字节)就是该变量所占据的内存段的起始地址,可以设置一个指针变量,用它指向一个结构体的变量,此时该指针变量的值的是结构体的起始地址。指针变量也可以用来指向结构体数组的元素,从而能够通过结构体指针快速访问结构体内的每个成员。
开始跟之前一样,结构体数组的初始化
后面是主函数内定义结构体变量和结构体数组变量:
接着定义结构体指针
结构体指针在结构体s和结构体数组(sarr)中的练习:
在这里可以看到sizeof (s)的大小啊
2.typedef的使用(这也是考研初试中必须用的)
前面定义结构变量时使用的语句是struct student s,以这种方式来定义结构体变量,有些麻烦。
那么有没有简单一些的定义方式呢?
答案是肯定的,可以选择使用typedef声明新的类型来代替已有的类型名。
这是我们原来定义结构体变量的方式
我们可以使用typedef起别名
我们以前定义结构体变量的指针
struct student *p;
现在有两种方式:
局部变量可以结构体中的成员变量名相同,但是不可以与结构体变量相同。
//在数据结构中是必用typedef的(就是让我们的node变短)
struct student *p;
p=&s;
给int起别名。(特定的地方去使用)
8.4 C++的引用讲解
C++引用讲解(降低大家学习数据结构的难度)
C++布尔类型
1.C++的引用讲解
对于C++,首先新建源文件时,名字需要叫main.cpp,以cpp结尾,不能像我们之前那样叫main.c.
为什么王道数据结构都是用的C语言语法,但是额外用了C++的引用?
原因是很多数据结构都采用了这个做法,下面我们来看一下引用的便捷性。
在C语言中,函数定义变量时不能定义指针变量的。
以前呢我们是使用这样取地址的方式
OR
有了C++的结构接口之后,可以直接引用a。
什么是引用:
我在主函数中需要改变变量值的时候,在子函数中进行引用。
不需要的时候,就不需要在子函数中引用。
引用的底层原理与C是相同的。
上面是普通变量的引用,下面是指针变量的引用。
执行结果:
为什么需要使用C++引用呢:
因为如果使用C语言的话,就需要使用二级指针了。
初试机试用不着
2.C++的布尔类型
执行结果: