C语言程序设计课件模块9_第1页
C语言程序设计课件模块9_第2页
C语言程序设计课件模块9_第3页
C语言程序设计课件模块9_第4页
C语言程序设计课件模块9_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

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

文档简介

9.1结构体

1、掌握结构体类型的定义2、掌握结构体类型变量的定义、初始化和应用本节学习目标:9.1.1结构体类型的定义结构体是由不同数据类型的数据组成的集合体,它包含若干个成员。在说明和使用结构体之前必须先定义它,也就是构造它。结构体定义实际上是说明结构体是由哪些成员所组成,以及成员的数据类型。9.1.1结构体类型的定义案例9-1:使用结构体类型描述学生的基本信息,需要包含学号、姓名、性别、年龄和入学成绩。structstudent{charnum[11];char*name;charsex;intage;floatscore;};结构体类型名,其中struct是保留字,student是结构体名结构体由5个成员组成。第一个成员为num,字符数组;第二个成员为name,字符数组;第三个成员为sex,字符变量;第四个成员为age,整型变量;第五个成员为score,实型变量。提示:在大括号后的分号是不可少

知识连接定义一个结构的一般形式为:

struct结构体名

{

结构体成员表;

};9.1.2结构体变量的定义定义结构体类型相当于做了一个模型,但是其中并没有具体数据,系统不对它分配实际的内存单元。为了能在程序中使用结构体类型的数据,就要定义结构体类型的变量,并且在其中存放具体的数据。9.1.2结构体变量的定义案例9-2:使用结构体student定义结构体变量jack和rose。structstudent{charnum[11];char*name;charsex;intage;floatscore;};structstudentjack;structstudentrose;

提示:在这种定义方法中,保留字struct和结构名student必须同时出现。

知识连接1、结构体变量同其他变量一样,也必须先定义,然后才能使用。首先定义结构类型,然后定义结构变量。2、结构变量定义的一般形式如下:

struct结构体名{

结构体成员表;};struct结构体名结构体变量名;9.1.3结构体变量的初始化对结构体变量的初始化,就是在定义该结构体变量的同时,对其成员变量赋初值。结构体变量初始化的一般形式如下:

struct结构体名结构体变量名={初始数据};9.1.3结构体变量的初始化案例9-3:对结构体student类型的结构体变量jack和rose初始化。#include<stdio.h>voidmain(){structstudent{intnum;char*name;charsex;floatscore;};structstudentjack={2010,"jack",'M',765.4};structstudentrose={2012,"rose",'F',876.5};printf("Themessageofstudentjack:\n");printf("Number=%d\nName=%s\n",jack.num,);printf("Sex=%c\nScore=%f\n",jack.sex,jack.score);printf("Themessageofstudentrose:\n");printf("Number=%d\nName=%s\n",rose.num,);printf("Sex=%c\nScore=%f\n",rose.sex,rose.score);}

知识连接1、初始化数据的个数要与成员的个数相同。2、初始化数据的类型要与相应的成员变量的类型一致。9.1.4结构体变量成员的引用结构体变量被定义之后,就可以在程序中使用它。在对结构体进行引用时,不能对一个结构体变量作为一个整体直接进行操作,一般只能对结构体变量中的各个成员进行直接操作。结构体变量成员的引用的两种方式:用结构体成员运算符方式。

结构变量名.成员名

用指针方式。9.1.4结构体变量成员的引用案例9-4:引用结构体student类型的结构体变量jack和jack2的成员。

structstudentjack;structstudentjack2;jack.num=2010;="jack";printf("inputsexandscore:\n");scanf("%c%f",&jack.sex,&jack.score);9.2指向结构体类型数据的指针学习目标1、理解结构体指针变量的定义。2、掌握结构体指针变量的运用。3、了解结构体数组变量的定义和初始化。9.2.1指向结构体变量的指针结构体指针变量即指向结构体变量的指针,它是一个指针变量。结构体指针变量中的值是所指向的结构体变量的首地址。通过结构体指针即可访问该结构体变量,这与数组指针和函数指针的情况是相同的。9.2.1指向结构体变量的指针定义结构体指针变量的一般形式为:struct结构体名*结构体指针变量名

