欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    【教学课件】第11章结构体.ppt

    • 资源ID:5657759       资源大小:1.07MB        全文页数:70页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    【教学课件】第11章结构体.ppt

    1,第 十 一 章,结 构 体与共用休,2,3,例:描述一个学生的姓名、学号、性别、年龄。每个学生都有这样的属性,它们构成一个描述学生具体情况的一个整体。而每个属性又是一个基本的类型,本例中可分别用字符数组、长整型、字符型、和整型来描述。,一、结构体类型的定义,结构体概念的引入,数据的描述:基本类型:整型、实型、字符型。数组:属于同一种类型的元素的集合。有时,需要用不同的数据类型来描述一个事物的各方面属性,故此,C语言引入了结构体的概念。,4,struct 结构体类型名 类型标识符 成员名1;类型标识符 成员名2;类型标识符 成员名n;;,结构体类型的定义,如:struct student char name10;long id;char gender;int age;,注意:struct student 应作为一个类型整体,name10、id、gender、age都是其成员。struct及花括号后的“;”不能省。,5,定义结构体类型,描述下列数据,struct student int no;/*学号*/char name10;/*姓名*/char sex;/*性别*/int age;/*年龄*/float score10;/*成绩*/;,结构体类型的举例,(1)学生情况:包含学生的学号、姓名、性别、年龄、10门课程成绩:,6,(2)个人数据:包含姓名、性别、年龄、身高、体重、住址:,struct person char name20;/*姓名*/char sex;/*性别*/int age;/*年龄*/float height;/*身高*/float weight;/*体重*/char addr50;/*住址*/;,7,(3)平面上的点:,struct point2 float x;/*横坐标*/float y;/*纵坐标*/;,如考虑空间中的点,可作如下定义:struct point3 float x;/*X坐标*/float y;/*Y坐标*/float z;/*Z坐标*/;,8,(4)日期,包括年、月、日:,如职工信息结构体类型为:struct personchar name20;/*姓名*/char address40;/*地址*/float salary;/*工资*/float cost;/*扣款*/struct date hiredate;/*聘任日期*/;,结构体类型可以嵌套定义 即一个结构体类型中的某些成员又是其他结构体类型,struct date int year;/*年*/int month;/*月*/int day;/*日*/;,注意,9,例如,对已定义的结构体类型struct student,可以定义结构体变量:struct student zhang,stu1;struct person p50;/*50个职工人的数据*/,二、结构体变量,结构体变量的定义,1.先定义结构体类型,再定义结构体变量,格式:struct 结构体名 结构体变量名表;,三种方法:,10,2.在定义结构体类型的同时定义变量,例如:struct student char name10;char sex;int age;float score;stu1,stu2;,格式:struct 结构体类型名 类型标识符 成员名1;类型标识符 成员名2;类型标识符 成员名n;变量名表;,11,3.用匿名形式直接定义结构体类型变量(不出现结构体名),例如:struct char name10;char sex;int age;float score;stu1,stu2;,格式:struct 类型标示符 成员名1;类型标示符 成员名2;类型标示符 成员名n;变量名表;,(1)类型与变量是不同的概念,不要混同。对结构体变量来说,在定义时一般先定义一个结构体类型,然后定义变量为该类型。只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算。在编译时,对类型是不分配存储空间的,只对变量分配存储空间。(2)对结构体中的成员,可以单独使用,它的作用相当于普通变量。(3)成员也可以是一个结构体变量。(4)成员名可与程序中的变量同名,两者不代表同一对象。,结构体的说明,12,例。定义结构体变量stu1:struct student stu1;stu1.age=20;scanf(%f,stu1.age 表示引用结构体变量stu1中的age成员,因该成员的类型为int型,所以可以对它执行任何int型变量可以执行的运算。,结构体变量的使用,结构体变量一般不整体引用,而是引用其成员变量。,成员变量引用格式,结构体变量名.成员名,其中的圆点运算符称为成员运算符,它的运算级别是最高的。,13,(1)结构体类型变量的各成员(分量)必须单独引用,成员运算符“”具有最高优先级。(2)不允许对结构体变量进行整体的输入输出 如:scanf(“%s%c%d%f”,(4)严格区分类型与变量的概念。(5)如果结构体成员本身又是结构体类型的,则可继续使用成员运算符取结构体成员的结构体成员,逐级向下,引用最低一级的成员。程序只能对最低一级的成员进行运算。例如,对stu1某些成员的访问:stu1.birthday.day=23;stu1.birthday.month=8;stu1.birthday.year=1985;,说明,14,结构体变量的初始化,结构体变量可以在定义时初始化。,格式,struct 结构体名 成员表;结构体变量=初始化数据表;,例 struct student char name10;char sex;int age;float score;stu1,stu2=“Wangwu”,m,20,88.5;,15,结构体变量存储分配,16,例 11.1 求某同学上学期6门课程的总成绩与平均成绩。,思路分析:可以先构建一个结构体,包含学生的姓名、八门课的成绩、以及总成绩及平均成绩。struct student char name10;float score6;float total,average;;然后在程序中输入姓名及各科成绩后即可进行运算,运算结果存放到total和average两个成员变量中。,17,main()int i;struct student char name10;float score6;float total,average;stu;scanf(%s,stu.name);for(i=0;i6;i+)scan(%f,i+)stu.total+=stu.scorei;stu.average=stu.total/6;printf(”%s的总成绩=%.2fn平均成绩=%.2f”,stu.total,stu.average);,输入数据:CHEN 80 86 79 98 88 72 运行结果:CHEN的总成绩=477.00平均成绩=72.13,程序如下:,18,与结构体变量定义类似,只是结构体变量名为结构体数组变量名,如:struct student stu3;数组各元素在内存中连续存放,三、结构体数组,结构体数组的定义,结构体数组的初始化,一般形式是在定义的数组后面加上=初值表列;,例。struct student int num;char name20;char sex;int age;float score;char addr30;stu3=101,”WGJ”,M,28,88.5,”CS”,102,”DYH”,F,26,88.0,”CS”,103,”DYC”,M,24,78.5,”CZ”;,19,结构体数组的存储分配,20,通过下面的示例说明结构体数组的使用方法例11.2 候选人得票的统计。设有三个候选人,每次输入一个得票的候选人的名字,要求最后输出各人得票结果。,结构体数组的使用,struct person char name20;int count;leader3=Zhang,0,Li,0,Wang,0;,程序如下:,21,main()int i,j;char leader_name20;for(i=1;i=10;i+)scanf(%s,leader_name);for(j=0;j3;j+)if(strcmp(leader_name,leaderj.name)=0)leaderj.count+;printf(n);for(i=0;i3;i+)printf(%5s:%dn,leaderi.name,leaderi.count);,22,一个结构体变量的指针就是该变量所占据的内存段的起始地址。可以定义一个指针变量,用来指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址。,四、指向结构体类型数据的指针,23,指向结构体变量的指针定义形式:struct 结构体名*结构体指针名;例 struct student*p;,使用结构体指针变量引用成员形式,存放结构体变量在内存的起始地址,指向运算符优先级:1结合方向:从左向右,例 指向结构体的指针变量,main()struct student long int num;char name20;char sex;float score;stu_1,*p;p=,例 int n;int*p=n=10,struct student stu1;struct student*p=(*p).num=101,24,指向结构体数组的指针,例 指向结构体数组的指针,struct student int num;char name20;char sex;int age;stu3=10101,Li Lin,M,18,10102,Zhang Fun,M,19,10104,Wang Min,F,20;main()struct student*p;for(p=stu;pnum,p-name,p-sex,p-age);,25,用指向结构体的指针作函数参数用结构体变量的成员作参数-值传递用指向结构体变量或数组的指针作参数-地址传递用结构体变量作参数-多值传递,效率低,将结构体变量所占的内存单元的内容全部顺序传递给形参。形参也必须是同类型的结构体变量。在函数调用期间形参也要占用内存单元。这种传递方式在空间和时间上开销较大,因此一般较少用这种方法,将结构体变量(或数组)的地址传给形参,26,#include#define FORMAT“%dn%sn%fn%fn%fn”struct student int num;char name20;float score3;main()void print(struc student)struct student stu;stu.num=12345;strcpy(stu.name,”Li Li”);stu.score0=67.5;stu.score1=89;stu.score2=78.6;print(stu);void print(struct student stu)printf(FORMAT,stu.num,stu.name,stu.score0,stu.score1,stu.score2);printf(n);,例 用结构体变量作函数参数,27,例 用结构体指针变量作函数参数,#include#define FORMAT“%dn%sn%fn%fn%fn”struct student int num;char name20;float score3;stu=12345,”Li Li,67.5,89,78.6;main()void print(struc student*)print(,28,11.7 用指针处理链表,11.7.1 链表概述 链表是一种常见的重要的数据结构,是动态地进行存储分配的一种结构。链表的组成:头指针:存放一个地址,该地址指向一个元素 结点:用户需要的实际数据和链接节点的指针,图11-10,29,11.7 用指针处理链表,用结构体建立链表:struct student int num;float score;struct student*next;;其中成员num和score用来存放结点中的有用数据(用户需要用到的数据),next是指针类型的成员,它指向struct student类型数据(这就是next所在的结构体类型),图11-11,30,11.7 用指针处理链表,11.7.2 简单链表,#include#define NULL 0 struct student long num;float score;struct student*next;main()struct student a,b,c,*head,*p;a.num=99101;a.score=89.5;b.num=99103;b.score=90;c.num=99107;c.score=85;head=,运行结果:1010189.51010390.01010785.0,31,11.7 用指针处理链表,处理动态链表所需的函数 库函数提供动态地开辟和释放存储单元的有关函数:malloc函数 其函数原型为void*malloc(unsigned int size);其作用是内存的动态存储区中分配一个长度为size的连续空间。此函数的值(即“返回值”)是一个指向分配域起始地址的指针(类型为void)。如果此函数未能成功地执行(例如内存空间不足),则返回空指针(NULL)。,32,11.7 用指针处理链表,(2)calloc函数 其函数原型为void*calloc(unsigned,unsigned size);其作用是在内存的动态存储区中分配个长度为size的连续空间。函数返回一个指向分配域起始地址的指针;如果分配不成功,返回NULL。用calloc函数可以为一维数组开辟动态存储空间,n为数组元素个数,每个元素长度为size,33,11.7 用指针处理链表,(3)free函数 其函数原型为 void free(void*p);其作用是释放由指向的内存区,使这部分内存区能被其他变量使用。是最近一次调用calloc或malloc函数时返回的值。free函数无返回值.,34,11.7 用指针处理链表,11.7.4 建立动态链表 所谓建立动态链表是指在程序执行过程中从无到有地建立起一个链表,即一个一个地开辟结点和输入各结点数据,并建立起前后相链的关系例11.5 写一函数建立一个有3名学生数据的单向动态链表.算法如图,图11-12,35,11.7 用指针处理链表,算法的实现:约定学号不会为零,如果输入的学号为,则表示建立链表的过程完成,该结点不应连接到链表中。如果输入的p1-num不等于,则输入的是第一个结点数据(n=1),令headp1,即把p1的值赋给head,也就是使head也指向新开辟的结点p1所指向的新开辟的结点就成为链表中第一个结点,图11-13,36,11.7 用指针处理链表,算法的实现:再开辟另一个结点并使p1指向它,接着输入该结点的数据.,如果输入的p1-num,则应链入第个结点(n=2),将新结点的地址赋给第一个结点的next成员.,接着使,也就是使指向刚才建立的结点,图11-14,37,11.7 用指针处理链表,算法的实现:再开辟一个结点并使p1指向它,并输入该结点的数据.,在第三次循环中,由于(),又将的值赋给-,也就是将第个结点连接到第个结点之后,并使,使指向最后一个结点.,图11-15,38,11.7 用指针处理链表,算法的实现:再开辟一个新结点,并使p1指向它,输入该结点的数据。由于p1-num的值为,不再执行循环,此新结点不应被连接到链表中.,将NULL赋给p2-next.,建立链表过程至此结束,p1最后所指的结点未链入链表中,第三个结点的next成员的值为NULL,它不指向任何结点。,图11-16,39,11.7 用指针处理链表,建立链表的函数如下:#include#include#define NULL 0/令NULL代表,用它表示“空地址#define LEN sizeof(struct student)/令LEN代表struct/student类型数据的长度 struct student long num;float score;struct student*next;int n;/n为全局变量,本文件模块中各函数均可使用它,40,11.7 用指针处理链表,struct student*creat()struct student*head;struct student*p1,*p2;n=0;p1=p2=(struct student*)malloc(LEN);scanf(%ld,%f,41,11.7 用指针处理链表,11.7.5 输出链表 首先要知道链表第一个结点的地址,也就是要知道head的值。然后设一个指针变量p,先指向第一个结点,输出所指的结点,然后使后移一个结点,再输出,直到链表的尾结点。,图11-17,11-18,42,11.7 用指针处理链表,例19 编写一个输出链表的函数print.void print(struct student*head)struct student*p;printf(nNow,These%d records are:n,n);p=head;if(head!=NULL)do printf(%ld%5.1fn,p-num,p-score);p=p-next;while(p!=NULL);,43,11.7 用指针处理链表,11.7.6 对链表的删除操作 从一个动态链表中删去一个结点,并不是真正从内存中把它抹掉,而是把它从链表中分离开来,只要撤销原来的链接关系即可。,图11-19,44,11.7 用指针处理链表,例11.10写一函数以删除动态链表中指定的结点.解题思路:从p指向的第一个结点开始,检查该结点中的num值是否等于输入的要求删除的那个学号。如果相等就将该结点删除,如不相等,就将p后移一个结点,再如此进行下去,直到遇到表尾为止。,45,11.7 用指针处理链表,可以设两个指针变量p1和p2,先使p1指向第一个结点.,如果要删除的不是第一个结点,则使p1后移指向下一个结点(将p1-next赋给p1),在此之前应将p1的值赋给p2,使p2指向刚才检查过的那个结点,46,11.7 用指针处理链表,图11-20,47,11.7 用指针处理链表,算法:图11-21,48,11.7 用指针处理链表,删除结点的函数del:struct student*del(struct student*head,long num)struct student*p1,*p2;if(head=NULL)printf(nlist null!n);goto end;p1=head;while(num!=p1-num,49,11.7 用指针处理链表,对链表的插入操作 对链表的插入是指将一个结点插入到一个已有的链表中。为了能做到正确插入,必须解决两个问题:怎样找到插入的位置;怎样实现插入。,50,11.7 用指针处理链表,先用指针变量p0指向待插入的结点,p1指向第一个结点,将p0-num与p1-num相比较,如果p0-nump1-num,则待插入的结点不应插在p1所指的结点之前。此时将p1后移,并使p2指向刚才p1所指的结点.,51,11.7 用指针处理链表,再将p1-num与p0-num比,如果仍然是p0-num大,则应使p1继续后移,直到p0-p1-num为止。这时将p0所指的结点插到p1所指结点之前。但是如果p1所指的已是表尾结点,则p1就不应后移了。如果p0-num比所有结点的num都大,则应将p0所指的结点插到链表末尾。,如果插入的位置既不在第一个结点之前,又不在表尾结点之后,则将p0的值赋给p2-next,使p2-next指向待插入的结点,然后将p1的值赋给p0-next,使得0-next指向p1指向的变量,52,11.7 用指针处理链表,如果插入位置为第一个结点之前(即p1等于head时),则将p0赋给head,将p1赋给p0-next,如果要插到表尾之后,应将p0赋给p1-next,NULL赋给p0-next,图11-22,53,11.7 用指针处理链表,算法:图11-23,54,11.7 用指针处理链表,例11.11插入结点的函数insert如下。struct student*insert(struct student*head,struct student*stud)struct student*p0,*p1,*p2;p1=head;p0=stud;if(head=NULL)head=p0;p0-next=NULL;elsewhile(p0-nump1-num),55,11.7 用指针处理链表,11.7.8 对链表的综合操作 将以上建立、输出、删除、插入的函数组织在一个C程序中,用函数作主调函数。,void main()struct student*head,stu;long del_num;prinf(intput records:n);head=creat();print(head);printf(n intput the deleted number:n);scanf(%ld,56,11.7 用指针处理链表,此程序运行结果是正确的。它只删除一个结点,插入一个结点。但如果想再插入一个结点,重复写上程序最后4行,共插入两个结点,运行结果却是错误的。要注意在输入新结点之前,一定要为结点先开辟新的内存空间,如:stu=(struct student*)malloc(LEN);scanf(%ld,%f,57,11.8 共用体构造数据类型,也叫联合体用途:使几个不同类型的变量共占一段内存(相互覆盖)共用体类型定义定义形式:,union 共用体名 类型标识符 成员名;类型标识符 成员名;.;,例 union data int i;char ch;float f;,类型定义不分配内存,58,形式二:union data int i;char ch;float f;a,b;,形式一:union data int i;char ch;float f;union data a,b,c,*p,d3;,形式三:union int i;char ch;float f;a,b,c;,共用体变量的定义,共用体变量定义分配内存,长度=最长成员所占字节数,共用体变量任何时刻只有一个成员存在,59,共用体变量引用引用方式:,例 a.i=1;a.ch=a;a.f=1.5;printf(“%d”,a.i);(编译通过,运行结果不对),引用规则不能引用共用体变量,只能引用其成员,共用体变量中起作用的成员是最后一次存放的成员,例 union int i;char ch;float f;a;a=1;(),不能在定义共用体变量时初始化,例 union int i;char ch;float f;a=1,a,1.5;(),可以用一个共用体变量为另一个变量赋值,例 float x;union int i;char ch;float f;a,b;a.i=1;a.ch=a;a.f=1.5;b=a;()x=a.f;(),60,例 将一个整数按字节输出,运行结果:i=60501ch0=101,ch1=141ch0=A,ch1=a,main()union int_char int i;char ch2;x;x.i=24897;printf(i=%on,x.i);printf(ch0=%o,ch1=%on ch0=%c,ch1=%cn,x.ch0,x.ch1,x.ch0,x.ch1);,61,结构体与共用体区别:存储方式不同,联系:两者可相互嵌套,62,例 结构体中嵌套共用体,struct int num;char name10;char sex;char job;union int class;char position10;category;person2;,63,例共用体中嵌套结构体,机器字数据与字节数据的处理,struct w_tag char low;char high;union u_tag struct w_tag byte_acc;int word_acc;u_acc;,64,11.9 枚举类型,1枚举类型的定义 enum 枚举类型名 取值表;例如,enum weekdays Sun,Mon,Tue,Wed,Thu,Fri,Sat;枚举变量的定义与结构变量类似(1)间接定义例如,enum weekdays workday;(2)直接定义例如,enum weekdays Sun,Mon,Tue,Wed,Thu,Fri,Sat workday;说明(1)枚举型仅适应于取值有限的数据。例如,根据现行的历法规定,周天,年个月。(2)取值表中的值称为枚举元素或枚举常量,其含义由程序解释。例如,不是因为写成“Sun”就自动代表“星期天”。事实上,枚举元素用什么表示都可以。,所谓“枚举”是指将变量的值一一列举出来,变量的值只限于列举出来的值的范围内,65,(3)枚举元素作为常量是有值的定义时的顺序号(从开始),所以枚举元素可以进行比较,比较规则是:序号大者为大!例如,上例中的Sun=0、Mon=1、Sat=6,所以MonSun、Sat最大。(4)枚举元素的值也是可以人为改变的:在定义时由程序指定。例如,如果enum weekdays Sun=,Mon,Tue,Wed,Thu,Fri,Sat;则Sun=,Mon=,从Tue=2开始,依次增。(5)枚举变量的值无法直接输入输出例:口袋中有红、黄、蓝、白、黑5种颜色的球若个。每次从口袋中先后取出3个球,问3种不同色的球的可能取法,输出每种排列的情况。,66,main()enum colorred,yellow,blue,white,black;enum color i,j,k,pri;int n,loop;n=0;for(i=red;i=black;i+)for(j=red;j=black;j+)if(i!=j)for(k=red;k=black;k+)if(k!=i),67,for(loop=1;loop=3;loop+)switch(loop)case 1:pri=i;break;case 2:pri=j;break;case 3:pri=k;break;default:break;switch(pri)case red:printf(“%-10s”,”red”);break;case yellow:printf(“%-10s”,”yellow”);break;case blue:printf(“%-10s”,”blue”);break;case white:printf(“%-10s”,”white”);break;case black:printf(“%-10s”,”black”);break;default:break;printf(“n”);printf(“ntotal:%5dn”,n);,68,11.10 用typedef定义类型功能:用自定义名字为已有数据类型命名类型定义简单形式:typedef type name;,例 typedef int INTEGER;,类型定义语句关键字,已有数据类型名,用户定义的类型名,例 typedef float REAL;,类型定义后,与已有类型一样使用,例 INTEGER a,b,c;REAL f1,f2;,说明:1.typedef 没有创造新数据类型2.typedef 是定义类型,不能定义变量3.typedef 与 define 不同,define typedef预编译时处理 编译时处理简单字符置换 为已有类型命名,69,typedef定义类型步骤按定义变量方法先写出定义体 如 int i;将变量名换成新类型名 如 int INTEGER;最前面加typedef 如 typedef int INTEGER;用新类型名定义变量 如 INTEGER i,j;,例 定义数组类型 int a100;int ARRAY100;typedef int ARRAY100;ARRAY a,b,c;int a100,b100,c100;,例 定义指针类型 char*str;char*STRING;typedef char*STRING;STRING p,s10;char*p;char*s10;,例 定义函数指针类型 int(*p)();int(*POWER)();typedef int(*POWER)();POWER p1,p2;int(*p1)(),(*p2)();,例 定义结构体类型 struct date int month;int day;int year;d;,例 定义结构体类型 struct date int month;int day;int year;DATE;,例 定义结构体类型typedef struct date int month;int day;int year;DATE;,例 定义结构体类型 DATE birthday,*p;struct date int month;int day;int year;birthday,*p;,类型定义可嵌套,例 typedef struct club char name20;int size;int year;GROUP;typedef GROUP*PG;PG pclub;GROUP*pclub;struct club*pclub;,70,本课程就讲到这里,谢谢大家!,

    注意事项

    本文(【教学课件】第11章结构体.ppt)为本站会员(小飞机)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开