罗泽兵 发表于 2024-4-15 08:52:35

22.第22节课第九章用户自己建立数据类型

我们用结构体变量呢?和结构体变量的指针作为函数参数,将一个结构体变量的值传递给另一个函数,有三个方法。第一个呢,是用结构体变量的成员做参数,比如说stu杠stu一点number或stu二点number做传输时差,将时差呢传递给形参。用法和普通变量的做实参是一样的,属于直传递的方式。好吧,我们应当注意了实参与形参的类型的保持一致。第二种方法呢,是用结构体变量做时差。用结构体变量做时差的时候呢,

采取的也是直传递的方式。将结构体变量所占的内存单元的内容呢?全部按照。顺序呢,传递给形参,形参也必须同类型的结构体变量在函数调用期间,形参也要占用内存单元,这种传递方式啊,在时间和空间上的开销很大。如果结构体的规模很大时开销是很,那么就有很大的开开销,那么此外呢,由于采取直传递方式在执行。调用函数之间的改变的形差的值,那么该值呢?

不能返回主调函数往往造成使用上的不便,因此呢,很少采用这种方法。第三种方法呢,是指向结构体变量或数组元素的指针做时差,向结构体变量或数组元素的地址呢,传递给形差,那么这是用结构体变量和结构体变量指针做函数参数的这样一个方式。那么我们再看一下用结构体变量和结构体变量指针做函数参数,那么有n个结构体变量内含学生学号,姓名和三位数的成绩。要求输出平均成绩最高的学生信息包括学号,姓名,三门课的成绩和平均成绩。我们来看一下这个程序,

井号e sdd nh,井号d find n零三,这是定义宏宏,定义定义我们的n呢为三。利用我们的n呢,把n那么用n呢来代表3 struct student建立结构体类型struct student进行一个声明。那么我们这里呢,后面是他的这样一个成员,有我们的number学号name,20姓名,school三三门课成绩orange平均成绩。好吧,我们看一下后面的这样一个运用的,这样一个后面这样一个部分inter main wade input structural student CPU。方括号那么这是我们的这样一个函数的,

这样一个声明。它的参数呢,是一个结构体数组。结构体数组。struct student max struct students to这也是个函数声明,它的参数呢,是一个结构体数组。为的print struct students to这是我们的函数声明,它的参数呢?是一个结构体变量struct students ton。星p=stu那么近义结构体数组和指针,那么我们的定义了一个结构体数组stu,那么星p呢?那么那么把那个把那个把ST把那个把那个把s to呢那么?用p呢指向我们的stu这个数组,

接下来呢input p那么调用input函数print max p。调用print函数iMax函数的返回值呢?作为取参。作为时差,因为它二零程序返还程序返回一个零值函数结束。程序结束,那么我们看一下后面定义的函数部分w的input struct ssstu。定义我们已部的函数。in inti printf.for I=0 I小于ni加加,我们输入这样一个数据。那么,并再求我们的平均成绩。我们接下来呢?s student struct student max.

student students to de max函数那么in tim=0 for I=0 I小于I+I加加。for stu I average大于stum average。m=I。那么,找出平均成绩最高的学生呢?在数组中的这样一个序号。那么,retires TU。m那么返回了包含该学生信息的这样一个结构体元素。好,我们再看一下,后面再看一下这样一个定义的函数为的。print struct students ttu d.stu那么定义我们的这样一个。print函数那么print?

f那么后面的这样一个数字符串,那么printf我们进行输出。那么,这里呢?是用我们的。是用我们的这样一个结构体变量呢?和结构体变量的指针,那么作为我们的函数参数来进行一个程序的这样一个运行部分。那么我们再看一下,用指针处理链表。那么,链表呢?是一种常见的数据结构,它是动态的进行存储分配的一种结构。链表呢?

有一个头指针变量,我我们这里呢,用用head进行表示,它存放一个地址,该地址只需要一个元素。链表中的每一个元素呢,称为节点,每个节点呢,包括两个部分,一个呢是用户所需要的实际数据,第二个呢是下一个节点的地址。head呢,指向第一个元素,第一个元素呢,指向第二个元素,

直到最后一个元素,该元素呢,不再指向其他元素,称为表尾,它的地址部分呢,只放一个now表示空地,只列表到此结束。好吧,我们可以用结构体变量呢。建立链表一个结构体变量呢,包含若干成员,这些成员呢,可以是数值类型,字符类型,数组类型,

