收藏 分享(赏)

结构体与链表.PPT.ppt

上传人:j35w19 文档编号:4576748 上传时间:2019-01-03 格式:PPT 页数:32 大小:247.50KB
下载 相关 举报
结构体与链表.PPT.ppt_第1页
第1页 / 共32页
结构体与链表.PPT.ppt_第2页
第2页 / 共32页
结构体与链表.PPT.ppt_第3页
第3页 / 共32页
结构体与链表.PPT.ppt_第4页
第4页 / 共32页
结构体与链表.PPT.ppt_第5页
第5页 / 共32页
点击查看更多>>
资源描述

1、结构体数据类型与链表,教学目的要求:1、理解结构体类型的定义和使用2、熟练使用结构体类型变量3、理解掌握指向结构体变量的指针和指向结构体数组元素的指针 重点、难点:1、理解结构体类型的定义和使用2、熟练使用结构体类型变量3、理解掌握指向结构体变量的指针和指向结构体数组元素的指针,结 构 体,定义结构体变量的方法,结 构 体 变 量 的 引 用,结 构 体 变 量 的 初 始 化,结 构 体 数 组,指向结构体数据的指针,用 指 针 处 理 链 表,如: struct student int num;char name20;char sex;int age;float score;char ad

2、dr30; ;struct student student1,student2;,1、 先定义(声明)结构体类型,再定义变量名,定义结构体类型变量的方法,struct 结构体类型名 成员表列 ; struct 结构体类型变量名;,结构体类型名,结构体变量名,说明: (1)结构体变量后,系统会为之分配内存单元,所分配 单元数为各个成员项所需存储单元数的总和。(2)将一个变量定义为一个标准类型(基本数据类型) 与定义为结构体类型不同在于后者不仅要求指定变量为结构体类型,而且要求指定为某一特定的结构体类型(如struct student)。(3)如果程序规模比较大,往往将对结构体类型的声明 集中放到

3、一个文件(以.h为后缀的“头文件”)中。,2、 在声明类型的同时定义变量,如: struct student int num;char name20;char sex;int age;float score;char addr30; student1,student2;,struct 结构体类型名成员表列变量名表列;,3、直接定义结构体类型变量,struct成员表列变量名表列;,如:struct int num;char name20;char sex;int age;float score;char addr30; student1,student2;,关于结构体类型的几点说明:,(1)类型

4、与变量是不同的概念,对结构体变量来说,在定义时一般先定义一个结构体类型,然后定义一个变量为该类型。只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算。在编译时,对类型是不分配空间的,只对变量分配空间。,(2)对结构体中的成员(即“域”),可以单独使用,它的作用与地位相当于普通变量。,(3)成员也可以是一个结构体变量。,struct date int month;int day;int year; ;,struct student int num;char name20;int age;struct date birthday;char addr30; student1,student

5、2;,(4)成员名可与程序中的其他变量名相同,二者不代表同一对象。,结构体变量的引用,1、引用方式为: 结构体变量名成员名“ . ” 是成员(分量)运算符,它在所有运算符中优先级最高,用于对结构体变量中各个成员项的引用 如已定义student1为结构体变量并且它们已有值,则引用各个成员项: student.name student.sex 注意:不能将一个结构体变量作为一个整体进行输入和输出,对结构体变量进行引用时,只能对结构体变量中的各个成员分别引用,不能这样引用:printf(“%d,%s,%c,%d,%f,%sn”,student1); 2、 对成员变量可以像普通变量一样进行各种运算(根

6、据其类型决定可以进行的运算)。student.age+;,3、如果成员本身又属于一个结构体类型,则要用若干个成员运算符,一级一级地找到最低的一级的成员。只能对最低级的成员进行赋值或存取以及运算。,struct date int month;int day;int year; ;,struct student int num;char name20;char sex;int age;struct date dirthday;char addr30; student1,student2;,4、结构体变量占据的一片存储区域的首地址称为该结构体型变量的地址,每个成员占据若干单元的首地址称为该成员的地址

