第8章 数据封装—结构体 结构体的概述 结构体类型的定义 结构体类型的变量 结构体数组 结构体作为函数的参数 链表.

Slides:



Advertisements
Similar presentations
程序设计导论 ——第15讲 结构与结构数组.
Advertisements

程序设计导论 结构与结构数组.
二级指针与二维数组.
C语言程序设计基础 第10章 指针进阶 刘新国.
大学实用教程 C语言.
6.4 字符串与指针 1. 用字符数组存放一个字符串.
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
Using C++ The Weird Way Something about c++11 & OOP tricks
补充内容 结构体 概述 定义结构体类型和定义结构体变量 结构体变量的引用 结构体变量的初始化 指针与结构体 用typedef定义类型的别名.
struct 可以在同一個名稱下擁有多種資料型態。使用struct能讓資料的存取和處理更為靈活。
資料大樓 --談指標與陣列 綠園.
内容提要 对象的生命周期 构造函数 析构函数 拷贝构造函数. 常宝宝 北京大学计算机科学与技术系
第九章 结构体 主讲教师 :贾月乐 电话:
补充内容 结构体 概述 定义结构体类型和定义结构体变量 结构体变量的引用 结构体变量的初始化 指针与结构体 用typedef定义类型的别名.
第9章 结构体.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
程序设计专题 第2讲 - 结构 刘新国.
STRUCTURE 授課:ANT 日期:2010/5/12.
自定义数据类型 潘荣江 山东大学计算机科学与技术学院
程序设计基础.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
辅导课程六.
第十章 C高级程序应用—链表* 10.1链表的基本概念 10.2单向链表 10.3双向链表 10.4应用举例.
第7讲 结构体与共用体 7.1 结构体 7.2 共用体.
Zhao4zhong1 (赵中) C语言指针与汇编语言地址.
Zhao4zhong1 (赵中) C语言指针与汇编语言地址.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
第8章 结 构 体.
第11章 结构体和共用体.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
用event class 从input的root文件中,由DmpDataBuffer::ReadObject读取数据的问题
第七章 操作符重载 胡昊 南京大学计算机系软件所.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
C语言复习3----结构体.
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
$9 泛型基础.
浙江长征职业技术学院—计算机与信息技术系—相方莉制作
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
C++大学基础教程 第7章 其它自定义数据类型 北京科技大学 信息基础科学系.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
第九章 用户建立的数据类型.
C++语言程序设计 C++语言程序设计 第三章 控制语句 第十一组 C++语言程序设计.
VB与Access数据库的连接.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
物件導向程式設計 CH2.
第 四 讲 线性表(二).
第三章 数据抽象.
本节内容 类成员的访问控制 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第九节 赋值运算符和赋值表达式.
3.16 枚举算法及其程序实现 ——数组的作用.
本节内容 结构体 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
C/C++基礎程式設計班 C++: 物件的使用、參考、重載函式 講師:林業峻 CSIE, NTU 3/28, 2015.
本节内容 结构体.
实验目的:掌握数据的顺序存储结构及它们在计算机中的操作。 实验内容:
第六章 Excel的应用 五、EXCEL的数据库功能 1、Excel的数据库及其结构 2、Excel下的数据排序 (1)Excel的字段名行
基于列存储的RDF数据管理 朱敏
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
C语言程序设计 第9章 结构体.
本节内容 动态链接库 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
第14讲 结构体和共用体 计算机与通信工程学院.
第八章 结构体和共用体 结构体类型和结构体变量 结构体数组 结构体指针变量 共用体.
Chapter 2 Entity-Relationship Model
Chap 9 结构 9.1 构建学生信息库 9.2 计算学生平均成绩 9.3 学生成绩排序 9.4 修改学生成绩.
第二章 线性表 东南大学计算机学院 方效林 本课件借鉴了清华大学殷人昆老师 和哈尔滨工业大学张岩老师的课件.
資料結構與C++程式設計進階 C++與資料結構 講師:林業峻 CSIE, NTU 7/ 5, 2010.
本节内容 this指针 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
Presentation transcript:

