第10章结构体new_第1页
第10章结构体new_第2页
第10章结构体new_第3页
第10章结构体new_第4页
第10章结构体new_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

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

文档简介

1、第10章 结构体本章内容结构体类型的定义结构体变量的定义结构体数组结构体与指针链表的概念及操作2引例输入10位同学的一组信息,包括学号、姓名、性别、数学成绩、计算机成绩,求得每位同学的平均分和总分,然后按照总分从高到低排序。3结构体类型与变量的概念 结构体类型把关系紧密且逻辑相关的多种不同类型的数据组织到统一的名字之下,这样的集合称为结构体类型。结构体变量结构体类型的变量占用相邻的一段内存单元45一般形式:一般形式:struct 结构体类型名结构体类型名 类型关键字类型关键字 成员名成员名1 1; 类型关键字类型关键字 成员名成员名2 2; . 类型关键字类型关键字 成员名成员名n n; ;,

2、元素元素域域6_先定义结构体类型再定义变量名先定义结构体类型再定义变量名_在定义类型的同时定义变量在定义类型的同时定义变量_直接定义结构体变量(不出现结构体类型名)直接定义结构体变量(不出现结构体类型名)struct student student1,student2;student 用户自定义类型名关键字关键字typedef 概念:关键字typedef用来为已经定义的数据类型定义一个别名。举例: typedef struct student STUD; STUD student1,student2; STUD与 struct student类型是同义词7结构体变量的内存占用按照域表中域的先后

3、顺序依次在内存中划分存储单元给每个域。直接用结构体的每个成员类型所占内存字节数的和作为一个结构体实际所占的内存字节数是不正确的。事实事实上,所有数据类型在内存中都是从偶数地址开始存放的,且结构上,所有数据类型在内存中都是从偶数地址开始存放的,且结构所占的实际空间一般是按照机器字长对齐的所占的实际空间一般是按照机器字长对齐的 .不同的编译器、平台,对齐方式会有变化不同的编译器、平台,对齐方式会有变化我们用sizeof函数获得结构体变量所占的字节数。 即用即用 sizeof(struct student) 进行计算进行计算8结构体变量的引用结构体变量的引用 一般形式:一般形式: 结构体变量名结构体

4、变量名 . 成成员名员名 结构体变量的初始化结构体变量的初始化 举例:举例:struct student st1= 101,zhangsan,M,85,69; struct student int num; char name20; char sex; float shx; float jsj; float aver; float sum;9举例:以下结构体变量的引用哪个是正确的?struct s int x; int y; vs ;A) s . x = 10 ; B) s . vs . x = 10;C) struct va; D) struct s va = 10; va . x = 10

5、;10结构体变量的输入与输出结构体变量的输入与输出C语言规定,不能将一个结构体变量作为一语言规定,不能将一个结构体变量作为一个整体实施输入、输出的操作,只能对每个整体实施输入、输出的操作,只能对每个具体的成员进行输入、输出操作。个具体的成员进行输入、输出操作。举例:struct student st1= 101,zhangsan,M,85,69;11结构体类型的嵌套结构体类型的嵌套如: struct date int month; int day; int year; ;struct stud char name20; int num; char sex; struct date birthd

6、ay; float shx; float jsj; float aver; float sum;12结构体类型中的成员也可以是结构体。结构体类型中的成员也可以是结构体。举例struct workersint no; char name20; char sex; struct int day; int month; int year; birth; w;若w中的生日为1963年10月25日,如何编写相应的语句?13w.birth.day=25;w.birth.month=10;w.birth.year=1963;结构体数组结构体数组概念:由若干相同结构体类型的数据组成的概念:由若干相同结构体类型

7、的数据组成的有序集合,叫做结构体数组。有序集合,叫做结构体数组。定义形式:同基本数据类型的数组定义方法定义形式:同基本数据类型的数组定义方法 struct 结构体类型名结构体类型名 结构体数组名结构体数组名元素元素个数个数;14举例struct person char name9; int age; ;struct person class10= John,19,Paul,17,Mary,18,Adam,16;能打印出字母A的语句应为:15Printf(“%c”,0);举例引例:引例:输入输入10位同学的一组信息,包位同学的一组信息,包括学号、姓名、数学成绩、计括学号、姓

