1.结构体的常用形式及注意事项
注意:
1.1结构体类型,可以定义在 函数里面,但是此时作用域就被限定在改函数中
1.2结构体的定义的形式:
形式1 先定义类型,后定义变量
struct stu
{
...
};
struct stu s;
形式2 定义类型的同时定义变量
struct stu
{
...
}s1,s2,*s3,s4[10];
struct stu s;
形式3 省略了类型名 --如果只用一次,可以这样写
struct
{
...
}s1,s2,*s3,s4[10];
------------------------------
自然边界对齐
int -- 4字节 --- 能被4整除的地址编号上
short -- 2字节 --- 能被2整除的地址编号上
char -- 1字节 --- 能被1整除的地址编号上
结构体整体对齐
一般是以结构体
2.共用体概念及注意事项
union 共用体名
{
成员列表; //各个变量
}; //表示定义一个共用体类型
注意:
1.共用体
初始化 --- 只能给一个值,默认是给到第一个成员变量的
2.共用体成员变量辅助
共用体用的数据最终存储的 --- 应该是最后一次给到的值。
但是只能影响到 自己数据类型对应的空间中的数据
3.可以判断大小端
4.实际用途
a.节省空间
b.进行数据转换
192.168.1.169 //ip本质是个 32位的数值
5.共用体的大小 --是成员变量中最大的那个成员的大小
6.共用体类型可以是函数参数,也可以是函数返回值类型 。
共用体,结构体类型定义出来之后,
a.定义变量
b.定义数组
c.定义指针
d.做函数参数,返回值类型
3.枚举
在使用 case1 表示 星期一时,会出现代码可读性差,出现魔数幻数,不知其含义
所以需要用枚举功能,做到名称替换。
enum 枚举类型名
{
sun, //名字 --- 代表一个值 --- 符号常量
mon,
tue,
wed,
thu,
fri,
sat
};
注意:
1.枚举 提高了代码可读性
2.枚举 本质上是 int类型
枚举 与 整型 类型兼容
3.不足
因为枚举类型 --- 本质上是个整型类型,
所以枚举类型的变量的值,并不能真正限定在指定的哪些值范围中
4.枚举类型
可以做函数 形参 和 返回值
定义数组也可以,本质上就是整型数据
4.链表
链表
数据结构:
数据的组织形式 (逻辑上理解的形式)
数组:
int a[10] = {1,2,3,4,5,6,7,8,9,10}; //连续性,有序性,单一性
数据组织形式 ---会决定使用数据的算法
数组: //顺序表
优点:
随机访问 方便
缺点:
增加数据 不方便
删除数据 不方便
链表 (狗链 找数据)
链式的数据表
优点:
增加 删除数据很方便
缺点:
找数据不大方便
计算机中:
计算机如何体现链式数据结构
[数据1]
[数据2]
存放链式数据的结构:
节点
[数据|另外一个节点指针]
[数据1|指针] ------->节点
[数据2|指针]
[数据3|指针]
------->[数据域|指针域]
学生信息
节点:
struct Node
{
//数据域
struct stu s;
//指针域
struct Node *p; //指针类型
};
//一个节点
数据结构对应算法 --- 操作
2.增加数据 方便
3.删除数据 方便
操作:
1.创建一个链表 -- 空链表
//有头链表 --可以更方便的处理链表
//无头链表
c语言阶段:
有头 单向链表
空链表:
特点:
只有头节点
并且头节点的指针域 为NULL //相当于是尾节点
struct Node head = {0,NULL};
struct Node *p = &head;
2.插入
创建一个新的节点
节点链接起来 尾插
思路:
s1.创建一个新的节点
struct Node *pNew = malloc(sizeof(struct Node));
//放在了堆区
s2.找到尾节点
struct Node *p = &head; //此时p在头节点
while( p->next != NULL )
{
p = p->next; //让p指向下一个节点
}
s3.链接到尾节点后面
p->next = pNew;
pNew->next = NULL; //尾节点
void pushBack(struct Node *head)
{
s1.创建一个新的节点
struct Node *pNew = malloc(sizeof(struct Node));
//放在了堆区
//
s2.找到尾节点
struct Node *p = head; //此时p在头节点
while( p->next != NULL )
{
p = p->next; //让p指向下一个节点
}
s3.链接到尾节点后面
p->next = pNew;
pNew->next = NULL; //尾节点
}
int length(struct Node *head)
{
//统计有效节点的个数
}
//头插
void pushFront(struc Node *head,int data)
{
//1.创建新节点
pNew
//2.链接
pNew->next = p->next;
p->next = pNew;
}