ch08数据封装——结构体_第1页
ch08数据封装——结构体_第2页
ch08数据封装——结构体_第3页
ch08数据封装——结构体_第4页
ch08数据封装——结构体_第5页
已阅读5页,还剩63页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、v结构体的概述结构体的概述v结构体类型的定义结构体类型的定义v结构体类型的变量结构体类型的变量v结构体数组结构体数组v结构体作为函数的参数结构体作为函数的参数v链表链表v打印学生成绩单打印学生成绩单 ,格式如下:,格式如下:学号学号姓名姓名语文成绩语文成绩数学成绩数学成绩英语成绩英语成绩.00001张三张三96948800003李四李四89707600004王五王五908778如何在程序中表示这组学生信息?如何在程序中表示这组学生信息?v用二维的数组来表示用二维的数组来表示该方案不可行,因为这些信息有不同的类型该方案不可行,因为这些信息有不同的类型v每一列用一个一维数组来表示,这种方法每一列用

2、一个一维数组来表示,这种方法称为并联数组。称为并联数组。要保证每位学生信息的完整性和正确性很难要保证每位学生信息的完整性和正确性很难v当我们考虑怎么逻辑地组织数据时,应该将一当我们考虑怎么逻辑地组织数据时,应该将一个人的所有信息项放在一起,即保持相关性。个人的所有信息项放在一起,即保持相关性。学号学号姓名姓名语文成绩语文成绩 数学成绩数学成绩 英语成绩英语成绩.00001张三张三96948800003李四李四89707600004王五王五908778学学生生一一00001张三张三969488学学生生二二00003李四李四897076学学生生三三00004王五王五908778记录记录在在C+中称

3、为结构体中称为结构体v结构体类型允许程序员把一些分量聚合结构体类型允许程序员把一些分量聚合成一个整体,用一个变量表示。成一个整体,用一个变量表示。v一个结构体的各个分量都有名字,把这一个结构体的各个分量都有名字,把这些分量称为成员些分量称为成员(member)。v由于结构体的成员可以是各种类型的,由于结构体的成员可以是各种类型的,程序员能创建适合于问题的数据集合。程序员能创建适合于问题的数据集合。v定义一个新的结构体类型定义一个新的结构体类型 v定义新类型的变量定义新类型的变量 v访问结构体变量访问结构体变量 v结构体的概述结构体的概述v结构体类型的定义结构体类型的定义v结构体类型的变量结构体

4、类型的变量v结构体数组结构体数组v结构体作为函数的参数结构体作为函数的参数v链表链表v定义结构体类型中包括哪些分量定义结构体类型中包括哪些分量v格式:格式:struct 结构体类型名结构体类型名字段声明;字段声明;如:如:struct studentT char no10; char name10; int chinese; int math; int english; ;v字段名可与程序中的变量名相同字段名可与程序中的变量名相同 v在不同的结构体中可以有相同的字段名在不同的结构体中可以有相同的字段名 v结构体成员的类型可以是任意类型,当结构体成员的类型可以是任意类型,当然也可以是结构体类型然

5、也可以是结构体类型struct dateTint month;int day;int year;struct studentT.dateT birthday; v结构体的概述结构体的概述v结构体类型的定义结构体类型的定义v结构体类型的变量结构体类型的变量v结构体数组结构体数组v结构体作为函数的参数结构体作为函数的参数v链表链表v结构体变量的定义结构体变量的定义v结构体类型的引用结构体类型的引用v指向结构体的指针指向结构体的指针v动态分配结构体的空间动态分配结构体的空间 v结构体变量的定义和普通的变量定义一样。结构体变量的定义和普通的变量定义一样。如定义了结构体类型如定义了结构体类型studen

6、tT,就可以定义结,就可以定义结构体变量:构体变量: studentT student1;v一旦定义了一个结构体类型的变量,系统在一旦定义了一个结构体类型的变量,系统在分配内存时就会分配一块连续的空间,依次分配内存时就会分配一块连续的空间,依次存放它的每一个分量。这块空间总的名字就存放它的每一个分量。这块空间总的名字就是结构体变量的名字。内部还有各自的名字是结构体变量的名字。内部还有各自的名字 englishmathchinesenamenostudent1结构体变量的初始化结构体变量的初始化studentT student1= “00001”,“张三张三” ,87,90,77; struct