8、名、数学成绩、计算机成绩,求得每位同学的平算机成绩,求得每位同学的平均分和总分,然后按照总分从均分和总分,然后按照总分从高到低排序。高到低排序。 zhang, 001, 95.0, 64.0 wang, 002, 92.0, 97.0 zhao, 003, 85.0, 78.0 li, 004, 96.0, 88.0 zhou, 005, 91.0, 96.0 wu, 006, 93.0, 78.0 lin, 007, 98.0, 97.0 ma, 008, 89.0, 93.0 zhen, 009, 88.0, 90.0 yu, 010, 94.0, 90.016#include void

9、main()struct student char name10; int num; float shx; float jsj; float aver; float sum;stu4=zhang,001,95.0,64.0,wang,002,92.0,97.0,zhao,003,85.0,78.0,li,004,96.0,88.0,student1;int i,j;for(i=0;i4;i+) stui.sum=stui.shx+stui.jsj; stui.aver=stui.sum/2;17for(i=0;i3;i+) for(j=i+1;j4;j+) if(stui.sumstuj.su

10、m) student1=stui; stui=stuj; stuj=student1; printf(sort afer:n); for(i=0;ix = 0; /*指向运算符指向运算符*/第二种更常用第二种更常用20 xypptpt思考题struct pointint x;int y;struct rectstruct point pt1;struct point pt2;struct rect rt;struct rect *rp = &rt;下面表达式哪些合法?下面表达式哪些合法?rt.pt1.x(*rp).pt1.xrp-pt1.xrt-pt1.x上面合法的表达式都是等价上面合

11、法的表达式都是等价的吗?的吗?21结构体数组的指针结构体数组的指针struct STUDENT stu4;struct STUDENT *pt;pt = stu;222341stu0stu1stu2ptpt+stu3举例#include stdio.hstruct st int x; int y; ;void main()struct st s2=24,8,4,2, *p=s; printf(%d,+p-x); /* (+p) -x */23输出结果为:25(4)下面程序的运行结果是下面程序的运行结果是_. main() struct cmplx int x; int y; cnum2=1,3

12、,2,7; printf(%dn,cnum0.y/cnum0.x*cnum1.x); a)0 b)1 c)3 d)624#include stdio.hstruct stint x; int *y;void main( )int dt4=10,20,30,40; struct st a4=50,&dt0,60,&dt1,70,&dt2,80,&dt3; struct st *p=a; printf(%dn,+p-x ); printf(%dn,(+p)-x ); printf(%dn,+(*p-y) );25输出结果是:516021struct类型的特点类型的特

13、点一个普通的类型一个普通的类型可以定义该类型的变量、数组、指针可以定义该类型的变量、数组、指针可以做函数的参数类型和返回值类型可以做函数的参数类型和返回值类型它的成员可以是任意类型它的成员可以是任意类型基本类型、数组、指针、结构体基本类型、数组、指针、结构体struct类型的变量类型的变量两个同类型结构体变量之间可以相互赋值两个同类型结构体变量之间可以相互赋值可以取地址可以取地址&不能直接参与算术和比较运算不能直接参与算术和比较运算26动态数据结构动态数据结构 链表链表结构体类型声明时不能包含自我,但可以包结构体类型声明时不能包含自我,但可以包含指向本结构体类型的指针变量含指向本结构体

14、类型的指针变量链表链表struct Link int data; struct Link *next;27datanextheaddatanextdatanextdataNULL图10-1 链表原理图基本概念基本概念链表链表-是一种常见的重要的数据结构。它是是一种常见的重要的数据结构。它是动态进行存储分配的一种结构。它可以根据动态进行存储分配的一种结构。它可以根据需要开辟或删除存储单元。需要开辟或删除存储单元。 链表分为链表分为单向链表单向链表和双向链表。和双向链表。 头指针头指针-链表有一个链表有一个头指针头指针变量,通常以变量,通常以head表示,它存放链表中的第表示,它存放链表中的第1个

