第7章自定义数据类型内容摘要:
//定义 p为指向 Student类型数据的指针变量并指向 stu =10301。 //对 stu中的成员赋值 =″Wang Fun″。 //对 string变量可以直接赋值 =′f′。 =。 cotstu. num″ ″″ ″″ ″endl。 cout(*p)num″ ″(*p).name″ ″(*p).sex″ ″(*p).scoreendl。 return 0。 } 图 程序运行结果如下: 10301 Wang Fun f (通过结构体变量名引用成员 ) 10301 Wang Fun f (通过指针引用结构体变量中的成员 ) 两个 cout语句输出的结果是相同的。 为了使用方便和使之直观, C++提供了指向结构体变量的运算符 ,例如 pnum表示指针 p当前指向的结构体变量中的成员 num。 pnum 和 (*p).num等价。 同样, pname等价于 (*p).name。 也就是说,以下 3种形式等价: ① 结构体变量 .成员名。 如。 ② (*p).成员名。 如 (*p).num。 ③ p成员名。 如 pnum。 “”称为指向运算符。 请分析以下几种运算: pn 得到 p指向的结构体变量中的成员 n的值。 pn++ 得到 p指向的结构体变量中的成员 n的值,用完该值后使它加 1。 ++pn 得到 p指向的结构体变量中的成员 n的值,并使之加 1,然后再使用它。 2. 用结构体变量和指向结构体变量的指针构成链表 链表是一种常见的重要的数据结构。 图 简单的一种链表(单向链表)的结构。 图 链表有一个 “ 头指针 ” 变量,图中以 head表示,它存放一个地址。 该地址指向一个元素。 链表中的每一个元素称为 “ 结点 ” ,每个结点都应包括两个部分: 一是用户需要用的实际数据,二是下一个结点的地址。 可以看到链表中各元素在内存中的存储单元可以是不连续的。 要找某一元素,可以先找到上一个元素,根据它提供的下一元素地址找到下一个元素。 可以看到,这种链表的数据结构,必须利用结构体变量和指针才能实现。 可以声明一个结构体类型,包含两种成员,一种是用户需要用的实际数据,另一种是用来存放下一结点地址的指针变量。 例如,可以设计这样一个结构体类型: struct Student { int num。 float score。 Student *next。 //next指向 Student结构体变量 }。 其中成员 num和 score是用户需要用到的数据,相当于图 A,B,C,D。 next是指针类型的成员,它指向 Student类型数据(就是 next所在的结构体类型)。 用这种方法就可以建立链表。 见图。 图 图中每一个结点都属于 Student类型,在它的成员next中存放下一个结点的地址,程序设计者不必知道各结点的具体地址,只要保证能将下一个结点的地址放到前一结点的成员 next中即可。 下面通过一个例子来说明如何建立和输出一个简单链表。 例 建立一个如图 ,它由 3个学生数据的结点组成。 输出各结点中的数据。 define NULL 0 include iostream struct Student { long num。 float score。 struct Student *next。 }。 int main( ) { Student a,b,c,*head,*p。 a. num=31001。 =。 //对结点 a的 num和 score成员赋值 b. num=31003。 =90。 //对结点 b的 num和 score成员赋值 c. num=31007。 =85。 //对结点 c的 num和 score成员赋值 head=amp。 a。 //将结点 a的起始地址赋给头指针 head =amp。 b。 //将结点 b的起始地址赋给 a结点的 next成员 =amp。 c。 //将结点 c的起始地址赋给 b结点的 next成员 =NULL。 //结点的 next成员不存放其他结点地址 p=head。 //使 p指针指向 a结点 do {coutpnum″ ″pscoreendl。 //输出 p指向的结点的数据 p=pnext。 //使 p指向下一个结点 } while(p!=NULL)。 //输出完 c结点后 p的值为 NULL return 0。 } 请读者考虑: ①各个结点是怎样构成链表的。 ② p起什么作用。 本例是比较简单的,所有结点 (结构体变量 )都是在程序中定义的,不是临时开辟的,也不能用完后释放,这种链表称为静态链表。 对各结点既可以通过上一个结点的 next指针去访问,也可以直接通过结构体变量名 a,b,c去访问。 动态链表则是指各结点是可以随时插入和删除的,这些结点并没有变量名,只能先找到上一个结点,才能根据它提供的下一结点的地址找到下一个结点。 只有提供第一个结点的地址,即头指针 head, 才能访问整个链表。 如同一条铁链一样,一环扣一环,中间是不能断开的。 建立动态链表,要用到下面 new和动态撤销内存的运算符 delete。 将一个结构体变量中的数据传递给另一个函数,有下列 3种方法: (1) 用结构体变量名作参数。 一般较少用这种方法。 (2) 用指向结构体变量的指针作实参,将结构体变量的地址传给形参。 (3) 用结构体变量的引用变量作函数参数。 下面通过一个简单的例子来说明,并对它们进行比较。 例 有一个结构体变量 stu, 内含学生学号、姓名和 3门课的成绩。 要求在 main函数中为各成员赋值,在另一函数 print中将它们的值输出。 结构体类型数据作为函数参数 (1) 用结构体变量作函数参数 include iostream include string using namespace std。 struct Student //声明结构体类型 Student { int num。 char name[20]。 float score[3]。 }。 int main( ) { void print(Student)。 //函数声明,形参类型为结构体 Student Student stu。 //定义结构体变量 =12345。 //以下 5行对结构体变量各成员赋值 =″Li Fung″。 [0]=。 [1]=89。 [2]=。 print(stu)。 //调用 print函数,输出 stu各成员的值 return 0。 } void print(Student stu) {cout″ ″″ ″[0]″ ″ [1]″ ″[2]endl。 } 运行结果为 12345 Li Fung 89 (2) 用指向结构体变量的指针作实参 在上面程序的基础上稍作修改即可。 include iostream include string using namespace std。 struct Student { int num。 string name。 //用 string类型定义字符串变量 float score[3]。 }stu={12345,″Li Fung″,89,}。 //定义结构体 student变量 stu并赋初值 int main( ) { void print(Student *)。 //函数声明,形参为指向 Student类型数据的指针变量 Student *pt=amp。 stu。 //定义基类型为 Student的指针变量 pt, 并指向 stu print(pt)。 //实参为指向 Student类数据的指针变量 return 0。 } void print(Student *p) //定义函数,形参 p是基类型为 Student的指针变量 { coutpnum″ ″pname″ ″pscore[0]″ ″ pscore[1]″ ″pscore[2]endl。 } 调用 print函数时,实参指针变量 pt将 stu的起始地址传送给形参 p( p也是基类型为 student的指针变量)。 这样形参 p也就指向 stu, 见图。 在 print函数中输出p所指向的结构体变量的各个成员值,它们也就是 stu的成员值。 在 main函数中也可以不定义指针变量 pt, 而在调用print函数时以 amp。 stu作为实参,把 stu的起始地址传给实参 p。 图 (3) 用结构体变量的引用作函数参数 include iostream include string using namespace std。 struct Student { int num。 string name。 float score[3]。 }stu={12345,″Li Li″,89,}。 int main( ) { void print(Student amp。 )。第7章自定义数据类型
相关推荐
是一种表示用例实现的通用的语言 上海交通大学计算机科学与工程系 2020/11/23 75 : S y s t e me n t e r I t e m( i d , q u a n t i t y )e n d S a l e ( )m a k e P a y m e n t( a m o u n t )P r o c e s s S a l e1 . C u s t o m e ra r r
大学网络教育 MATLAB中提供了一个求解线性代数方程组的函数 linsolve,其调用格式为: linsolve(A,b) 西南科技大学网络教育 西南科技大学网络教育例 AX=b的解。 解方程组 (1)的命令如下: A=[34,8,4。 3,34,3。 3,6,8]。 b=[4。 6。 2]。 X=linsolve(A,b) %调用 linsolve函数求 (1)的解 A\b %用另一种方法求
第二个教学班数学成绩 Y~N(μ2,53) ,1421 nnn建立假设 H0:μ1μ2=0。 H1:μ1μ2 ≠0 选择检验统计量 : 1212221 1 2 2( ) ( ) | ~ ( 0 , 1 )//XYZNnn 接受 H0:μ1=μ2 对于给定的显著性水平 α=, 1 2Z 9 0 9 2 8 9 0 3 5 70 2 0 4 1 9
T4T5T6Tte * ( t )0 复现:将脉冲序列变为连续信号的过程。 由保持器实现。 串滤波器以去处脉冲序列的高频分量所引起的噪声影响。 teh( t )02. 采样系统的典型结构图 保 持 器被 控对 象反 馈环 节r ( t ) e ( t )e * ( t ) eh( t )c ( t )b ( t )T2T3T4T5T6Tte * ( t )0te ( t )0teh( t )0
n 210 , 0 , 1111111111)(vvvvyk 111111)(vvykkk数 学 系 University of Science and Technology of China DEPARTMENT OF MATHEMATICS 01 时,有 )(1)1(1kkyvx01 时