




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、黄兴鼎版权所有黄兴鼎版权所有 第十四讲第十四讲 结构体结构体 相关数据的集合。相关数据的集合。 数据的类型可以不相同。数据的类型可以不相同。 用来定义保存在文件中的记录。用来定义保存在文件中的记录。 与指针一起创建动态的数据结构:与指针一起创建动态的数据结构: 链表链表 队列队列 栈栈 树树 结构体:结构体: 把关系紧密且逻辑相关的多种不同类型的变量组织到统一的名字之下,也称复把关系紧密且逻辑相关的多种不同类型的变量组织到统一的名字之下,也称复 合数据类型,这种类型的变量占用相邻的一段内存单元合数据类型,这种类型的变量占用相邻的一段内存单元 黄兴鼎版权所有黄兴鼎版权所有 第十四讲第十四讲 结构
2、体结构体 结构体的概念结构体的概念 结构体类型的定义结构体类型的定义 结构体变量结构体变量 定义和声明定义和声明 初始化初始化 使用使用 结构体数组结构体数组 C C语言程序设计语言程序设计 本讲是教材第11章,但我们由于 课时和全国C的大纲关系,第四至 10节不讲,有兴趣者,自己学习. 本课件后面还有一些有趣的例子, 如冼牌,选举计票程序, 有兴趣 者也可以自学. 结构体是用户自定义的数据结构体是用户自定义的数据 类型,是派生的数据类型类型,是派生的数据类型 使用其他类型的对象来构造使用其他类型的对象来构造 结构体。结构体。 共用体也是用户自定共用体也是用户自定 义的数据类型。义的数据类型。
3、 黄兴鼎版权所有黄兴鼎版权所有 结构体类型定义的一般形式为:结构体类型定义的一般形式为: struct struct 结构体名结构体名 类型名类型名1 1 成员名成员名1 1; 类型名类型名2 2 成员名成员名2 2; 类型名类型名n n 成员名成员名n n; ; 结构体结构体 其中,其中,structstruct是关键字,是结构体类型的标志。结构体名是是关键字,是结构体类型的标志。结构体名是 由用户定义的标识符,它规定了所定义的结构体类型的名称。由用户定义的标识符,它规定了所定义的结构体类型的名称。 结构体类型的组成成分称为成员,成员名的命名规则与变量名结构体类型的组成成分称为成员,成员名的
4、命名规则与变量名 相同。相同。 如果成员的类型相同,则可以同变量一样在一个类型名后写如果成员的类型相同,则可以同变量一样在一个类型名后写 出几个成员名,他们之间用逗号分隔。出几个成员名,他们之间用逗号分隔。 struct struct student long int xuhao long int xuhao; char name8char name8; int eng ,coup,sum;int eng ,coup,sum; float ave; float ave; ; 黄兴鼎版权所有黄兴鼎版权所有 结构体结构体 结构体结构体 数组是由相同类型的数据构成,而现实生活中由一些不相数组是由相同
5、类型的数据构成,而现实生活中由一些不相 同类型的数据构成的一组数据是相当多的,例如学号、姓名和同类型的数据构成的一组数据是相当多的,例如学号、姓名和 学生成绩。学生成绩。C C语言提供了这种数据结构称为语言提供了这种数据结构称为结构体,它是一种结构体,它是一种 较为复杂而又非常灵活的构造型的数据类型。较为复杂而又非常灵活的构造型的数据类型。 一个结构体类型可以由若干个成员(或域)的成分组成,一个结构体类型可以由若干个成员(或域)的成分组成, 不同的结构体类型其成员不同。不同的结构体类型其成员不同。 对于一个具体的结构体而言其成员的数量是固定的(同数对于一个具体的结构体而言其成员的数量是固定的(
6、同数 组一样),各成员的数据类型可以不同,这是结构体与数组的组一样),各成员的数据类型可以不同,这是结构体与数组的 重要相同和不同点。重要相同和不同点。 黄兴鼎版权所有黄兴鼎版权所有 struct date int year; int month; int day; ; 也可以写成:也可以写成: struct date int year,month,day; struct student int num; char name8,sex; float score4; ; struct:引入结构体定义。:引入结构体定义。 date:结构体的名称,必须与:结构体的名称,必须与 struct 一起使用
7、。一起使用。 struct date 结构体包含结构体包含3个个 int * 类型的类型的成员成员: year Month day 例如例如A: 这里struct student结构体包含有: Int 型num(学号) char name8(姓名),sex(性别) Float score4(成绩数组) 例如例如B: 黄兴鼎版权所有黄兴鼎版权所有 结构体类型的定义结构体类型的定义 结构体定义说明结构体定义说明 同一个结构体内不可以有同名的成员。同一个结构体内不可以有同名的成员。 不同结构体的成员名可以相同,不互相冲突。不同结构体的成员名可以相同,不互相冲突。 结构体结构体 struct date
8、 int year,month,day; ; struct Book char title50,writer20,publisher50; int year,month; ; int year,month,day; 黄兴鼎版权所有黄兴鼎版权所有 结构体类型的定义结构体类型的定义 结构体定义说明结构体定义说明 结构体的成员可以是基本类型和构造类型(数组和其他结构体)。结构体的成员可以是基本类型和构造类型(数组和其他结构体)。 结构体结构体 struct date int year,month,day; birthday; struct StuRec int num;char name20;/这里
9、包含了数组这里包含了数组 struct date birthday;/这里包含了上面的结构体这里包含了上面的结构体,称称结构体的嵌套结构体的嵌套 ; 结构体的成员不可以包含自身结构体的成员不可以包含自身 但可以包含自身的指针但可以包含自身的指针 struct student char name20; char gender; float scores4; struct student next; /error struct student *nextPtr; /correct ; 这是这是11.4结构体类型的嵌套,是指结构体类型的嵌套,是指 结构体的成员是一个结构体类型。结构体的成员是一个结构
10、体类型。 黄兴鼎版权所有黄兴鼎版权所有 结构体变量结构体变量 结构体定义说明结构体定义说明 只是创建了新的数据类型,并不能保留内存空间。只是创建了新的数据类型,并不能保留内存空间。 必须定义结构体变量来获得内存空间。必须定义结构体变量来获得内存空间。 定义定义(声明声明)结构体变量结构体变量 有三种方法有三种方法: 1.定义结构体类型后,像声明普通变量一样声明结构体变量。定义结构体类型后,像声明普通变量一样声明结构体变量。 结构体结构体 struct date int year,month,day; ; struct date birth; year month day FF00 FF04 F
11、F08 birth birth 的存储形式的存储形式 TC中与中与VC中的不同中的不同 黄兴鼎版权所有黄兴鼎版权所有 结构体变量结构体变量 定义声明结构体变量定义声明结构体变量 2.在定义结构体类型的同时,声明结构体变量在定义结构体类型的同时,声明结构体变量 结构体结构体 struct date int year,month,day; birth, days4, *bPtr; struct int year,month,day; birth, days4, *bPtr; 没有结构体名,没有结构体名, 无法再次使用。无法再次使用。 3.直接(只)声明结构体变量直接(只)声明结构体变量省略类型名。
12、省略类型名。 类型与变量是不同的概念,注意区分。系统能对变量赋值、存类型与变量是不同的概念,注意区分。系统能对变量赋值、存 取、运算,而类型则不能,编译时,系统只对变量分配存储空取、运算,而类型则不能,编译时,系统只对变量分配存储空 间,而类型则不分配。间,而类型则不分配。 结构体中的成员也可以是一个结构体变量,即结构体的嵌套。结构体中的成员也可以是一个结构体变量,即结构体的嵌套。 黄兴鼎版权所有黄兴鼎版权所有 struct student /* student是结构体名,结构体成员有是结构体名,结构体成员有num,name,sex,date,scre4 */ int num; char na
13、me8,sex; struct date /date是结构体名。是结构体名。 int year,month,day; birthday; /结构体变量表是结构体变量表是birthday,成员包括年月日,成员包括年月日 float score4; /*score4是数组,数组成员类型浮点型是数组,数组成员类型浮点型 */ xuesh; 结构体中的成员名可以和程序中的变量同名;不同结构体结构体中的成员名可以和程序中的变量同名;不同结构体 中的成员名也可以同名。中的成员名也可以同名。 黄兴鼎版权所有黄兴鼎版权所有 结构体的操作结构体的操作 结构体变量可以执行的操作结构体变量可以执行的操作 将结构体变
14、量赋给相同类型的结构体变量。将结构体变量赋给相同类型的结构体变量。 得到结构体变量的地址。得到结构体变量的地址。 访问结构体变量的成员。访问结构体变量的成员。 使用使用 sizeof 确确(测测)定结构体变量的大小。定结构体变量的大小。 结构体结构体 黄兴鼎版权所有黄兴鼎版权所有 结构体变量的初始化结构体变量的初始化 给全部成员赋初值给全部成员赋初值 结构体结构体 struct student int num; char name8,sex; struct date int year,month ,day ; birthday; float sco 4; xuesh=101,“王小宁”,F,1
15、975,5,21,83.6,88,75.5,90; 将结构体变量各成员的初值顺序地放在一对大括号中,并用逗号分隔。对将结构体变量各成员的初值顺序地放在一对大括号中,并用逗号分隔。对 结构体类型变量赋初值时,按每个成员在结构体中的顺序一一对应赋值。结构体类型变量赋初值时,按每个成员在结构体中的顺序一一对应赋值。 同变量一样结构体变量在定义时也可以进行初始化。同变量一样结构体变量在定义时也可以进行初始化。 黄兴鼎版权所有黄兴鼎版权所有 结构体变量的初始化结构体变量的初始化 初始化结构体变量初始化结构体变量 给部分成员赋初值。给部分成员赋初值。 结构体结构体 struct StuRec int nu
16、m; char name20; struct date int year,month,day; birthday; float score; student=101, “王小宁”; num (2B) name (20B) birthday(6B)score (4B) yearmonthday 101王小宁0000.0 黄兴鼎版权所有黄兴鼎版权所有 结构体变量的成员结构体变量的成员 访问结构体成员的两种方式访问结构体成员的两种方式 结构体成员运算符:结构体成员运算符:. 用于结构体变量用于结构体变量 结构体指针运算符:结构体指针运算符:- 用于指向结构体的指针用于指向结构体的指针 等价于等价于
17、(*cardPtr).face 结构体结构体 struct card myCard; printf(“%s”, myCard.face); struct card *cardPtr; printf(“%s”, cardPtr-face); struct card char *face; char *suit; myCard.face; 黄兴鼎版权所有黄兴鼎版权所有 案例分析:结构体变量的成员案例分析:结构体变量的成员 问题:访问结构体变量的成员。问题:访问结构体变量的成员。(cw1301.c) 结构体结构体 #include struct card char *face; char *suit
18、; a; Int main() struct card a, *aPtr; a.face = Ace; a.suit = Spades; aPtr = printf(%s%s%sn%s%s%sn%s%s%sn, a.face, of , a.suit, aPtr-face, of , aPtr-suit, (*aPtr).face, of , (*aPtr).suit); 与数组的不同:与数组的不同: 结构变量名不是指针结构变量名不是指针 Ace of Spades Ace of Spades Ace of Spades 注意:注意: 结构不能作为整体输入输出。结构不能作为整体输入输出。 必须
19、逐个成员输入输出。必须逐个成员输入输出。 黄兴鼎版权所有黄兴鼎版权所有 结构体作为函数的参数结构体作为函数的参数 把结构体的单个成员传递给函数把结构体的单个成员传递给函数 值传递。值传递。 被调用函数不能修改调用函数中的结构体成员。被调用函数不能修改调用函数中的结构体成员。 把整个结构体传递给函数把整个结构体传递给函数 值传递。值传递。 被调用函数不能修改调用函数中的结构体。被调用函数不能修改调用函数中的结构体。 把结构体指针传递给函数把结构体指针传递给函数 模拟引用传递。模拟引用传递。 被调用函数能修改调用函数中的结构体。被调用函数能修改调用函数中的结构体。 结构体结构体 黄兴鼎版权所有黄兴
20、鼎版权所有 案例分析:结构体作为函数的参数案例分析:结构体作为函数的参数 问题:编写函数实现结构体的复制。问题:编写函数实现结构体的复制。 结构体结构体 #include#include structstruct date date int year, month, day; ; int year, month, day; ; voidvoid show(char show(char * *, struct date);, struct date); voidvoid copy(struct date, struct date); copy(struct date, struct date);
21、 voidvoid clone(struct date, struct date clone(struct date, struct date * *);); intint main() main() structstruct date d1, d2, d3, d4; date d1, d2, d3, d4; d1.year = 2004; d1.year = 2004; d1.month = 5; d1.month = 5; d1.day = 1; d1.day = 1; show(“d1”, d1); show(“d1”, d1); /结构体变量作实参,值传递结构体变量作实参,值传递 d2
22、 = d1;d2 = d1; show(d2, d2); show(d2, d2); 实现实现(cw1302.c) 黄兴鼎版权所有黄兴鼎版权所有 案例分析:结构体作为函数的参数案例分析:结构体作为函数的参数 结构体结构体 copy(d1, d3); copy(d1, d3); show(d3, d3); show(d3, d3); clone(d1, clone(d1, show(d4, d4); show(d4, d4); voidvoid show(char show(char * *name, struct date d)name, struct date d) printf(%s: %
23、d-%d-%dn, name, d.year, d.month, d.day); printf(%s: %d-%d-%dn, name, d.year, d.month, d.day); voidvoid copy(struct date s, copy(struct date s, struct date dstruct date d) ) d = s; d = s; voidvoid clone(struct date s, clone(struct date s, struct date struct date * *dPtrdPtr) ) * *dPtr = s; dPtr = s;
24、d1: 2004-5-1 d2: 2004-5-1 d3: 0-0-24 (TC)在在VC中运行的结果不一样中运行的结果不一样-858993460-858993460-858993460 d4: 2004-5-1 用指针作形参 用地址作实参传递 /结构体变量作实参,值传递,d3未赋值作实参值不确定 空返回,无值返回 (cw1302.c)续)续 结构体指针是本章第结构体指针是本章第5节。节。 黄兴鼎版权所有黄兴鼎版权所有 结构体数组结构体数组 一、结构体数组的定义一、结构体数组的定义 定义结构体数组的方法和定义结构体变量的方法一样,只定义结构体数组的方法和定义结构体变量的方法一样,只 是必须说明
25、其为数组。是必须说明其为数组。 定义结构体变量的三种方法都可以用来定义结构体数组。定义结构体变量的三种方法都可以用来定义结构体数组。 二、结构体数组的初始化二、结构体数组的初始化 和一般数组一样,结构体数组也可以进行初始化。和一般数组一样,结构体数组也可以进行初始化。 数组每个元素的初值都放在一对大括号中,括号中依次排数组每个元素的初值都放在一对大括号中,括号中依次排 列元素各成员的初始值列元素各成员的初始值 三、结构体数组的引用三、结构体数组的引用 对结构体数组的引用一般是对数组元素的成员进行引用。对结构体数组的引用一般是对数组元素的成员进行引用。 引用只要遵循对数组元素的引用规则和对结构体
26、变量成员的引用只要遵循对数组元素的引用规则和对结构体变量成员的 引用规则即可。引用规则即可。 黄兴鼎版权所有黄兴鼎版权所有 一. 结构体数组的定义 1. 1. 先定义结构体类型,后定义结构体数组先定义结构体类型,后定义结构体数组 struct student students100struct student students100; 2. 2. 结构体数组与结构体类型同时定义结构体数组与结构体类型同时定义 struct student struct student long ID long ID; char name10char name10; int ageint age; float s
27、core3float score3; students100students100; 3. 3. 不定义结构体类型名,直接定义结构体数组不定义结构体类型名,直接定义结构体数组 struct struct long ID long ID; char name10char name10; int ageint age; float score3float score3; students100students100; 结构体数组结构体数组 黄兴鼎版权所有黄兴鼎版权所有 结构体数组结构体数组 结构体数组结构体数组 数组的元素是结构体变量。数组的元素是结构体变量。 常用结构体来表示记录,那么结构体数组
28、就可以表示一组记常用结构体来表示记录,那么结构体数组就可以表示一组记 录。录。 案例分析案例分析 全班全班 N 个学生,每个学生有学号、姓名、四门课的成绩。个学生,每个学生有学号、姓名、四门课的成绩。 结构体结构体 学号学号姓名姓名成绩成绩1成绩成绩2成绩成绩3成绩成绩4 101WangHai80787681 102ZhaoFei68667175 130LiRui82768184 黄兴鼎版权所有黄兴鼎版权所有 结构体数组结构体数组 结构体数组结构体数组 案例分析案例分析 那么,可以定义结构体数组来保存那么,可以定义结构体数组来保存 N 个学生的数据。个学生的数据。 结构体结构体 struct
29、student int num; char name20; float scores4; ; struct student students30; 这样,每个学生的数据就对应一个结构体变量(一条记录),便于编程这样,每个学生的数据就对应一个结构体变量(一条记录),便于编程 处理。处理。 黄兴鼎版权所有黄兴鼎版权所有 程序举例程序举例 设某班有设某班有N名学生,每个学生数据包括学号,姓名,性别,年龄,平均成绩。名学生,每个学生数据包括学号,姓名,性别,年龄,平均成绩。 要求输入任意一个学号,输出该学生的所有数据。要求输入任意一个学号,输出该学生的所有数据。 分析:从一组数据中查找所需要的具有某特
30、征的内容,最简单的是顺序查找。分析:从一组数据中查找所需要的具有某特征的内容,最简单的是顺序查找。 直到找到或找完为止。直到找到或找完为止。 /*Cw1303.c 教材教材P171L11-1*/ #include #define N 2 struct student /定义结构体定义结构体 long int num;/学号学号 char name7;/姓名姓名 char sex3;/性别性别 int age,score;/成绩成绩 stuN;/定义结构体数组定义结构体数组 int main() int i,t=-1;/t=-1为未查找到时的标志为未查找到时的标志 long int xuehao
31、;/查找学号变量查找学号变量 struct student stuN; /定义结构体类型数组定义结构体类型数组 (cw1303.c)案例分析:结构体数组案例分析:结构体数组 黄兴鼎版权所有黄兴鼎版权所有 printf(请按下列顺序输入请按下列顺序输入%d个学生的信息个学生的信息:n,N); /为结构体变量赋值为结构体变量赋值 printf(t学号学号 姓名姓名 性别性别 年龄年龄 平均平均n); for (i=0;iN;i+) printf(NO%d:t,i+1); scanf(%ld%s%s%d%d, printf(请输入需查找学生的学号:请输入需查找学生的学号:); scanf(%ld,
32、for(i=0;iN;i+) if(xuehao=stui.num) t=i;break; if (t!=-1) /*以下输出检索结果以下输出检索结果*/ printf(%ld%8s%4s%4d%4dn,stut.num,,stut.sex,stut.age, stut.score); else printf(查无此人查无此人!n); (cw1303.c)续)续 黄兴鼎版权所有黄兴鼎版权所有 案例分析:结构体数组案例分析:结构体数组 检索检索 问题:问题: 某班有某班有 n 个学生,每个学生的数据包括学号、姓名、年龄和性别。个学生,每个学生的数据包括学号、姓名、年龄和性别。
33、要求给定任意一个学号,程序能输出检索的结果,并显示对应的学要求给定任意一个学号,程序能输出检索的结果,并显示对应的学 生的数据。生的数据。 分析分析 定义结构体表示学生定义结构体表示学生 用结构体数组保存学生数据用结构体数组保存学生数据 采用顺序查找法采用顺序查找法 结构体结构体 输入学生信息输入学生信息 输入查询条件输入查询条件 查找学生信息,报告结果查找学生信息,报告结果 黄兴鼎版权所有黄兴鼎版权所有 案例分析:结构体数组案例分析:结构体数组 检索检索 实现实现(cw1304.c) 结构体结构体 #include #define MAX 20 int main() struct StuRe
34、c int num; char name20; char gender; int age; studentMAX; int i, N, num; 黄兴鼎版权所有黄兴鼎版权所有 案例分析:结构体数组案例分析:结构体数组 检索检索 实现实现 结构体结构体 printf(tInput a integer as the number of students:); scanf(%d, printf(tInput %d students information:n,N); printf(ntNo.tNametGendertAgen); for (i=0;iN;i+) printf(student %d:n
35、t, i+1); scanf(%d %s %c %d, (cw1304.c)续)续 黄兴鼎版权所有黄兴鼎版权所有 案例分析:结构体数组案例分析:结构体数组 检索检索 实现实现 结构体结构体 printf(ntInput a number:); scanf(%d, printf(ntPlease wait. Searching.n); for (i=0;iN;i+) if (num=studenti.num) break; if (iN) printf(ntNo.:%dntName:%sntGender:%cntAge:%dn, studenti.num, , stud
36、enti.gender, studenti.age); else printf(ntNot found!n); 输入查找条件输入查找条件 查找查找 (cw1304.c)续)续 黄兴鼎版权所有黄兴鼎版权所有 案例分析:结构体数组案例分析:结构体数组 检索检索 问题:问题: 可以多次查找。可以多次查找。 结构体结构体 输入学生信息输入学生信息 输入查询条件输入查询条件 查找学生信息,报告结果查找学生信息,报告结果 是否继续查询是否继续查询 Y N 人机交互人机交互 黄兴鼎版权所有黄兴鼎版权所有 案例分析:结构体数组案例分析:结构体数组 检索检索 实现实现(cw1304m.c) 部分代码部分代码 结
37、构体结构体 do scanf(%d, for (i=0;iN;i+) if (num=studenti.num) break; if (iN) /* Found! */ else printf(ntNot found!n); printf(ntContinue?(y/n); c=getchar(); while (c=y|c=Y); 1001y (cw1304.c)续)续 黄兴鼎版权所有黄兴鼎版权所有 小结:知识要点小结:知识要点 结构体是由若干个不同类型数据项构成的集合。结构体是由若干个不同类型数据项构成的集合。 结构体类型的定义:结构体类型的定义: 1. 结构体类型定义的一般形式结构体类型
38、定义的一般形式 2. 结构体类型定义中的注意事项结构体类型定义中的注意事项 结构体类型变量:结构体类型变量: 结构体数组:结构体数组: 1. 结构体数组定义的三种方法结构体数组定义的三种方法 2. 结构体数组的初始化结构体数组的初始化 3. 对结构体数组元素的成员进行引用对结构体数组元素的成员进行引用 1. 结构体类型变量定义的三种方法结构体类型变量定义的三种方法 2. 结构体类型变量的初始化结构体类型变量的初始化 3. 对结构体变量中成员的引用对结构体变量中成员的引用 4. 对整个结构体变量的引用对整个结构体变量的引用 黄兴鼎版权所有黄兴鼎版权所有 在函数中使用结构体在函数中使用结构体 向函
39、数传递结构体的单个成员向函数传递结构体的单个成员 单向值传递,函数内对结构内容的修改不影响原结构。单向值传递,函数内对结构内容的修改不影响原结构。 向函数传递结构体的完整结构(值传递)向函数传递结构体的完整结构(值传递) 把数组作为结构体的成员,然后把结构体传递给函数。把数组作为结构体的成员,然后把结构体传递给函数。 被调用函数不能修改调用函数中的数组。被调用函数不能修改调用函数中的数组。 单向值传递,函数内对结构内容的修改不影响原结构,开销大单向值传递,函数内对结构内容的修改不影响原结构,开销大 向函数传递结构体的首地址向函数传递结构体的首地址 用结构体数组或者结构体指针做函数参数。用结构体
40、数组或者结构体指针做函数参数。 除提高效率外,还可以修改结构体指针所指向的结构体的内容。除提高效率外,还可以修改结构体指针所指向的结构体的内容。 结构体结构体 把整个结构体作为单个数据返回把整个结构体作为单个数据返回 因为结构体变量之间可以赋值。因为结构体变量之间可以赋值。 黄兴鼎版权所有黄兴鼎版权所有 #include /预处理调用输入输出头文件预处理调用输入输出头文件 #include / #define N 10/定义符号常量定义符号常量 struct stu/定义结构体定义结构体 long int sno;/学号长整型学号长整型 int score4;/成绩浮点数一维数组三元素成绩浮点
41、数一维数组三元素 studN;/定义结构体数组定义结构体数组 void sort(struct stu arr)/定义结构体数组成绩排序定义结构体数组成绩排序 int i,j; /定义循环变量定义循环变量 struct stu temp; /定义结构体临时变量定义结构体临时变量 for(i=0;iN;i+) /外循环外循环 for(j=i+1;jN;j+) /内循环内循环 if(arri.score3arrj.score3) /比较前后两行比较前后两行 temp=arri;arri=arrj;arrj=temp;/排序交换排序交换 输入一个班输入一个班10个学生的学号和每个学生考试三门功课(数
42、学、英语、计算机基础)个学生的学号和每个学生考试三门功课(数学、英语、计算机基础) 的成绩。编程计算出每个学生的总分和平均分,并按学生成绩优劣排序,最后打的成绩。编程计算出每个学生的总分和平均分,并按学生成绩优劣排序,最后打 印一张按高分到低分名次排序的成绩单。印一张按高分到低分名次排序的成绩单。Cw1309.c要求:要求: 1)排序用一个函数实现。排序用一个函数实现。 2)打印的成绩单表项包括:序号,学号、数学、英语、计算机、总分、平均分。打印的成绩单表项包括:序号,学号、数学、英语、计算机、总分、平均分。 黄兴鼎版权所有黄兴鼎版权所有 int main()/主函数主函数 int i; pr
43、intf(请输入学号和数学、英语、计算机的成绩请输入学号和数学、英语、计算机的成绩n); for(i=0;iN;i+)/输入数据输入数据 printf(NO:%d,i+1); scanf(%ld%d%d%d, studi.score3=studi.score0+studi.score1+studi.score2; sort(stud);/调用排序函数,调用排序函数,向函数传递结构体的首地址向函数传递结构体的首地址 printf(名次名次t学号学号t数学数学t英语英语t计算机计算机t总分总分t平均分平均分n); /输出题头输出题头 for(i=0;iN;i+)/顺序输出整行顺序输出整行 prin
44、tf(%dt%ld%t%dt%dt%dt%dt%.1fn,i+1,studi.sno,studi.scor e0,studi.score1,studi.score2,studi.score3,(float)studi.score 3/3); 这是用结构体做实验报告这是用结构体做实验报告,思路方法同数组是一致的思路方法同数组是一致的. 黄兴鼎版权所有黄兴鼎版权所有 动态数据结构动态数据结构 Dynamic data structures(动态数据结构)(动态数据结构) 在程序的执行过程中可以增长和缩短的数据结构。在程序的执行过程中可以增长和缩短的数据结构。 Linked lists(链表)(链表
45、) 在任何地方进行插入和删除。在任何地方进行插入和删除。 Stacks(栈)(栈) 在栈的顶端进行插入和删除。在栈的顶端进行插入和删除。 Queues(队列)(队列) 在队列的末尾删除,在队列的前面插入。在队列的末尾删除,在队列的前面插入。 高级数据结构高级数据结构 黄兴鼎版权所有黄兴鼎版权所有 自引用的结构体自引用的结构体 自引用的结构体自引用的结构体 包含指向相同结构类型的指针成员包含指向相同结构类型的指针成员 可以链接到一起,构成有用的数据结构:可以链接到一起,构成有用的数据结构: 链表链表 栈栈 队列队列 树树 高级数据结构高级数据结构 struct node int data; st
46、ruct node *nextPtr; ; 2042 数据成员数据成员 指针指针 结点(结点(node) 空指针空指针 链链头指针头指针 黄兴鼎版权所有黄兴鼎版权所有 动态内存分配动态内存分配 处理动态链表,进行动态内存分配首先需要相关函数处理动态链表,进行动态内存分配首先需要相关函数 库函数提供动态地开辟和释放存储单元的有关函数:库函数提供动态地开辟和释放存储单元的有关函数: 在程序执行期间获取或释放内存在程序执行期间获取或释放内存 相关的函数相关的函数(stdlib.h) malloc(size_t size) /在内存动态存储区中请求分配在内存动态存储区中请求分配size的连续空间返回地
47、址的连续空间返回地址 Calloc(unsigned ,unsignedsize)/在内存的动态存储区中分配个长度为在内存的动态存储区中分配个长度为 size的连续空间的连续空间,返回指向首地址返回指向首地址. free(void* aPtr) /释放指定的内存空间释放指定的内存空间 高级数据结构高级数据结构 n 所谓建立动态链表是指在程序执行过程中从无到有地建 立起一个链表,即一个一个地开辟结点和输入各结点数 据,并建立起前后相链的关系。 黄兴鼎版权所有黄兴鼎版权所有 栈栈 一、定义一、定义 栈栈(Stack)(Stack)是一种特殊的线性表是一种特殊的线性表,其其插入和删除插入和删除操作均
48、操作均 在在表的一端表的一端进行,是一种进行,是一种运算受限运算受限的线性表。的线性表。 栈顶栈顶(top)(top)允许插入和删除的一端允许插入和删除的一端。 栈底栈底(bottom)(bottom)栈的另一端栈的另一端。 二、栈的特点二、栈的特点 栈的修改是按后进先出的原则进行的。栈的修改是按后进先出的原则进行的。 因此,栈又称为因此,栈又称为后进先出后进先出(Last In (Last In First Out)First Out)的线性表的线性表,简称,简称LIFOLIFO结构。结构。 假设栈假设栈S= ai | ai ElemSet, i=1,2,.,n, n0 , 则称则称a1为栈
49、底元素,为栈底元素,an为栈顶元素,栈中元素按为栈顶元素,栈中元素按 a1,a2,an的次序进栈,退栈的第一个元素应为栈的次序进栈,退栈的第一个元素应为栈 顶元素。顶元素。 黄兴鼎版权所有黄兴鼎版权所有 三、栈的抽象数据型基本操作:三、栈的抽象数据型基本操作: (1)MAKENULL(S)/(1)MAKENULL(S)/SETNULL(S);SETNULL(S); (2)EMPTY(S); (2)EMPTY(S); (3)PUSH(x,S); (3)PUSH(x,S); (4)POP(S); (4)POP(S); (5)TOP(S); (5)TOP(S); 另外还有:另外还有: (6)STAC
50、KLENGTH(S);(6)STACKLENGTH(S); (7)DISPLAY(S) (7)DISPLAY(S)。 栈栈 # 四、栈的顺序存储的概念四、栈的顺序存储的概念( (栈的数组实现栈的数组实现) ) 栈的顺序存储是利用一块连续的存储单元依次存放栈中栈的顺序存储是利用一块连续的存储单元依次存放栈中 的数据元素,并附一个指针的数据元素,并附一个指针toptop指示当前指示当前栈顶栈顶。 采用顺序存储方式存储的栈称为采用顺序存储方式存储的栈称为顺序栈。顺序栈。 1 栈的数组实现栈的数组实现顺序栈顺序栈 黄兴鼎版权所有黄兴鼎版权所有 仅允许在一端进行插入,另一端进行删除的线性表,称为仅允许在
51、一端进行插入,另一端进行删除的线性表,称为 队列队列(queue)(queue)。允许插入的一端称为队尾。允许插入的一端称为队尾(rear)(rear),允许删除,允许删除 的一端称为队头(的一端称为队头(frontfront)。)。 队列是一种先进先出(队列是一种先进先出(First In First OutFirst In First Out)的特殊线性)的特殊线性 表,或称表,或称FIFOFIFO表。表。 若队列中没有任何元素,则称为空队列,否则称为非空队若队列中没有任何元素,则称为空队列,否则称为非空队 列。列。 2 2、队列的定义、队列的定义类似于日常生活的排队类似于日常生活的排队
52、队列的描述可以用如图的方式所描述队列的描述可以用如图的方式所描述。 a 1 a2 . an 入队 队头队尾 出队 图-队列示意图 黄兴鼎版权所有黄兴鼎版权所有 1 1定义定义 队列队列(Queue)(Queue)是一种是一种运算受限运算受限的特殊的线性表,它只允许的特殊的线性表,它只允许 在表的在表的一端进行插入一端进行插入,而在表的,而在表的另一端进行删除另一端进行删除。 队尾队尾(rear)(rear)允许插入的一端。允许插入的一端。 队头队头(front)(front)允许删除的一端。允许删除的一端。 设一队列设一队列:q=(a:q=(a1 1,a,a2 2,a,an n) ),a a1
53、 1为队头元素,为队头元素,a an n为队尾元素,为队尾元素, 进入队列的顺序为进入队列的顺序为a a1 1,a,a2 2,a,an n 2 2、队列、队列 2.2.队列的特点队列的特点 先进先出先进先出(First In First Out (First In First Out ,简称,简称FIFOFIFO) )。 又称队列为先进先出表。又称队列为先进先出表。 黄兴鼎版权所有黄兴鼎版权所有 3. 3.队列的抽象数据型的基本操作:队列的抽象数据型的基本操作: (1)MAKENULL(Q)(1)MAKENULL(Q) (2)EMPTY(Q) (2)EMPTY(Q) (3)FRONT(Q) (
54、3)FRONT(Q) (4)ENQUEUE(x,Q) (4)ENQUEUE(x,Q) (5)DEQUEUE(Q) (5)DEQUEUE(Q) (6)QLENGTH(Q) (6)QLENGTH(Q) 2 2、队列、队列 # 黄兴鼎版权所有黄兴鼎版权所有 黄兴鼎版权所有黄兴鼎版权所有 自定义类型自定义类型 typedef 为已经定义的数据类型创建一个别名。为已经定义的数据类型创建一个别名。 举例举例 创建了一个新的类型名创建了一个新的类型名 Date ,它是,它是 struct date 的别名。的别名。 注意:并没有创建新的类型。注意:并没有创建新的类型。 可以简化程序代码,提高程序的可移植性。
55、可以简化程序代码,提高程序的可移植性。 结构体结构体 typedef struct date Date; void show(char *, Date d); void copy(Date s, Date d); typedef int Integer; 黄兴鼎版权所有黄兴鼎版权所有 用用typedeftypedef定义类型定义类型 声明声明INTEGERINTEGER为整型为整型 typedef int INTEGERtypedef int INTEGER 声明结构类型声明结构类型 month month; day day; year year; DATE;DATE; 用用typedef声明
56、新的类型名来代替已有的类型名。声明新的类型名来代替已有的类型名。 声明为整型数组类型声明为整型数组类型 : ; 声明为字符指针类型:声明为字符指针类型: typedef char typedef char * *STRINGSTRING; 声明声明POINTERPOINTER为指向函数的指针类型,该函数返回为指向函数的指针类型,该函数返回 整型值整型值 : typedef int (typedef int (* *POINTER)()POINTER)() 黄兴鼎版权所有黄兴鼎版权所有 用用typedeftypedef定义类型定义类型 用typedef定义类型的方法: 先按定义变量的方法写出定义
57、体(如:int i)。 将变量名换成新类型名(例如:将i换成COUNT)。 在最前面加 (例如:typedef int COUNT)。 然后可以用新类型名去定义变量。 用typedef定义类型的方法(举例): 先按定义数组变量形式书写:int n100; 将变量名换成自己指定的类型名: intNUM0; 在前面加上typedef,得到 typedef int NUM; 用来定义变量:NUM; 黄兴鼎版权所有黄兴鼎版权所有 用用typedeftypedef定义类型定义类型 (1)用typedef可以声明各种类型名,但不能用来定义变量。 (2) 用typedef只是对已经存在的类型增加一个类型名,
58、而没有创造 新的类型。 (3) 当不同源文件中用到同一类型数据时,常用typedef声明一些数 据类型,把它们单独放在一个文件中,然后在需要用到它们的文 件中用#include命令把它们包含进来。 (4) 使用typedef有利于程序的通用与移植。 (5) typedef与#define有相似之处,例如: typedef int COUNT;#define COUNT int的作用都是用COUNT代 表int。但事实上,它们二者是不同的。 #define是在预编译时处理的,它只能作简单的字符串替换,而 typedef是在编译时处理的。实际上它并不是作简单的字符串替 换,而是采用如同定义变量的方
59、法那样来声明一个类型。 说明:说明: 黄兴鼎版权所有黄兴鼎版权所有 0; 黄兴鼎版权所有黄兴鼎版权所有 本章到此结束,谢谢您的光临!本章到此结束,谢谢您的光临! THANK YOU VERY THANK YOU VERY MUCH MUCH ! 黄兴鼎版权所有黄兴鼎版权所有 案例分析:结构体数组案例分析:结构体数组 高性能的洗牌和发牌程序高性能的洗牌和发牌程序 数据结构数据结构 用一个纸牌结构体数组保存一副牌。用一个纸牌结构体数组保存一副牌。 纸牌的花色和号码名依然保存在字符串数组中。纸牌的花色和号码名依然保存在字符串数组中。 这样,数组中的纸牌俨然已有一个顺序了,则可以改进算这样,数组中的纸
60、牌俨然已有一个顺序了,则可以改进算 法。法。 洗牌:随机打乱纸牌在数组中的位置。洗牌:随机打乱纸牌在数组中的位置。 不存在无限延期。不存在无限延期。 发牌:按纸牌在数组中的顺序显示输出。发牌:按纸牌在数组中的顺序显示输出。 数组遍历一次。数组遍历一次。 结构体结构体 黄兴鼎版权所有黄兴鼎版权所有 案例分析:结构体数组案例分析:结构体数组 高性能的洗牌和发牌程序高性能的洗牌和发牌程序 实现实现(cw1304a.c) 结构体结构体 #include #include #include struct card char *face; char *suit; ; typedef struct card
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 英语月考反思总结
- 英语课外阅读文章
- 企业型员工融入课件
- 餐饮业食品安全管理体系合同范本
- 金融服务产业园区厂房物业管理与金融创新合作合同
- 企业总部保安派遣及管理合同
- 电子商务代理业务合作合同范本
- 婚礼宣誓方案集
- 按揭车辆债权转让与债务承担协议
- 地下停车厂招商方案
- 师德师风建设领导小组职责及活动安排
- 2025深圳辅警考试真题
- 安全操作规程的基本内容
- 热处理验收记录表
- 智慧型陆基式渔业产业园项目可行性研究报告模板-备案拿地
- 塔河县丰收节活动方案
- 广告安装培训课件
- 办公区保洁方案(3篇)
- 【数学 北京版】2025年高考招生统一考试高考真题数学试卷(真题+答案)
- 制药公司实验室管理制度
- 诊所中药饮片清单
评论
0/150
提交评论