7、 结构体类型名结构体类型名 字段声明;字段声明; 结构体变量;结构体变量;struct 字段声明;字段声明; 结构体变量;结构体变量;区别:前者可以继续用结构体类型名定义变量v结构体变量的定义结构体变量的定义v结构体类型的引用结构体类型的引用v指向结构体的指针指向结构体的指针v动态分配结构体的空间动态分配结构体的空间 结构体变量的访问结构体变量的访问成员的表示:成员的表示: 结构变量名结构变量名.成员名成员名 如如: 如结构中还有结构,则一级一级用如结构中还有结构,则一级一级用”.”分开分开 ,如,如如:如:student1.birthday.yearv对结构体类型

8、变量的引用一般为引用他对结构体类型变量的引用一般为引用他的成员的成员 结构变量的赋值结构变量的赋值v结构体是一个统称。每个结构体类型在使用前都要先定义结构体是一个统称。每个结构体类型在使用前都要先定义自己有哪些分量。系统事先无法知道如何处理他。自己有哪些分量。系统事先无法知道如何处理他。v因此,结构体变量的赋值通常是通过对它的每一个成员的因此,结构体变量的赋值通常是通过对它的每一个成员的赋值而实现。如:输入赋值而实现。如:输入student1的内容可用的内容可用: cin student1.no student1.chinese student1.math stud

9、ent1.english student1.birthday.year student1.birthday.month student1.birthday.day;v同类型的结构变量之间可以相互赋值,如同类型的结构变量之间可以相互赋值,如student1 = student2;将将student2的成员对应赋给的成员对应赋给student1的成员的成员结构变量的输出结构变量的输出v结构体变量的输出通常是通过输出它的每一结构体变量的输出通常是通过输出它的每一个成员而实现。如:输出个成员而实现。如:输出student1的内容可的内容可用用: cout student1.no student1.na

10、me student1.chinese student1.math student1.english student1.birthday.year student1.birthday.month 成员成员 如:如:sp-namestudent1.成员成员 -是所有运算符中优先级最高的是所有运算符中优先级最高的 通常程序员习惯使用第二种方法通常程序员习惯使用第二种方法v结构体变量的定义结构体变量的定义v结构体类型的引用结构体类型的引用v指向结构体的指针指向结构体的指针v动态分配结构体的空间动态分配结构体的空间 v指向结构体指针的另一种用法是存储动指向结构体指针的另一种用法是存储动态申请到的内存的

11、首地址。用法和申请态申请到的内存的首地址。用法和申请普通的动态变量一样。如:普通的动态变量一样。如: studentT *sp; sp = new studentT;v结构体的概述结构体的概述v结构体类型的定义结构体类型的定义v结构体类型的变量结构体类型的变量v结构体数组结构体数组v结构体作为函数的参数结构体作为函数的参数v链表链表 结构体数组结构体数组v用于描述个体的集合用于描述个体的集合v定义格式:定义格式: studentT studentArraySIZE;结构体数组的引用结构体数组的引用v引用数组的某一成员的成员引用数组的某一成员的成员 studentAv数组成员

12、之间相互赋值数组成员之间相互赋值 studentArray4 = studentArray2v结构数组的初始化结构数组的初始化 studentT studentArray5 = “00001”, 张三张三“, 80, 90,98 , , , ;统计候选人得票。设有三个候选人,每次输入一个统计候选人得票。设有三个候选人,每次输入一个得票的候选人名字,要求最后输出各人得票结果。得票的候选人名字,要求最后输出各人得票结果。 struct personT int id; int count; leader3= 0, 0, 1, 0, 2, 0; int main() int i, inputID; f

13、or (i=1; i inputID; if (inputID 2) cout “废票废票”;continue; leaderinputID.count += 1; cout endl; for (i=0; i3; +i) cout leaderi.id “ “ leaderi.count); return 0; v与普通的指针一样,指向结构体的指针与普通的指针一样,指向结构体的指针也能够用来指向一个结构体数组。此时,也能够用来指向一个结构体数组。此时,对指针加对指针加1就是加了该结构体的大小。就是加了该结构体的大小。v结构体的概述结构体的概述v结构体类型的定义结构体类型的定义v结构体类型的变