第8章 数据封装—结构体 结构体的概述 结构体类型的定义 结构体类型的变量 结构体数组 结构体作为函数的参数 链表

结构体的概念 打印学生成绩单 ,格式如下: 如何在程序中表示这组学生信息? 学号 姓名 语文成绩 数学成绩 英语成绩. 00001 张三 96 94 88 00003 李四 89 70 76 00004 王五 90 87 78 如何在程序中表示这组学生信息?

可选方案 用二维的数组来表示 每一列用一个一维数组来表示,这种方法称为并联数组。 该方案不可行,因为这些信息有不同的类型 要保证每位学生信息的正确性很难

为什么要使用记录 当我们考虑怎么逻辑地组织数据时,应该将一个人的所有信息项放在一起,即保持相关性。 学号 姓名 语文成绩 数学成绩 英语成绩. 00001 张三 96 94 88 00003 李四 89 70 76 00004 王五 90 87 78

我 们 希 望 的 结 构 记录 在C++中称为结构体 00001 学 生 张三 一 96 94 88 00003 李四 二 89 70 76 三 00004 王五 90 87 78 记录 在C++中称为结构体 我 们 希 望 的 结 构

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

结构体的使用 定义一个新的结构体类型 定义新类型的变量 访问结构体变量

第8章 数据封装—结构体 结构体的概述 结构体类型的定义 结构体类型的变量 结构体数组 结构体作为函数的参数 链表

结构体类型的定义 定义结构体类型中包括哪些分量 格式: struct 结构体类型名{ 字段声明; }; 如: struct studentT { char no[10]; char name[10]; int chinese; int math; int english; };

注意 字段名可与程序中的变量名相同 在不同的结构体中可以有相同的字段名 结构体成员的类型可以是任意类型,当然也可以是结构体类型

struct dateT { int month; int day; int year; }; struct studentT { ... dateT birthday; }; 

第8章 数据封装—结构体 结构体的概述 结构体类型的定义 结构体类型的变量 结构体数组 结构体作为函数的参数 链表

结构体类型的变量 结构体变量的定义 结构体类型的引用 指向结构体的指针 动态分配结构体的空间

结构体变量的定义 结构体变量的定义和普通的变量定义一样。如定义了结构体类型studentT,就可以定义结构体变量: studentT student1; 一旦定义了一个结构体类型的变量,系统在分配内存时就会分配一块连续的空间,依次存放它的每一个分量。这块空间总的名字就是结构体变量的名字。内部还有各自的名字 english math chinese name no student1

结构体变量的初始化 studentT student1= {“00001”,“张三” ,87,90,77};

定义结构体类型的同时定义变量 struct 结构体类型名{ 字段声明; } 结构体变量; struct { 字段声明; } 结构体变量; 区别:前者可以继续用结构体类型名定义变量

结构体类型的变量 结构体变量的定义 结构体类型的引用 指向结构体的指针 动态分配结构体的空间

结构体变量的访问 对结构体类型变量的引用一般为引用他的成员 成员的表示: 结构变量名.成员名 如: student1.name 如结构中还有结构,则一级一级用”.”分开 ,如 如:student1.birthday.year

结构变量的赋值 结构体是一个统称。每个结构体类型在使用前都要先定义自己有哪些分量。系统事先无法知道如何处理他。 因此,结构体变量的赋值通常是通过对它的每一个成员的赋值而实现。如:输入student1的内容可用: cin >> student1.no >> student1.name >> student1.chinese >> student1.math >> student1.english >> student1.birthday.year >> student1.birthday.month >> student1.birthday.day; 同类型的结构变量之间可以相互赋值,如 Student1 = student2; 将student2的成员对应赋给student1的成员

结构变量的输出 结构体变量的输出通常是通过输出它的每一个成员而实现。如:输出student1的内容可用: cout << student1.no << student1.name << student1.chinese << student1.math << student1.english << student1.birthday.year << student1.birthday.month << student1.birthday.day;

结构体类型的变量 结构体变量的定义 结构体类型的引用 指向结构体的指针 动态分配结构体的空间