也可以是指针类型。用指针类型成员呢来存放下一个节点的地址,那么比如说我们的。number和score用来存放节点中的有用数据next就是指针型的成员,它指向struct student类型的。数据就是nex所在的结构类型。那么,比如说我们这number呢?和score就是节点中存放的有用数据next指向我们这样一个struct student类型的数据。那么就是我们像我们下一个这样一个节点的部分。好吧,我们再看一下,建立简单的静态列表,建立一个简单列表,它有三个学生的节点组成,

要求输出节点中的数据。那么,我们来看一下。井号interludes ddi点h SD struct student声明,结构体类型struct student intermediate floor struct student。星号next,那么我们再看一下,在我们的这样一个变量的,在我们这样定义的这样一个声明当中呢,我们还定义我们定义的是一个整型变量number。一个浮点型变量s,还有一个结构体变量。结构体指针变量nix t,这表明了我们的这样一个nix t的这个指针呢?是指向我们的一个结构体变量的这样一个类型的结构体变量。

那么我们再看一下,看这个部分inter main。structure student ABC星号。黑的信号p对定义三个结构变量ABC呢?作为链表的节点,那么还有两个指针变量。a点number,a点score,a点到b点number,b点score,c点number,c点score那么进行,我们这样一个成员的,这样一个赋值。然后head,

然后等于取地址a将结点a的起始地址呢,赋给头指针head。a点next呢,等于我们这样一个符号b将节点b的起始地址呢?赋给a地址的a节点的next成员b点next呢,等于。这样一个符号c将节点c的起始地址呢?赋给a的这样一个。那个是成员c点text呢,等于null c结点的那个是成员呢,不存放其他结点的地址。p=head是p的指向a结点。do printf那么输出p时间指向的这样一个节点的这样一个数据。p=p指向next是p呢?指向下一个结点,

这里呢是把p呢?西当中的。这样一个next,这样一个指针的,这样一个数值呢?赋给我们的p使p呢?指向下一个节点的部分。while p.不等于null那么输出完c节点后呢?p的值为null那么循环就终止,那么return 0。程函数返回一个零值程序结束,那么我们来看一下这个部分。首先呢,我们这里呢有一个。

那么有一个这样一个。对吧,有一个这样一个头结点,有一个这样一个结点head。head这样一个这样一个head呢?head这样一个指针呢?那么,我们把a的地址呢?将a的地址呢赋给头指针head,那么head呢?那么就指向。我们的这样一个。节点。就这一个部分。好,

我们这里呢,我们这里呢,是我们的这样一个指针head。这个指针呢?那么就指向我们的这样一个节点。那么p呢?那么我们把这个节点head呢?赋给这个值呢?赋给p那么p呢?就指向我们的这样一个节点。那么p呢,指向我们的这个节点呢,那么p呢,进行输输出p指向节点的数据呢,那么先输出我们的number。

再输出我们的score,然后呢,把p所指向的这样一个。那成员呢?next呢?再付给我们的p。那么p就指向下一个节点,然后又输出我们这样的数据,然后又将这样一个。next呢,赋给p。然后呢,再指向下一个节点,然后又进行这样一个输出,那么这是我们。

进行我们这样一个。指针呢,那么进行这样一个使用的这样一个。指向的这样一个输出运用的这样一个。寻找找到这样一个数据的,这样一个方式。那么也就说了。我们首先呢,把a的地址呢赋给图纸的head,把b的地址呢赋给我们的a点next,将c的地址呢赋给b点next。然后把now呢赋给我们的c点next,然后呢把我们的head赋给我们的p那么在这样一个执行循环的时候呢,把p指向的next呢?覆盖我们的p1指b呢?

指向下一节点,然后呢?进行我们的输出,那么这是我们链表的这样一个方式。那么,我们来看一下,写一个简单的动态列表。那么,写一个函数呢?建立。有三名学生数据的单项动态列表,所谓建立动态列表呢,是指在程序执行过程中。从无到有的建立起一个链表,那么就是一个一个的开辟节点和输入各节点数据,

并建立起前后相链的关系。我们看一下这个流程,看一下这个这个这个形式,这个方式。开辟一个新节点,并并使p1p2指向它读入一个学生数据,给p1所指的节点。然后呢,等于n=0当读入的p1呢,指向的数据呢,不是零的话。那么n=n+1那么n呢?是否等于一?如果等于一呢?把等于p1。