14、量结构体类型的变量v结构体数组结构体数组v结构体作为函数的参数结构体作为函数的参数v链表链表v尽管结构体和数组一样也有许多分量组尽管结构体和数组一样也有许多分量组成,但结构体的传递和普通内置类型是成,但结构体的传递和普通内置类型是一样的。它是将实际参数中的每个分量一样的。它是将实际参数中的每个分量复制到形式参数的每个分量中。复制到形式参数的每个分量中。Void printPerson(PersonT p)v因为结构体是值传递,当希望把函数内部对结构因为结构体是值传递,当希望把函数内部对结构体的修改返回给主调函数时,可以用指针传递或体的修改返回给主调函数时,可以用指针传递或引用传递引用传递v由于

15、结构体一般占用的内存量都比较大,值传递由于结构体一般占用的内存量都比较大,值传递既浪费空间又浪费时间。因此可用指针传递或引既浪费空间又浪费时间。因此可用指针传递或引用传递用传递v指针传递形式比较繁琐,所以指针传递形式比较繁琐,所以C+C+通常用引用传递通常用引用传递v引用传递的问题是函数中可以修改实际参数,要引用传递的问题是函数中可以修改实际参数,要控制函数中不能修改实际参数,可以加控制函数中不能修改实际参数,可以加constconst限定限定v和普通的指和普通的指针传递一样,针传递一样,函数中可以函数中可以通过指针访通过指针访问主调函数问主调函数的记录的记录v减少函数调减少函数调用时的数据用

16、时的数据传递量传递量Void PrintPerson(personT &p);Void PrintPerson(const personT &p);v设计一函数,打印学生信息设计一函数,打印学生信息Void PrintStudent(studentT s)cout s.no t t s.chinese t s.math t s.english endl;缺点:浪费时间空间缺点:浪费时间空间Void PrintStudent(studentT *s) cout no t name t chinese t math t english endl;Void PrintS

17、tudent(studentT &s) cout s.no t t s.chinese t s.math t s.english endl;缺点:不安全缺点:不安全Void PrintStudent(const studentT &s)cout s.no t t s.chinese t s.math t s.english data = x; / 把把x放入新节点的数据成员中放入新节点的数据成员中tmp-next = p-next; / 把新节点和把新节点和p的下一成员相连的下一成员相连p-next = tmp; /把把p和新节点连接起来和新节点连接

18、起来 单链表操作单链表操作删除删除把结点把结点p后的结点删除后的结点删除headpdelPtr delPtr=p-next;p-next=delPtr-next;delete delPtr; 单链表操作单链表操作-建立建立v定义头指针:定义头指针:linkRec *head;v建立头结点建立头结点申请空间申请空间设为头结点设为头结点 head单链表操作单链表操作-建立建立(续)(续)v逐个从键盘输入数据,存入链表逐个从键盘输入数据,存入链表 接受输入接受输入申请空间申请空间输入数据放入申请到的空间输入数据放入申请到的空间链入链表尾链入链表尾 v置链表结束标志置链表结束标志headabcd he

19、ad = new linkRec;rear = head;cin in_data;while (输入未结束输入未结束) p = new linkRec; p-data = in_data; rear-next = p; rear = p; cin in_data; rear-next = NULL; 单链表操作单链表操作输出输出headabcd p = head-next;while ( p != NULL) cout data; p = p-next; #include using namespace std; struct linkRec int data; linkRec *next;i

20、nt main() int x; /存放输入的值存放输入的值 linkRec *head, *p, *rear; head = rear = new linkRec; while (true) /创建链表的其他结点创建链表的其他结点 cin x; if (x = 0) break; p = new linkRec; p-data = x; rear-next = p; rear = p; rear-next = NULL;/设置设置rear为表尾,其后没有结点了为表尾,其后没有结点了 /读链表读链表 cout next; while (p != NULL) cout data next; co

21、ut data data) c = a; a = a-next; else c = b; b = b-next; p = c; while (a != NULL & b != NULL) if (a-data data) p-next = a; a = a-next; else p-next = b; b = b-next; p = p-next; if (a = NULL) p-next = b; else p-next = a; return (c); 1. comment: Bp.r is an auxiliary array2. sp, tq+1, kp3. while sq and tr4. if AsAt then5. BkAs6. ss+17. else8. BkAt9. tt+110. end if11. kk+112. endwhile13. if s=q+1 then Bk.rAt.r14. else Bk.rAs.q15. endif16. Ap.rBp.r数组段Ap.q和Aq+1.r都为升序,使Ap,r为升序v链表的概念链表的概念v链表的存储链表的存储v链表的操作链表的操作v链表的应用链表的应用v循环链表循环链表例:例:n个人围成一圈,从第一个人开始报数个人围成一圈,从第一个人开始

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论