指向记录的指针 直接定义指针变量 studentT *sp; 也可以在定义结构体类型的同时定义指向结构体的指针 struct 结构体类型名{ 字段声明; } *结构体指针;

通过指针操作记录 给结构体指针赋值,如: sp = &student1; 结构体指针的引用: 通常程序员习惯使用第二种方法 (*指针).成员 如:(*sp).name student1.成员 指针->成员 如:sp->name  ->是所有运算符中优先级最高的 通常程序员习惯使用第二种方法

结构体类型的变量 结构体变量的定义 结构体类型的引用 指向结构体的指针 动态分配结构体的空间

动态分配结构体的空间 指向结构体指针的另一种用法是存储动态申请到的内存的首地址。用法和申请普通的动态变量一样。如: studentT *sp; sp = new studentT;

第8章 数据封装—结构体 结构体的概述 结构体类型的定义 结构体类型的变量 结构体数组 结构体作为函数的参数 链表

结构体数组 用于描述个体的集合 定义格式: studentT studentArray[SIZE];

结构体数组的引用 引用数组的某一成员的成员 studentArray[3].name 数组成员之间相互赋值 studentArray[4] = studentArray[2] 结构数组的初始化 studentT studentArray[5] = { {“00001”, 张三“, 80, 90,98 }, {…}, {…}, {…}};

统计候选人得票。设有三个候选人,每次输入一个 得票的候选人名字,要求最后输出各人得票结果。 struct personT { int id; int count; } leader[3]= {0, 0, 1, 0, 2, 0};

int main() { int i, j, inputID; for (i=1; i<=10; ++i) {cin >> inputID; if (inputID < 0 || inputID > 2) { cout << “废票”;continue;} leader[inputID].count += 1; } cout << endl; for (i=0; i<3; ++i) cout << leader[i].id << “ “ << leader[i].count); return 0;

指针与结构体数组 与普通的指针一样,指向结构体的指针也能够用来指向一个结构体数组。此时,对指针加1就是加了该结构体的大小。

第8章 数据封装—结构体 结构体的概述 结构体类型的定义 结构体类型的变量 结构体数组 结构体作为函数的参数 链表

结构体作为参数传递 尽管结构体和数组一样也有许多分量组成,但结构体的传递和普通内置类型是一样的。它是将实际参数中的每个分量复制到形式参数的每个分量中。

结构体的传递 Void printPerson(PersonT p)

指向结构体的指针作为参数 因为结构体是值传递,当希望把函数内部对结构体的修改返回给主调函数时,可以用指针传递或引用传递 由于结构体一般占用的内存量都比较大,值传递既浪费空间又浪费时间。因此可用指针传递或引用传递 指针传递形式比较繁琐,所以C++通常用引用传递 引用传递的问题是函数中可以修改实际参数,要控制函数中不能修改实际参数,可以加const限定

指向结构体的指针作为参数 和普通的指针传递一样,函数中可以通过指针访问主调函数的记录 减少函数调用时的数据传递量 Void PrintPerson(personT &p); Void PrintPerson(const personT &p);

结构体传递的实例 设计一函数,打印学生信息

设计一:值传递 Void PrintStudent(studentT s) {cout << s.no << ‘\t’ << s.name << ‘\t’ << s.chinese << ‘\t’ << s.math << ‘\t’ << s.english << endl; } 缺点:浪费时间空间