7、。 程序中可以引用成员的地址,也可以引用结构体变量的地址。scanf(“%d”,结构体变量的初始化,对结构体变量进行初始化。 例如: struct student long int num;char name20;char sex;char addr20;a=89031,“Li Lin”,M,”123 Bejing Road”;main() printf(“No.:%ldnname:%snsex:%cnaddress:%sn”,a.num,a.name,a.sex,a.addr); ,结 构 体 数 组,1、 一个结构体变量中可以存放一组结构体类型的数据,就是结构体数组。 2、 结构体数组中每

8、个数组元素都是一个结构体类型的数据,它们都分别有各自的各个成员(分量)项。3、 结构体数组的定义和定义结构体变量的方法相仿,只需说明其为数组即可。,struct studentint num;char name20;char sex;int age;float score;char addr30;; struct student stu3; 数组各元数在内存中连续存放,结 构 体 数 组 的 定 义,struct studentint num; char name20;char sex; int age;float score; char addr30; stu3=10101,”Li Lin”

9、,M,18,87.5,“103 Bejing Road”,10102,”Zhang Fun”,M,19,99”130 Shanghai Road”,10104,”WangMin”,F,20,78.5,”1010 Zhongshan Road”;,结 构 体 数 组 的 初 始 化,说明:定义数组stu时,元素个数可以不指定,写成以下形式:stu =,;编译时,系统会根据给出初值的结构体常量的个数来确定数组元素的个数。结构体数组初始化的一般形式是在定义组的后面加上:=初值表列;,指向结构体类型数据的指针,指向结构体变量的指针变量#include ”string.h”main() struct s

10、tudent long int num;char name20;char sex;float score;struct student stu_1;struct student *p;p=,( *p ).num ( *p ).name ( *p ).sex ( *p ).score,p-num p-name p-sex p-score,说明:对结构体数组中某个元素中的各个成员项的引用以下三种形式等价:(1) 结构体变量.成员名;(2)(*p).成员名;(3)p-成员名,指向结构体数组元素的指针,如:struct student int num;char name20; int age; ; c

11、har sex; struct student stu3= 10101,”LiLin”,M,18, 10102,”ZhangFun”,M,19,10104,”WangMin”,F,20;main() struct student *p; printf(“No. Name sex agen”); for (p=stu; pnum,p-name,p-sex, p-age);,将一个结构体变量的值传给另一个函数的两个方法: 1 用结构体变量的成员作参数。 2 用指向结构体变量(或数组)的指针作实参,将结构体变量(或数组)的地址传给形参。,用结构体变量和指向结构体的指针作函数参数,说明:把一个完整的结

12、构体变量作为参数传递,虽然合法,但 要将全部成员值一个一个传递,费时间又费空间,开销大, 如果结构体类型中的成员很多,或有一些成员是数组,则程 序运行效率会大大降低。在这种情况下,用指针作函数参数 比较好,能提高运行效率。,05.9-46有以下程序 # include struct STU int num; float TotalScore; ;void f(struct STU p) struct STU s2=20044,550,20045,537; p.num = s1.num; p.TotalScore = s1.TotalScore; main() struct STU s2=200

13、41,703,20042,580; f(s0); printf(“%d %3.0fn“, s0.num, s0.TotalScore); 程序运行后的输出结果是 A)20045 537 B)20044 550 C)20042 580 D)20041 703,等 考 实 例,(D),05.9-47有以下程序 # include struct STU char name10; int num; ; void f(char *name, int num) struct STU s2=“SunDan“,20044,“Penghua“,20045; num = s0.num; strcpy(name,

14、s0.name); main() struct STU s2=“YangSan“,20041,“LiSiGuo“,20042,*p; p= 程序运行后的输出结果是 A)SunDan 20042 B)SunDan 20044 C)LiSiGuo 20042 D)YangSan 20041,等 考 实 例,(A),05.9-48有以下程序 struct STU char name10; int num; float TotalScore; ; void f(struct STU *p) struct STU s2=“SunDan“,20044,550,“Penghua“,20045,537, *q

15、=s; +p ; +q; *p=*q; main() struct STU s3=“YangSan“,20041,703,“LiSiGuo“,20042,580; f(s); printf(“%s %d %3.0fn“, s1.name, s1.num, s1.TotalScore); 程序运行后的输出结果是 A)SunDan 20044 550 B)Penghua 20045 537 C)LiSiGuo 20042 580 D)SunDan 20041 703,等 考 实 例,(B),06.4-26有以下程序段 struct st int x;int *y;*pt; int a=l,2,b=

16、3,4; struct st c2=10,a,20,b; pt=c; 以下选项中表达式的值为11的是 A)*pt-y B)pt-x C)+pt-x D)(pt+)-x,等 考 实 例,用 指 针 处 理 链 表,1 链表是一种常见的重要的数据结构,是动态地进行存储分配的一种结构。 2 链表根据需要开辟内存单元,不会浪费内存。 3 链表有一个“头指针”变量,存放一个地址,该地址指向 一个元素。链表中每一个元素称为“结点”,每个结点都 应包括两个部分:用户需要的实际数据和下一个结点的地址。 4 链表中各元素在内存中可以不是连续存放的。 5 链表的数据结构必须利用指针变量才能实现。,链表中的各个元素

