复习与补充 结构体类型与链表 1、结构体类型的定义与结构体变量 2、结构体指针 3、自定义数据类型 4、链表的概念与形成链表的基本要素 5、链表的操作:创建、插入、删除
复习与补充二 1、结构体类型的定义与结构体变量 2、结构体指针 3、自定义数据类型 4、链表的概念与形成链表的基本要素 5、链表的操作:创建、插入、删除 结构体类型与链表
1、结构体类型的定义与结构 体变量 结构体类型是一种构造性类型,可以将不同类型的数据项作为一个整体 来操作,且数据项可以是不同的数据类型,可以是基本数据类型,也可以是 构造数据类型 格式 定义格式: struc t结构体名{ 例 struct person 数据类型1数据项标识: char name[20] 数据类型2数据项标识2 int age char sex ong num, char address[20: struct person p1
1、结构体类型的定义与结构 体变量 结构体类型是一种构造性类型,可以将不同类型的数据项作为一个整体 来操作,且数据项可以是不同的数据类型,可以是基本数据类型,也可以是 构造数据类型。 • 格式 定义格式: struct 结构体名 { 数据类型1 数据项标识1; 数据类型2 数据项标识2; …… }; 例: struct person { char name[20]; int age; char sex; long num; char address[20]; }; struct person p1;
定义结构体类型变量的方法 定义结构体变量有几种方法 1、先定义结构体类型,再定义结构体变量; struct s int a; float f struct sx, y 2、同时定义结构体类型和变量; struct s int a; float fx, y 3、不指定结构体类型名,直接定义变量: struc t dint a; float f x, y 注意:1、定义变量才能分配相应内存空间,类型只是说 明一种格式; 结构体类型可以嵌套定义 例: b2 struct
定义结构体类型变量的方法 定义结构体变量有几种方法 1、先定义结构体类型,再定义结构体变量; struct s {int a; float f}; struct s x,y; 2、同时定义结构体类型和变量; struct s {int a;float f}x,y; 3、不指定结构体类型名,直接定义变量; struct {int a;float f}x,y; 注意:1、定义变量才能分配相应内存空间,类型只是说 明一种格式; 2、结构体类型可以嵌套定义 例: b2_struct
结构体变量的引用 引用是对结构体变量中的成员进行访问,其格式是: 结构体变量名·成员名 对嵌套定义的结构体类型进行多层引用 tH: struct datefint year; int month; int day struct student char name [20] struct date birthday )stul 则引用:stu1. birthday.year 成员的引用可以进行成员类型相关的运算。 相同类型的结构体变量可以相互赋值
结构体变量的引用 引用是对结构体变量中的成员进行访问,其格式是: 结构体变量名 • 成员名 对嵌套定义的结构体类型进行多层引用。 如: struct date{int year; int month; int day}; struct student{char name[20]; struct date birthday; }stu1; 则引用: stu1.birthday.year 成员的引用可以进行成员类型相关的运算。 相同类型的结构体变量可以相互赋值
2、结构体指针 结构体变量的首地址称为结构体变量的指针,该地 址可以赋值给一个指针变量。 、结构体指针变量的定义 struct sint x, y float z: struct s a,*p;a为结构体变量,p为指针变量 二、通过结构体指针变量对结构体成员操作 若有以上定义,且有赋值语句:p=&a;则指针p指向 结构体变量a。 a.x(*p).x注意括号p-〉x三种形式均对 结构体变量a取成员 例: struct_pointer
2、结构体指针 结构体变量的首地址称为结构体变量的指针,该地 址可以赋值给一个指针变量。 一、结构体指针变量的定义 struct s{int x,y; float z;}; struct s a,*p; a为结构体变量,p为指针变量 二、通过结构体指针变量对结构体成员操作 若有以上定义,且有赋值语句: p=&a; 则指针p指向 结构体变量a。 a.x (*p).x 注意括号 p->x 三种形式均对 结构体变量a取成员。 例: struct_pointer
3、自定义数据类型 1、简单的名字替换; typedef int INtEGer 将int型定义为 INTEGER,则 INtEGeR a;相当于inta; 2、定义一个类型名代表一个结构体类型; typedef struct 则 STUDENT为一个结构体类型名, i char name [20] 可以直接用来定义变量,如: long num STUDENt student1, student2 float score I STUGENT 3、定义数组: typedef int CoUNt[20]; count a,b;a,b为20元素的整型数组 4、定义指针: typedef char* STRING STRING p1,p2;pl,p2为字符类型指针
3、自定义数据类型 调用函数时传递数组地址 1、简单的名字替换; typedef int INTEGER; 将int型定义为INTEGER,则 INTEGER a;相当于int a; 2、定义一个类型名代表一个结构体类型; typedef struct 则STUDENT为一个结构体类型名, { char name[20]; 可以直接用来定义变量,如: long num; STUDENT student1,student2; float score; }STUGENT; 3、定义数组:typedef int COUNT[20]; COUNT a,b; a,b为20元素的整型数组 4、定义指针:typedef char *STRING; STRING p1,p2; p1,p2为字符类型指针
4、链表的概念与形成链表的条件 定义 是一种有序的列表。链表的内容通常是存储于内存中分散的位置上。 ·链表的两种形式 一种是利用数组结构串连的有序列表,称静态链表;另一种以动态内存配置 的链表,称动态链表,简称链表 形成链表的基本要素: (1)元素节点。由一个包含指针成员的结构体组成 (2)结点中的指针成员保留其后继结点的地址信息
4、链表的概念与形成链表的条件 • 定义 是一种有序的列表。链表的内容通常是存储于内存中分散的位置上。 • 链表的两种形式 一种是利用数组结构串连的有序列表,称静态链表;另一种以动态内存配置 的链表,称动态链表,简称链表。 • 形成链表的基本要素: (1) 元素节点。由一个包含指针成员的结构体组成; (2) 结点中的指针成员保留其后继结点的地址信息
要形成链表,需要用结构体数据类型,在结构体类型中需要有 指向本类型的指针成员,以便指向下一个结构体变量 例: struct stud score i int X struct stud score next 2010头指针 2010 2018 4048 2011 49049 21 4)4- ⊥⊥ 指针成员 结点1 结点2 结点3 以上三个结构体变量在内存中的地址并不是连续 的,但通过链表关联起来
2010 2010 2011 x 2018 2018 2019 x 4048 4048 4049 x NULL p 头指针 结点1 结点2 结点3 指针成员 要形成链表,需要用结构体数据类型,在结构体类型中需要有 一个指向本类型的指针成员,以便指向下一个结构体变量。 例: struct stud_score { int x; struct stud_score *next; }; 以上三个结构体变量在内存中的地址并不是连续 的,但通过链表关联起来
静态链表 王五 4 张三 Struct student char name [101 23456789 李四 刘六 int next }S[10]; 「张三李四王五刘六」
1 2 3 4 5 6 7 8 9 0 1 张三 李四 刘六 王五 3 0 -1 4 P 静态链表 Struct student { char name[10]; int next; }S[10]; 张三 李四 王五 刘六
5、链表的操作 链表的创建 创建动态链表从一个空指针H开始,每增加一个元素时首先通 过动态存储分配创建一个结点(获得存储空间),将元素 值赋值到结点的数据域,如果是第一个结点(H==NUL, 则将该结点的地址赋值给上述指针,且将该结点的指针域 赋值NULL,表示该结点没有后继结点;如果不是第一个结 点,则将结点插入已有的链表中
5、链表的操作 • 链表的创建 创建动态链表从一个空指针H开始,每增加一个元素时首先通 过动态存储分配创建一个结点(获得存储空间),将元素 值赋值到结点的数据域,如果是第一个结点(H==NULL), 则将该结点的地址赋值给上述指针,且将该结点的指针域 赋值NULL,表示该结点没有后继结点;如果不是第一个结 点,则将结点插入已有的链表中