structstudentboy={2010,"jack",'M',607.3};structstudent*ps;ps=&boy;9.2.1指向结构体变量的指针定义结构体指针变量后,就可以用指针变量来引用结构体变量的各个成员。用指针变量引用结构体成员的一般形式为:(*结构体指针变量名).成员名或者:结构体指针变量名->成员名例如:(*ps).num或者:ps->num9.2.1指向结构体变量的指针#include<stdio.h>structstudent{intnum;char*name;charsex;floatscore;};voidmain(){structstudentboy={2010,"jack",'M',607.3};structstudent*ps;ps=&boy;

printf("Number=%d\nName=%s\n",boy.num,);printf("Sex=%c\nScore=%f\n\n",boy.sex,boy.score);printf("Number=%d\nName=%s\n",(*ps).num,(*ps).name);printf("Sex=%c\nScore=%f\n\n",(*ps).sex,(*ps).score);printf("Number=%d\nName=%s\n",ps->num,ps->name);printf("Sex=%c\nScore=%f\n\n",ps->sex,ps->score);}提示:(*ps)两侧的括号不可少,因为成员符“.”的优先级高于“*”。如果去掉括号写作*pstu.num则等效于*(pstu.num),这样,意义就完全不对了。9.2.2指向结构体数组的指针结构体数组是其元素都是具有相同结构体类型的结构体变量。与一般数组一样,结构体数组也是要先定义后使用。structstudentstu[5]={{2010,"jack",'M',523.45},{2012,"tom",'M',634.567},{2013,"rose",'F',492.7891},{2014,"kate",'F',787},{2015,"jim",'M',580.9},};案例9-6:用指针变量输出结构体数组。#include<stdio.h>structstudent{intnum;char*name;charsex;floatscore;};voidmain(){structstudentstu[5]={{2010,"jack",'M',523.45},{2012,"tom",'M',634.567},{2013,"rose",'F',492.7891},{2014,"kate",'F',787},{2015,"jim",'M',580.9},};structstudent*ps;printf("No.\tName\tSex\tScore\t\n");for(ps=stu;ps<stu+5;ps++)printf("%d\t%s\t\%c\t%f\t\n",ps->num,ps->name,ps->sex,ps->score);}在main函数中定义structstudent类型结构体数组stu并对其初始化定义了一个指向structstudent类型结构体的指针变量ps

知识连接1、结构体数组定义的一般格式如下:

struct结构体名结构体数组名[元素个数];2、结构体数组与其他类型的数组一样,可以初始化,初始化的一般格式如下:struct结构体名结构体数组名[]={初始化数据};或者是:struct结构体名{

结构体成员列表;}结构体数组名[]={初始化数据};9.3用指针处理链表学习目标1、理解链表的概念。2、了解使用指针和结构体构成链表的方法。3、掌握单链表的建立、插入、删除等算法9.3用指针处理链表单链表分配一些任意的存储单元来存储线性表中的数据元素,这些存储单元可以分散在内存中的任意位置上,它们在物理上可以是一片连续的存储单元,也可以是不连续的。9.3用指针处理链表单链表为了表示线性表每个数据元素ai与数据元素ai+1的逻辑关系,在存储元素ai的数据信息时,必须使用一个指针指向它的直接后继ai+1。因此单链表的每个结点的存储区分为数据域和指针域两个部分。如图9-1所示。案例9-7程序分析:使用结构体structnode来描述单链表的这种结构。structnode类型,里面包含float型数据域data和指向下一个structnode结点的指针next。structnode/*结构体node*/{ floatdata;/*定义数据域*/ structnode*next;/*定义指针域*/};案例9-7程序分析:程序中自定义的insert函数用后插法为带头结点的单链表插入新的结点,从而建立带头结点的单链表。案例9-7程序分析:程序中自定义的dele函数实现删除链表结点。如图9-3所示删除单链表中一个已存在的结点的过程。案例9-7程序分析:main函数调用malloc函数为链表的头结点动态的申请了一个structnode类型的内存空间。头结点中的data成员用于记录链表的结点数,next指针指向下一个链表结点。调用while语句无限循环的让用户选择插入、删除、打印和退出的操作,若选择退出则终止循环结束程序。9.4共用体学习目标1、掌握共用体类型的定义2、掌握共用体类型的引用9.4.1共用体类型的定义共用体是将不同的数据项放在同一段内存单元的一种构造数据类型。共用体变量定义的一般形式如下:union共用体名{

成员列表};9.4.1共用体类型的定义案例9-8:定义共用体类型people,并且使用该类型声明变量a,计算a所占内存长度。#include<stdio.h>unionpeople{ charname[10]; longsno; charsex; floatscore[4];};main(){ unionpeoplea; printf("Thelengthofais:%d\n",sizeof(a));}案例9-8程序分析:共用体所需的存储空间的大小则取决于共用体内占用空间最大的成员的大小。本案例的共用体people有四个成员,其中第四个成员是一个含有4个元素的浮点型数组,该数组每个元素占用4个字节,大小为4×4=16字节,是共用体people占用空间最大的成员,所以共用体people所需的存储空间为16字节,它所定义的变量的大小也就是16字节。

