版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第9章 用户自己建立数据类型,9.1 定义和使用结构体变量 9.2 使用结构体数组 9.3 结构体指针 9.4 用指针处理链表 9.5 共用体类型 9.6 使用枚举类型 9.7 用typedef声明新类型名,9.1 定义和使用结构体变量,9.1.1 自己建立结构体类型 9.1.2 定义结构体类型变量 9.1.3 结构体变量的初始化和引用,9.1.1 自己建立结构体类型,用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体 例如,一个学生的学号、姓名、性别、年龄、成绩、家庭地址等项,是属于同一个学生的,因此组成一个组合数据,可以定义一个学生结构体类型。,9.1.1 自己建立结构体类型,
2、struct Student int num; char name20; char sex; int age; float score; char addr30; ;,由程序设计者指定了一个结构体类型struct Student 它包括num,name,sex,age,score,addr等不同类型的成员,9.1.1 自己建立结构体类型,声明一个结构体类型的一般形式为: struct 结构体名 成员表列 ;,类型名 成员名;,9.1.1 自己建立结构体类型,说明: (1)结构体类型并非只有一种,而是可以设计出许多种结构体类型,例如 struct Teacher struct Worker st
3、ruct Date等结构体类型 各自包含不同的成员,9.1.1 自己建立结构体类型,(2) 成员可以属于另一个结构体类型。 struct Date int month; int day; int year; ; struct Stu int num;char name20; char sex;int age; struct Date birthday; char addr30; ;,9.1.2 定义结构体类型变量,前面只是建立了一个结构体类型,它相当于一个模型,并没有定义变量,其中并无具体数据,系统对之也不分配存储单元。 为了能在程序中使用结构体类型的数据,应当定义结构体类型的变量,并在其中存
4、放具体的数据。,9.1.2 定义结构体类型变量,1. 先声明结构体类型,再定义该类型变量 声明结构体类型struct Student,可以用它来定义变量 struct Student student1,student2;,结构体类型名,结构体变量名,struct Student int num; char name20; char sex; int age; float score; char addr30; ;,9.1.2 定义结构体类型变量,2.在声明类型的同时定义变量 struct Student int num; char name20; char sex; int age; floa
5、t score; char addr30; student1,student2;,9.1.2 定义结构体类型变量,3. 不指定类型名而直接定义结构体类型变量 其一般形式为: struct 成员表列 变量名表列; 指定了一个无名的结构体类型 。,9.1.2 定义结构体类型变量,(1) 结构体类型与结构体变量是不同的概念,不要混同。只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算。在编译时,对类型是不分配空间的,只对变量分配空间。,9.1.2 定义结构体类型变量,(2) 结构体类型中的成员名可以与程序中的变量名相同,但二者不代表同一对象。 (3) 对结构体变量中的成员(即“域”),可以
6、单独使用,它的作用与地位相当于普通变量。 在程序中使用结构体中成员的方法为: 结构体变量名 . 成员名称,例:要用结构体描述一个人的基本情况,可以定义如下结构体: struct person /* 定义person结构体类型 */ char name30; char sex; struct date birthday; /* 结构体的嵌套定义 */ man; 如果要在变量man中存入一个1960年3月28日出生的zhang先生,可以采用如下赋值语句: strcpy(, “zhang”); /*不能写成 =zhang; */ man.sex = M; /* 为结构
7、体中的字符成员赋值 */ man.birthday.year = 1960; man.birthday.month = 3; man.birthday.day = 28; /*嵌套定义的结构体中的成员赋值*/,例9.1 把一个学生的信息(包括学号、姓名、性别、住址)放在一个结构体变量中,然后输出这个学生的信息。 解题思路: 自己建立一个结构体类型,包括有关学生信息的各成员 用它定义结构体变量,同时赋以初值 输出该结构体变量的各成员,9.1.3 结构体变量的初始化和引用,#include int main() struct Student long int num; char name20; c
8、har sex; char addr20; a=10101,“Li Lin”,M, “123 Beijing Road”; printf(NO.:%ldnname:%sn sex:%cnaddress:%sn, a.num,,a.sex,a.addr); return 0; ,#include int main() struct Student long int num; char name20; char sex; char addr20; a=10101,“Li Lin”,M, “123 Beijing Road”; printf(NO.:%ldnname:%sn sex:%c
9、naddress:%sn, a.num,,a.sex,a.addr); return 0; ,9.2 使用结构体数组,9.2.1定义结构体数组 9.2.2 结构体数组的应用举例,定义结构体数组一般形式是 struct 结构体名 成员表列 数组名数组长度; 先声明一个结构体类型,然后再用此类型定义结构体数组: 结构体类型 数组名数组长度; 如: struct Person leader3;,9.2.1定义结构体数组,struct student char num10; /学号 char name20; /姓名 float maths; /数学成绩 float C; /程序设计成绩 f
10、loat sum; /总分 stud100; for(i=0;i100;i+) scanf(“%s%s%f%f”,studi.num, , ,例如:struct stu int num; char name10; char sex; float score; student5= 101,Li ping,M,45, 102,Zhang ping,M,62.5, 103,He fang,F,92.5, 104,Cheng ling,F,87, 105,Wang ming,M,58; ,对结构数组可以作初始化赋值。,9.2.2 结构体数组的应用举例,例9.4 有n个学生的信息(包
11、括学号、姓名、成绩),要求按照成绩的高低顺序输出各学生的信息。 解题思路:用结构体数组存放n个学生信息,采用选择法对各元素进行排序(进行比较的是各元素中的成绩)。,#include struct Student int num; char name20; float score; ; int main() struct Student stu5=10101,Zhang,78 , 10103,Wang,98.5, 10106,Li, 86 , 10108,“Ling”, 73.5, 10110,“Fun”, 100 ; struct Student temp; const int n = 5 ;
12、 int i,j,k;,常变量,若人数变为30,30,#include struct Student int num; char name20; float score; ; int main() struct Student stu5=10101,Zhang,78 , 10103,Wang,98.5, 10106,Li, 86 , 10108,“Ling”, 73.5, 10110,“Fun”, 100 ; struct Student temp; const int n = 5 ; int i,j,k;,#define N 5,注意temp的类型,printf(The order is:n
13、); for(i=0;istuk.score) k=j; temp=stuk; stuk=stui; stui=temp; for(i=0;in;i+) printf(%6d %8s %6.2fn, stui.num,,stui.score); printf(n); return 0; ,写法上与普通变量一致,9.3 结构体指针,9.3.1 指向结构体变量的指针 9.3.2 指向结构体数组的指针 9.3.3 用结构体变量和结构体变量的指针作函数参数,9.3.1 指向结构体变量的指针,指向结构体对象的指针变量既可以指向结构体变量,也可以用来指向结构体数组中的元素。 指针变量的基
14、类型必须与结构体变量的类型相同。例如: struct Student *pt;,结构体指针说明的一般形式 struct 结构体类型名称 * 结构体指针变量名; 例如: struct date * pdate, today; 说明了两个变量,一个是指向结构体 date 的结构体指针pdate,today是一个 date 结构体变量。 执行语句:pdate = ,这样,today.year即(*pdate).year today.month 即(*pdate).month today.day 即(*pdate).day,通过指针访问结构体中的成员 采用运算符“-”进行操作。 即:结构体指针-成员名
15、 “-”运算符优先级是最高的(1级),从左至右结合 通过结构体指针pdate访问成员year的操作就可以写成: pdate-year = 1963; 等价于:today.year = 1963; (* pdate).year = 1963;,9.3.2 指向结构体数组的指针,例9.6 有3个学生的信息,放在结构体数组中,要求输出全部学生的信息。,解题思路:用指向结构体变量的指针处理 (1)声明struct Student,并定义结构体数组、初始化 (2)定义指向struct Student类型指针p (3)使p指向数组首元素,输出元素中各信息 (4)使p指向下一个元素,输出元素中各信息 (5)
16、再使p指向结构体数组的下一个元素,输出它指向的元素中的有关信息,#include struct Student int num; char name20; char sex; int age; ; struct Student stu3= 10101,Li Lin,M,18, 10102,Zhang Fun,M,19, 10104,Wang Min,F,20 ;,int main() struct Student *p; printf( No. Name sex agen); for(p=stu;pnum, p-name, p-sex, p-age); return 0; ,stu0,stu1
17、,stu2,int main() struct Student *p; printf( No. Name sex agen); for(p=stu;pnum, p-name, p-sex, p-age); return 0; ,p,stu0,stu1,stu2,int main() struct Student *p; printf( No. Name sex agen); for(p=stu;pnum, p-name, p-sex, p-age); return 0; ,p,stu0,stu1,stu2,int main() struct Student *p; printf( No. Na
18、me sex agen); for(p=stu;pnum, p-name, p-sex, p-age); return 0; ,p,stu0,stu1,stu2,9.4 用指针处理链表,9.4.1 什么是链表 9.4.2 建立简单的静态链表 9.4.3 建立动态链表 9.4.4 输出链表,9.4.1 什么是链表,链表是一种常见的重要的数据结构 它是动态地进行存储分配的一种结构,head,1249,1249,A,1356,1356,1475,B,1475,C,1021,1021,D,0,头指针,各结点地址不连续,各结点含有两个部分,表尾,9.4.1 什么是链表,链表是一种常见的重要的数据结构 它
19、是动态地进行存储分配的一种结构 链表必须利用指针变量才能实现,struct Student int num; float score; struct Student *next; a,b,c;,a结点,b结点,c结点,a.next=,b.next=,num,score,next,9.4.2 建立简单的静态链表,例9.8 建立一个如图所示的简单链表,它由3个学生数据的结点组成,要求输出各结点中的数据。,a结点,b结点,c结点,num,score,next,9.4.2 建立简单的静态链表,解题思路:,a结点,b结点,c结点,num,score,next,head,head=,a.next=,b.n
20、ext=,NULL,c.next=NULL;,#include struct Student int num; float score; struct Student *next; ;,int main() struct Student a,b,c,*head,*p; a. num=10101; a.score=89.5; b. num=10103; b.score=90; c. num=10107; c.score=85; head= ,9.4.3 建立动态链表,所谓建立动态链表是指在程序执行过程中从无到有地建立起一个链表,即一个一个地开辟结点和输入各结点数据,并建立起前后相链的关系。,动态
21、链表的示意图,对链表的主要操作有以下几种: 1. 建立链表; 2. 结点的查找与输出; 3. 插入一个结点; 4. 删除一个结点;,申请内存函数 (malloc) void * malloc( unsigned size ) 功能:申请长度为size字节的内存区。若申请成功,函数返回所分配的内存区首字节的地址,即指向该内存的指针;若申请失败,函数返回NULL。 说明:函数malloc的返回值为指向void类型的指针。这是通用指针类型,在实际申请内存空间时,要按照实际指针所指对象的类型进行指针类型强制转换。 实例:要申请1个长度为10的整型数组空间,用指针指向数组的首地址,则可使用下列语句动态申
22、请内存空间。 int * p; p = (int *) malloc( 10 * sizeof(int ) );,动态存储分配函数-malloc,释放内存 (free) void free (void * p ) 功能:释放p所指的内存空间。函数无返回值。这里p所指的内存区域必须是用函数malloc申请的内存空间,否则调用时使用其它指针,可能会破坏系统。 例:动态申请10个元素的数组。 #include void main ( ) int *p=(int *)malloc( 10 * sizeof(int) ); printf(“nResult:”); try ( p, 10); free(p
23、); try(int a ,int m ) /*以数组方式使用主函数空间*/ int k; for ( k=0; km; k+ )a k = k*10; for ( k=0; km; k+ )printf (“%d,”, ak); ,动态存储分配函数-free,#define NULL 0 #define LEN sizeof(struct stu) struct stu int num,age; struct stu *next; ; struct stu *creat(int n) struct stu *head,*p1,*p2; int i; for(i=1;inum, ,建立链表的函数,算法的思路: 1、让P1指向新开的结点; 2、p2指向链表中最后一个结点; 3、把p1所指的结点连接在p2所指的结点后面,访问链表中全部数据结点 void print(struct stu * head ) struct stu *p; p = head; /* p指向第一个数据
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 运输合作合同模板
- 棉花采购合同2024年度定制版(含质量、交货期限)
- 四下英语三单元教学课件教学课件教学
- 《醒脑开窍针法》课件
- 《鸡大肠杆菌病》课件
- 20恐龙课件教学课件
- 企业借款合同范本
- 机械设备租赁合同协议书
- 深圳市劳动合同经典版
- 《工地建设》课件
- 床单洗涤与更换制度
- GB/T 23106-2024家用和类似用途毛发护理器具性能测试方法
- 16G362钢筋混凝土结构预埋件(详细书签)图集
- 安装充电桩施工方案
- 2025届甘肃省庆阳市庆城县陇东中学高考考前提分物理仿真卷含解析
- TDACS 001.1-2024 现代奶业评价 奶牛场定级与评价
- 四年级劳动教育《我是小小志愿者》教学设计
- 石油钻采设备采购与供应链管理考核试卷
- 2023八年级语文上册 第三单元 名著导读《红星照耀中国》纪实作品的阅读配套教案 新人教版
- 2024-2030年中国应急柴油发电机行业市场发展趋势与前景展望战略分析报告
- 工业产品质量安全日管控、周排查、月调度工作制度
评论
0/150
提交评论