那么,把p1所指向的结点呢?作为第一个结点,如果不是的话,那么把p2到list呢?等于p一把p1所指的结点呢?连到表。连到表尾,然后呢?把p 2=p 1p二呢?移到表尾,再开辟一个新的结点,使p1指向它。读入一个学生数据了。点p1所指的结点,

然后呢,再进行判断,那么最后表尾的指指针呢,那么置为null。那这是我们这样一个过程的,这样一个部分。我给大家看一下这样一个过程的,这样一个方面。好,我们来看一下这样一个动态列表的方式。那么,应井号includes ddi点h井号includes dd lid点h。井号define name names of first size of s student。student struct student now in number float school struct student?星号list in tnn为全局变量等这样一个函数呢,

都可以使用struct student。星号create void那么定义函数,这个函数呢?返回一个指向。链表头的指针。struct.student信号head struct星号p1p1P2P2 n=0 p 1=p二=struct。星号MM rk的楞开辟一个新单元,是p1p2的指向它。3f百分号ld百分号LA百分号f。取p1这样一个成员number的地址p2的,这成员p1的成员score的地址输入第一个学生的这样一个学校和成绩。head=null。while p1指向的这样一个成员呢,不等于零,

那么n=n+1,if n=if n=1。啊head=p一。else p 2=next到我们的指向的这样一个next成员呢?等于p1然后呢?p 2=p一。p1呢等于struct。student MR k的类。那么,再开辟动态存储区,把这样一个。起始地址啊,赋给p1。sky f那么输入学,他学生的学号和成绩那么p2呢?

指向的next呢,等于null。然后呢,这样一个return head。那么我们再看一下这个主函数,再看一下这个部分。inter MA instruct student,新PT PT=create那么函数返回链表第一个节点的地址。printf那么输出第一个节点的成员值。然后呢?returning。函数返回一个零值程序结束,那么我们来看一下这个函数。好吧,我们首先呢,

这里是建立一个结构体变量的,这样一个指针实际上结构体变量的指针。head,然后一个结构体变量指针p1p2那么p 1=p二呢等于struct的星号mrkitlen开辟一个新单元。并使我们的p1p2指向这样一个节点。那么我们这样头指针呢?等于闹。那么,while p1。指向的。这这样一个成员number不等于零的话,那么n=n+1。if n=1。那么head呢?等于p一把p1的值赋给head,

让头指针呢指向这样一个节点。那么else?p2这样一个list呢等于p1。那么p 2=p一。那么,这是让我们让我们的这样一个p1p2的这样一个next的成员呢?指向p1那么后面建立了这样一个节点的这样指向我们节点这样一个部分。然后呢?p 2=p一,那么之后把把我们的这样一个p2的指针呢?那么那么p1的这样一个值呢?赋给我们的p2。让p2呢指向我们的这样一个下一个节点。那么,接下来呢?

p 1=struct。student信号啊,这是再定义一个新的节点,再开辟一个新的节点,那么我们这里呢,开辟一个新的节点呢。然后呢?如果我们是n是。不等于一的话,那么我们把这个新的结点呢,把它让我们的p指向前面的这样一个p2呢?指向我们前面一个节点的,这样一个p2的,这样一个。乘员,

那个时候这样一个值了,那么指向我们这样一个新节点的,这样一个新节点的,这样一个位置去让我们的新节点。然后呢,将我们新指向新阶这个p2这个指针呢,指向我们的指向我们的新节点,那么这样一个指针的这样一个。实现了这样一个过程,改变了这样一个方式。那么这里呢,然后p 2=next=n。那么,在我们建立完这些。节点之后呢,

然后呢?让我们的。我们的最后一个这样一个节点呢,它的。下一个节指向下一个节点的指针呢,是我们的空指针,为是我们的long那么这样一个是我们的long那么最后呢返回我们的这样一个头指针。返回我们头指这head。那么,这样一个这样一个部分,那么这里呢?就是我们。动态链表,它实现这样一个方式。好吧,

我们再来看一下。编写一个输出链表。输出链表的print函数printf我们来看一下这个程序井号includes ddi点h井号includes ddi点h井号def in类set of struct student。struct student那么就是定义我们确定我们的结构与类型,后面是它的成员inter main weight print struct student head。定义print函数struct student星p在叠优点中呢?定义我们。这样一个指向结构体变量的这样一个指针p。printf我们这样一个字符串print p=head是p呢,指向第一个结点,if head不等于null,如果不是空表。do front f那么进行输出?p=p指向next p指向下一个节点yop不等于空值不等于n。那么,