设计二:指针传递或引用传递 Void PrintStudent(studentT *s) { cout << s->no << ‘\t’ << s->name << ‘\t’ << s->chinese << ‘\t’ << s->math << ‘\t’ << s->english << endl; } Void PrintStudent(studentT &s) { cout << s.no << ‘\t’ << s.name << ‘\t’ << s.chinese << ‘\t’ << s.math << ‘\t’ << s.english << endl; 缺点:不安全

设计三:C++的常规做法 Void PrintStudent(const studentT &s) {cout << s.no << ‘\t’ << s.name << ‘\t’ << s.chinese << ‘\t’ << s.math << ‘\t’ << s.english << endl; } 特点:节约内存,提高函数调用速度,可靠

返回结构体类型的函数 一个函数返回一个结构体。如: personT GetPersonData(void) {personT person; ……. Return(person);} 返回的是一个结构体的复制。 在主调函数中必须有这样的程序段: Main() { personT p1,p2; p1=GetPersonData();}

返回结构体引用的函数 函数返回一个结构体的引用。如: personT &GetPersonData(void) {personT *person = new personT; ……. Return(*person);} 本质上返回的是结构体的地址。 在主调函数中可以有这样的程序段: Main() { personT & p1=GetPersonData(); … } 函数中返回的结构体不能是局部变量

第8章 数据封装—结构体 结构体的概述 结构体类型的定义 结构体类型的变量 结构体数组 结构体作为函数的参数 链表

单链表 链表的概念 链表的存储 链表的操作 循环链表

单链表 只指出后继关系的链表 nil head 头结点

双链表 同时存储前趋和后继 head 循环链表 head

单链表 链表的概念 链表的存储 链表的操作 循环链表

单链表的存储 struct linkRec { datatype data; linkRec *next; } 存储链表就是存储链表中的一个节点的地址,因此需要定义一个节点类型 struct linkRec { datatype data; linkRec *next; }

单链表 链表的概念 链表的存储 链表的操作 循环链表

单链表操作—插入 在结点p后插入一个结点 tmp head p  申请空间 输入数据放入申请到的空间 链入p后

tmp = new LinkRec; // 创建一个新节点 tmp->data = x; // 把x放入新节点的数据成员中 tmp->next = p->next; // 把新节点和p的下一成员相连 p->next = tmp; //把p和新节点连接起来

单链表操作—删除 把结点p后的结点删除  delPtr=p->next; p->next=delPtr->next; head p delPtr  delPtr=p->next; p->next=delPtr->next; delete delPtr;

单链表操作--建立 定义头指针:linkRec *head; 建立头结点 申请空间 设为头结点 head

单链表操作--建立(续) 逐个从键盘输入数据,存入链表 置链表结束标志 接受输入 申请空间 输入数据放入申请到的空间 链入链表尾 a b c head a b c d ^

head = 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;

单链表操作—输出 p = head->next; while ( p != NULL) b c d ^ p = head->next; while ( p != NULL) { cout << p->data; p = p->next; }

创建并访问一个带头结点的、存储整型数据的单链表,数据从键盘输入,0为输入结束标志。 #include <iostream> using namespace std;   struct linkRec { int data; linkRec *next; };

int 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 << "链表的内容为:\n"; p = head->next; while (p != NULL) { cout << p->data << '\t'; p = p->next; } cout << endl; return 0;

单链表 链表的概念 链表的存储 链表的操作 循环链表

循环链表的应用—约瑟夫环 例:n个人围成一圈,从第一个人开始报数1、2、3。凡报到 3者退出圈子。找出最后留在圈子中的人的序号。 解。用循环链表 1 2 4 3 head 当n = 5时,其删除的节点的顺序为2,0,4,1,最后剩下的节点为3。

struct node { int data; node *next; }; int main() { node *head, *p, *q; // head为链表头 int n, i; //输入n cout << "\ninput n:"; cin >> n; //建立链表 head = p = new node; p->data = 0; //p指向表尾 for (i=1; i<n; ++i) { q = new node; //q为当前正在创建的节点 q->data =i; p->next = q; p = q; //将q链入表尾 } p->next = head; // 头尾相连

// 删除过程 q=head; while (q->next != q) //只要表非空 { for (i = 0; i<2; ++i) //报数, { p = q; q = p->next;} p->next = q->next; //绕过节点q cout << q->data << '\t'; //显示被删者的编号 delete q; //回收被删者的空间 q=p->next; //让q指向报1的节点 } // 打印结果 cout << "\n最后剩下: " << q->data << endl; return 0;

链表总结 实现较复杂 插入、删除效率高,但查找第i个元素效率低 无表满的问题 适合于动态表

总结 本章介绍了结构体 作用: 处理更复杂的数据 使用: 定义类型 定义变量 链表