程序设计与C语言学习笔记_第八章结构体、公用体、枚举
来源:互联网 发布:php工程师工作内容 编辑:程序博客网 时间:2024/06/13 18:08
第8章 结构体、共用体及枚举类型
8.1 结构体类型
8.1.1 结构体变量的定义与初始化
1. 结构体类型的概念与定义
1) 概念:描述对象不同侧面的数据结构称为结构体类型。
2) 定义:
struct date
{
int year;
int month
int day;
};
(1) struct date:struct是结构体类型关键字;date为结构体名,在某些情况场合能够省略。
(2) 结构体类型可以进行嵌套定义,但不能递归定义。
(3) 定义最后的分号“;”,不要忘记。
2. 结构体变量的概念与定义
1) 概念:结构体变量是对一个具体的结构体类型实现,就如int i;int为类型,i为变量。
2) 定义:
(1) struct date date1
(2) struct date
{
int year;
int month;
int day;
}date1;
(3) struct
{
int year;
int month;
int day;
}date1;
(4) typedef struct
{
int year;
int month;
int day;
}DATE;
(5) 方法(2)即定义的类型名又定义了变量,以后还可以继续用方法(1)定义新的变量,而方法(3)就不能再定义新的变量了,因为没有结构体类型名。
3. 结构体变量赋初值
1) 方括号赋初值:struct student stu1={2001,“yin”,18,64};
2) 对每个分量引用后逐个赋值。
3) 结构体变量之间可以进行赋值操作,如stu1=stu2;
4. 结构指针变量的定义
1) 定义:struct student stu1, * p;p=&stu1
2) 要注意的问题:
(1) 结构体变量名不代表结构体首地址,只代表此结构体,和一般数据类型一样,如int/float等。
5. 结构体变量的内存分配
1) 按照结构体分量定义的先后次序,先出现的分量在上面,地址小;后出现的分量在下面,地址大。
2) sizeof(结构体名/结构体类型),得到的结果是此结构体所有分量占的总的字节数。
8.1.2 结构体数组及结构体分量的引用
1. 结构体数组
1) 定义:struct date date1[3];
2. 对结构体分量的引用
1) 点运算符引用:
(1) <结构体变量名>.<分量名>
(2) (<*结构体指针>).<分量名>
2) 指向运算符引用:<结构体指针变量>-><分量名>
3. 二维结构体数组
8.1.3 结构体变量和结构体指针作函数参数
8.1.4 类型别名定义typedef
1. 为了简化书写,便于阅读,对复杂类型设置类型别名;typedef <原类型名> <新类型名>
8.2 动态数据结构(由结构体构造的数据结构)
8.2.1 动态分配内存
1. malloc函数
1) 函数原型:void * malloc(unsigned size)
2) 功能:在内存中开辟size个字节大小的连续空间。返回值为该空间的起始地址。若分配不成功,则返回0/NULL值。
3) void *:
(1) 表示空类型或抽象类型的指针,一般用作指针类型转换时的过渡形式。如果想让开辟的内存空间中存放某种类型的数据,就把void *强制转换成指向该类型的指针。
(2) void *和指向NULL或0的空指针不一样。
2. calloc函数
1) 函数原型:void * calloc(unsigned n,unsigned size)
2) 功能:在内存中开辟n个大小为size个字节的连续空间。返回值为该段空间的起始地址。若分配不成功,则返回0/NULL值。
3. free函数
1) 函数原型:void free(void * p)
2) 功能:释放p所指的内存空间,无返回值
3) 需要注意的问题:
(1) void *是一种过渡形式,也可以看作是任何类型的指针。
(2) 以上三个函数都是在头文件stdio.h中定义的。
(3) 在子函数中用以上三个函数建立的内存空间,不会随函数调用的结束而被收回。
4. sizeof运算符
8.2.2 链表
1. 链表的概念
1) 链表是用链表指针连在一起的自引用结构(结点)的线性集合,其中head是指向链表第一个结点的指针,通过它来访问链表;后面的结点是通过它前面结点中的连接指针来访问的;链表的最后一个结点中的连接指针被置为NULL。
2) 动态的链表和静态的数组的对比
2. 建立链表
1) 建立结点的结构体类型,并将此结构体类型名重命名:
struct node
{
int date;
struct * node;//这个不算递归定义
};
typedef struct node Node
2) 建立头指针:Node * h=NULL;建立了头指针,就相当于建立了链表。
3) 依次输入结点,需要以下三个工作指针:
(1) h:头指针。
(2) p1:指向当前结点的指针。
(3) p2:指向前一个结点的指针。
3. 输出链表
4. 插入结点
1) 插入结点分为以下四种情况:
(1) 空表情况/插在表中
(2) 插在表中/插在表尾
2) 需要以下三个工作指针:
(1) h:头指针。
(2) p1:指向当前结点的指针。
(3) p2:指向前一个结点的指针。
(4) newp:指向要被插入的结点。
5. 删除结点
1) 空表情况
2) 删除表头的结点
3) 删除表中或表尾结点
8.2.3 堆栈
1. 堆栈类型的概念
1) 堆栈是一种受限制的链表,即添加和删除只能从一段进行。其中栈顶指针是指向堆栈的最上面结点的指针,通过它来访问堆栈。具有后进先出的特点(LIFO)。
2) 在赋值、插结点、删结点等操作中,栈顶指针会变化。链表的头指针也可能会变化。当函数中头指针和栈顶指针的值变化时,可使用return或通过二级指针传址调用。
3) 一般情况下,只有栈顶指针,没有栈底指针。
2. 建立堆栈
1) 建立结点的结构体类型,并将此结构体类型名重命名:
struct stackNode
{
int date;
struct stackNode * next
};
typedef struct stackNode snode;//堆栈指针
typedef snode * snodep;//二级指针,指向堆栈指针的指针
2) 建立栈顶指针:snode * top=NULL; 建立了top指针,就相当于建立了堆栈。
3) 输入和输出结点(push/pop函数)
3. push和pop函数的定义
1) push函数:使用top指针的二级指针。
2) pop函数::也使用top函数的二级指针,返回结点的值。事先判断是否为空堆栈。
8.2.4 队列
1. 队列的概念:
1) 队列也是一种受限的链表,即FIFO的数据类型。对队列进行操作需要两个指针,一个指向队列头部(headp),另一个指向队列尾部(tailp)。
2. 建立队列
1) 建立结点的结构体类型,并将此结构体类型名重命名:
struct queuenode
{
int date;
struct queuenode * next
};
typedef struct queuenode Qnode;//队列指针
typedef snode * Qnodep;//二级指针,指向队列指针的指针
2) 建立队头指针和队尾指针:Qnode * headp=null,tailp=null; 建立了headp和tailp指针,就相当于建立了队列。
3) 输入和输出结点:enqueue/dequeue函数
3. 入列和出队函数的定义
1) enqueue函数
2) dequeue函数:也需要事先判断队列是否为空。
8.2.5 二叉树
1. 二叉树的概念
1) 一种递归的数据结构,因此在处理的时候,常使用递归方法,代码简洁,处理高速。
2. 创建二叉树
1) 建立结点的结构体类型,并将此结构体类型名重命名:
struct treeNode
{
struct treeNode * leftp;
int date;
struct treeNode * rightp;
};
typedef struct treeNode treeN;
typedef treeN treeNp;
2) 建立树根指针:treeN * treep;建立了treep,将相当于建立了二叉树。
3) 输入和输出结点:insert函数和inoder函数。
3. 插入结点函数和遍历结点函数的定义
1) 插入结点函数:递归方法插入。
2) 遍历结点函数:递归方法输出。
8.3 共用体
1. 共用体的概念:变量共用一段内存空间,轮流对内存空间进行使用,减少空间的浪费,是一种新型的数据类型。
8.4 位段
1. 位段的概念:为了节约内存,C语言允许以位而不是字节为单位来定义整型变量或无符号整型变量的大小,这些用存储位表示的变量称为位段。
2. 位段的定义:usigned a:4;a为占四位的无符号整型位段变量。int b:4;b为占4位的整型位段变量。
3. 需要注意的问题:
1) 1位的位段变量,必须定义为unsigned类型。
2) 对于不指定名字的位段,表示不使用它的空间。
3) 宽度为0的无名段,使下一位段从新存储单元开始存储。
8.5 枚举类型
1. 枚举类型的概念:以标识符表示的有限个整型常量的集合,使变量能够“直呼其名,见文生义”。
2. 枚举类型的定义:enum months{jan=1,fed,apr,…}
3. 需要注意的问题:
1) 标识符是int类型,默认从0开始,递增1。
各标识符的值在前一个值的基础上加1。
- 程序设计与C语言学习笔记_第八章结构体、公用体、枚举
- 程序设计与C语言学习笔记_第三章第4章 语句及控制结构
- 程序设计与C语言学习笔记_第六章数组
- 程序设计与C语言学习笔记_第七章指针
- C语言学习笔记-结构体、共用体、枚举
- 【C语言学习笔记】结构体、枚举、预处理指令
- c语言学习笔记之结构体,枚举
- c语言学习笔记之结构体和枚举
- C语言学习笔记10-结构体、枚举、联合体
- 程序设计与C语言学习笔记_第三章C语言基础知识
- C语言学习笔记:22_结构体
- 程序设计与C语言学习笔记_第十章编译预处理与位运算
- c语言基础知识_结构体访问,共同体,枚举类型
- C语言基础六_结构体、枚举
- 黑马程序员—C语言_结构体、枚举
- 程序设计与C语言学习笔记_第五章函数_1
- 程序设计与C语言学习笔记_第五章函数_2
- 程序设计与C语言学习笔记_第九章文件处理
- 程序设计与C语言学习笔记_第七章指针
- 安卓开发学习资源:控件+图标
- GCC编译器详解
- HDU2577 How to Type
- 寒假篇30
- 程序设计与C语言学习笔记_第八章结构体、公用体、枚举
- CSS margin属性详解
- 除夕
- 程序设计与C语言学习笔记_第九章文件处理
- ES6 Generators基本概念
- JDK动态代理实现原理
- 2017的第一篇总结(好像是)2.11
- 2017年小目标
- leetcode -- 222. Count Complete Tree Nodes【子问题划分】