15、元素的地个元素的地 址。址。28datanextheaddatanextdatanextdataNULL图10-1 链表原理图基本概念基本概念 节点节点-链表中的元素称为节点。链表中的元素称为节点。 每个节点都包含两部分:数据域和指针域。每个节点都包含两部分:数据域和指针域。 根据节点在链表中的位置,又可分为链表的起始节根据节点在链表中的位置,又可分为链表的起始节点、中间节点以及结束节点。点、中间节点以及结束节点。链表的结束节点的指针域为空指针链表的结束节点的指针域为空指针NULL 29datanextheaddatanextdatanextdataNULL图10-1 链表原理图举例#incl

16、ude stdio.hstruct stint x; struct st *next;void main( )struct st aa3=5,&aa1,7,&aa2,9,NULL; struct st *p; p=&aa0; printf(%d,+p-x );30两个常用函数malloc( ) 函数动态申请内存如:struct temp int data; struct temp *next; ; struct temp *p; p=(struct temp *)malloc(sizeof(struct temp);free( )函数释放内存如: free(p);使用这

17、两个函数时要包含头文件 stdlib.h31单链表的基本操作链表的建立链表的删除链表的插入3233共用体共用体 联合体又称为共用体,意为各种不同数据共用同一联合体又称为共用体,意为各种不同数据共用同一段存储空间。段存储空间。 与结构体类似,为了定义共用体类型变量,首先要与结构体类似,为了定义共用体类型变量,首先要定义共用体类型,说明该共用体类型中包括哪些成员,定义共用体类型,说明该共用体类型中包括哪些成员,它们各属于何数据类型,然后再定义该类型的变量。它们各属于何数据类型,然后再定义该类型的变量。34 定义共用体数据类型的一般形式为定义共用体数据类型的一般形式为union 共用体名共用体名 成

18、员表成员表 ;例如,例如,union w int k; double d; char c; ;定义了一个共用体类型定义了一个共用体类型w,包括代表整型量的成员,包括代表整型量的成员k、代表、代表双精度型量的成员双精度型量的成员d和代表字符型量的成员和代表字符型量的成员c。 k,d,c三个变三个变量的首地址相同,相当于共用了一段连续的内存单元,长量的首地址相同,相当于共用了一段连续的内存单元,长度为度为8.kdc2000共用体变量的引用与赋值共用体变量的引用与赋值引用的一般形式:引用的一般形式: 共用体变量名共用体变量名.成员名成员名赋值:赋值: 仅在程序中进行,不能初始化,每次只能赋予仅在程序

19、中进行,不能初始化,每次只能赋予一个成员值。一个成员值。3536几点说明:几点说明: (1)由于一个共用体变量中的各成员共用一段存储空)由于一个共用体变量中的各成员共用一段存储空间,因此,在任一时刻,只能有一种类型的数据存放在该间,因此,在任一时刻,只能有一种类型的数据存放在该变量中,即在任一时刻,只有一个成员的数据有意义,其变量中,即在任一时刻,只有一个成员的数据有意义,其他成员的数据是没有意义的。他成员的数据是没有意义的。 (2)在引用共用体变量中的成员时,必须保证数据的)在引用共用体变量中的成员时,必须保证数据的一致。一致。 (3)在定义共用体变量时不能为其初始化,并且,共)在定义共用体变量时不能为其初始化,并且,共用体变量不能作为函数参数。用体变量不能作为函数参数。 (4)共用体类型与结构体类型可以互相嵌套,即共用)共用体类型与结构体类型可以互相嵌套,即共用体类型可以作为结构体类型的成员,结构体类型也可以作体类型可以作为结构体类型的成员,结构体类型也可以作为共用体类型的成员。为共用体类型的成员。37枚举类型枚举类型枚举类型枚举类型 (1)先定义枚举类型,然后定义该枚举)先定义枚举类型,然后定义该枚举类型的变量

温馨提示

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

评论

0/150

提交评论