17、称为结点 链表的实现需要指针和结构体变量 结点的结构可以如下定义 struct student int num; float score; struct student *next; ,main( ) struct student a,b,c,*head,*p; a.num=99101;a.score=89.5; b.num=99103;b.score=90; c.num=99107;c.score=85; head=,#define NULL 0 strut stuent long num; float score; struct stuent*next;,建立和输出一个简单的链表,C语言提

18、供的三种动态开辟和释放存储单元的库函数: 1、 Malloc(size) 功能:在内存的动态存储区中分配一个长度为size的连续空间。 此函数的值(即“返回值“)是一个指针,它的值是该分配域的起始地址。如果此函数未能成功地执行,则返回值为。 2、 Calloc(n,size) 功能:在内存的动态区存储中分配n个长度为size的连续空间。 函数返回分配域的起始地址;如果分配不成功,返回。 3、 Free(ptr) 释放由ptr指向的内存区。,建立动态链表的函数,注:新标准提供的Malloc和Calloc函数规定为void*类型,所 以在使用时应根据需要进行强制类型转换。,动态链表的建立,思想:所

19、谓建立动态链表是指在程序执行过程中从无到有的建立起一个链表。即一个一个地开辟结点和输入个结点数据,并建立起前后相连的关系。1、 那么我们要建立一个动态链表就要先定义3个指针变量head,p1,p2.他们所指向的数据都为结构体类型的。2、用malloc函数开辟第一个结点,并使p1,p2指向它。从键盘读入的第一个数据给p1所指向的节点。3、这时我们必须定义该结点的数据部分的结束标志。使head值为NULL.head总指向链表中的第一个结点。4、如果键盘输入的数据满足条件,则输入的是第一个结点的数据,令head值向该结点,p1所指向的结点就成为链表中的第一个结点。然后在开辟一个结点,并使p1在指向它

20、,接着判断它是否满足条件。,p1,P1-next,p2,p1=p1-next,05.9-16以下程序运行后的输出结果是 。 struct NODE int num; struct NODE *next; ; main() struct NODE s3=1, 0,2, 0,3, 0, *p, *q, *r; int sum=0; s0.next=s+1; s1.next=s+2; s2.next=s; p=s; q=p-next; r=q-next; sum+=q-next-num; sum+=r-next-next-num; printf(“%dn“, sum); 06.4-25现有以下结构体

21、说明和变量定义。指针p、q、r分别指向一个链表中连续的三个结点。 struct node char data; struct node *next; *p,*q,*r; 现要将q和r所指结点交换前后位置,同时要保持链表的连续,以下不能完成此操作的语句是 A)q-next=r-next;p-next=r;r-next=q; B)p-next=r;q-next=r-next;r-next=q; C)q-next=r-next;r-next=q;p-next=r; D)r-next=q;p-next=r;q-next=r-next;,等 考 实 例,5,(D),说明: 1 第一行为#define命令

22、行,令NULL代表0,用它表示“空地址”,第二行LEN代表struct student结构类型数据的长度。 2 第9行定义一个creat函数,它是指针类型。 3 Malloc(LEN)的作用是开辟一个长为LEN的内存区。 4 Return后面的参数是head. 5 N是结点个数。 6 算法思路:让P1指向新开辟的结点,P2指向链表中最后一个结点,把P1所指的结点连接在P2所指的结点后面。用“p2-next=p1”来实现。,输出链表首先要知道链表头元素的地址,然后设一个指针变量P,先指向第一个结点,输出P所指的结点,然后使P后移一个结点,再输出。直到链表的尾结点。,例 输出动态链表的函数,删除链

23、表中的结点从一个链表中删除一个结点,并不是真正从内存中 把它抹掉,而是把它从链表中分离出来,即改变链接关系。,例 删除动态链表结点的函数,在链表中插入一个结点将一个结点插入一个已有的链表中。设已有的链表中各结点的成员项num(学号)是按学号由大到小顺序排列的。 用指针变量p0指向待插入的结点,p1指向第一个结点。将p0-num与p1-num相比较,如果p0-nump1-num,则待插入的结点不应插在p1所指的结点之前。此时将p1后移,并使p2指向刚才p1所指的结点,再将p1-num与p0-num比,如果仍然是p0-num大,则应使p1继续后移,直到p0-numnum为止。这时将p0所指的结点插到p1所指结点之前。但是如果p0所指的结点插到链表末尾。,例 插入动态链表结点的函数,如果插入的位置既不在第一个结点之前,又不在表尾结点之后,则将p0的值赋给p2-next,即使p2-next指向待插入的结点,然后将p1的值赋给p-next,即使得p0-next指向p1指向的变量, 如果插入位置为第一结点之前(即p1等于head时),则将p0赋给head,将p1赋给p0-next. 如果要插到表尾之后,应将p0赋给p1-next,NULL赋给p0-next.,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 实用文档 > 统计图表

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报