这里呢?就是我们的这样一个输出的函数,那么我们这里的void print when struct students head,那么是定义我们的这样一个print函数,它的参数呢?是我们这样一个结构体指向结构体变量的一个指针,那么这里呢?我们定义一个s新p,那么在这个定义函数中呢?定义一个指向结构体变量的指针p。那么,我们让这样一个head呢?让p呢?等于head。那么,

如果我们的head不为空的话,那么我们就。不不是我们的空,不是不是不是空表的话,那么我们就进行我们p了指向的这样一个节点的。学号是成员的,这样一个值的,这样一个输出,然后呢p呢指向了下一个p指向的next呢p指向b的,这样一个成员next值呢赋给p。让p指向下一个节点,然后再进行判断,那么我们的p是否为空?那么,这样一个部分。

那么,进行我们输出那么这样一个运用的,这样一个使用的方式,那么这是我们输出列表的这样一个运用的这样一个部分。那么最后呢?我们接下来我们再看一下共用体类型,那么几个不同类型的变量呢?共用共享一段内存的结构,那么称为共用体类型,那么它的使用方式呢?是union共用体名成员列表变量列表,比如说我们的这样一个union dat aint is hell。ch float f ABC在声明定义的类型的时候呢?同时定义变量。或者说,

声明公用题类型声明之后呢,再定再来进行公用题类型的定义变量,或者说没有定义公用题类型的那么直接在。是后来写上我们的变量,那么这样一种这样一种定义的方式共用题呢?与结构体的形式相似,但它们的含义是不同的。结构体变量所占的内存长度呢?是各成员占用的内存长度之和每个成员呢?分别占有其自己的内存单元,而共用体变量呢?所占的内存单元长度呢?等于最长。内成员的长度几个成员呢?共用一个内存区。

那么,只有先定义了共用体变量呢,才能进行使用,那么不能使用共用体变量,只能引用共用体变量中的成员。那么,接下来我们再看一下。用type几再。type defy定义新类型名,那么我们简单的用一个新的类型名呢?代替原类型名,比如说type defy int e integer。那么,我们定义integer为类型名作用呢?与int相同又比,

比如说另外呢?还有我们的type。定义real为类型名作用呢?与float相同,那么命名一个简单的类型名代替复杂的类型方法。比如说命名一个新的类型名代表结构体类型,命名一个新的类型名代表数组类型,命名一个新的类型名代表指针类型,你就要命名一个新的类型名代表指向函数的指针类型。比如说我们这里type defy struct。int month,int day,int year,那么date定义一个新类型名date代表结构体类型,比如说我们date base birthday,

那么定义结构体类型名变量birthday,那么就。可以不用写成struct data birthday,那么可以直接写成data birthday,那么以及呢?定义结构体变量指针data星p,那么定义结构体变量指针p,指量题结构体类型数据。那么也可以呢,定义type defy int number 100那么定义100这样一个数字定义number呢,为整型数组类型的。number a表示了定义a为整形数组名,它有100个元素type defy char信号s。定义最为字符类型指针,那么最PS时那么定义p呢?

为字符指针变量。s呢为字符指针数组。那么,还有我们的type define int括号新pointer。定义pointer为指向函数的指针类型,该函数的返回值,返回整型值pointer p1p2。p1p2呢为pointer类型的指针变量,那么就是我们指向函数的类型指针类型。那么,这是我们这样一个使用的,这样一个运用的,这样一个部分。那么,这是我们运用的这样一个type defy的声明。

声声明,新类型名的这样一个使用的这样一个运用的这样一个方式。好同学们,那么今天呢?我们主要讲过了,如何使用结构体类型呢?处理组组合数据,那么就是我们用户定义的数据类型。以及我们的这样一个共用体的,这样一个方式和我们定义新类型云的这样一个部分,那么大家接下下来呢?那么看一下那么这些部分进行一个了解和熟悉。好,大家进行一个,再进行一下这样一个。

观看的这样一个部分好,我们今天的课呢,就讲到这里好,谢谢大家。


页: [1]
查看完整版本: 22.第22节课第九章用户自己建立数据类型