9.4.2共用体类型的引用对共用体变量引用的方式与结构体变量的引用方式类似。但共用体变量不能直接引用,只能引用共用体成员。其引用方式为:共用体变量名.成员名ex.a=4;ex.b=6;9.4.2共用体类型的引用案例9-9:引用共用体类型变量中的成员变量

#include<stdio.h>unionexample{ struct{intx;inty;}in;inta;intb;}ex;voidmain(){ ex.a=4;ex.b=6; ex.in.x=ex.a*ex.b;ex.in.y=ex.a+ex.b;printf("%d,%d\n",ex.in.x,ex.in.y);}共用体是用同一段内存存放不同类型的数据,所以在每一时刻内存只有一成员。案例中先对成员ex.a进行赋值,然后对成员ex.b进行赋值,那么只有ex.b是有效存在的,而之前对成员ex.a的赋值已经被后者ex.b覆盖而不再有效。共用体变量的地址和它所有成员的地址都是相同的。如&ex,&ex.a,&ex.b都是同一个地址。

9.5枚举类型学习目标1、掌握枚举类型和枚举变量的定义。2、掌握枚举变量的使用。9.5枚举类型1、若某个变量只有几种可能的值,如人民币的面值只有分,角,元这三种取值,那么就可以把该变量定义为枚举类型。所谓“枚举”是指把变量的值一一列举出来,变量的取值只能是列举出来的某一个值。2、枚举类型的一般定义格式如下:enum枚举类型名{标识符1,标识符2,……标识符n}变量名列表;9.5枚举类型案例9-10:枚举类型的使用。#include<stdio.h>enummonth{Jan,Feb,Mar,Apr=8,May,Jun,Jul,Aug,Sept,Oct,Nov,Dev};voidmain(){ enummonthmon1=Mar;enummonthmon2=Jun;printf("%d,%d\n",mon1,mon2);}9.6用户自定义类型学习目标掌握用typedef定义类型9.6用户自定义类型1、使用typedef语句的一般形式如下:

typedef原数据类型新的数据类型名;2、使用typedef的目的,一个是给复杂的数据类型 一个易于记忆的名字,另一个是有利于程序的通用和移植。有时候程序会依赖于硬件特性,用typedef便于移植。 案例9-11:使用typedef自定义STU类型。

#include<stdio.h>typedefstructstudent{ intnum; char*name; charsex; floatscore;}STU;voidmain(){structstudentjack1={2010,"jack",'M',987.6};STUjack2={2010,"jack",'M',987.6};printf("Themessageofstudentjack1:\n");printf("Number=%d\nName=%s\n",jack1.num,);printf("Sex=%c\nScore=%f\n",jack1.sex,jack1.score);printf("Themessageofstudentjack2:\n");printf("Number=%d\nName=%s\n",jack2.num,);printf("Sex=%c\nScore=%f\n",jack2.sex,jack2.score);}使用typedef声明新的类型名STU代替已有的structstudent类型名声明的新类型名STU,它代表上面指定的structstudent结构体类型。STU可以声明变量

课后练习选择题1、若有以下定义:structst{inta;floatf;}s,*p;p=&s;下列通过指针p引用s的成员语句中正确的是()。A. p.a=10; B.*p.a=10;C. *p->a=10;D.(*p).a=102、若有以下函数:main(){ union{unsignedintn; unsignedchar c;}u1;

温馨提示

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

评论

0/150

提交评论