欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    结构体与共用体优秀课件.ppt

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

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

    结构体与共用体优秀课件.ppt

    结构体与共用体第1页,本讲稿共68页 教学要求:教学要求:1.1.掌握结构体类型和结构体变量的定义方掌握结构体类型和结构体变量的定义方法。法。2.2.掌握结构体变量的使用,掌握结构体数组的掌握结构体变量的使用,掌握结构体数组的应用。应用。3.3.初步掌握单链表的基本操作。初步掌握单链表的基本操作。4.4.掌握共用体变量的定义方法及其引用。掌握共用体变量的定义方法及其引用。第第1 12 2章章 结构体与共用体结构体与共用体第2页,本讲稿共68页 一辆银灰色的车牌号为湘一辆银灰色的车牌号为湘A00001A00001的雪弗兰轿车以的雪弗兰轿车以80km/h80km/h的速度行驶。的速度行驶。在这里由车牌、车名、型号、车速共同构成了对在这里由车牌、车名、型号、车速共同构成了对一辆轿车的描述,一辆轿车的描述,在数据处理中,这四个属性应该当在数据处理中,这四个属性应该当作一个整体来处理。但它们不属于同一类型,无法用作一个整体来处理。但它们不属于同一类型,无法用数组来容纳,而用单个变量来分别代表各个属性,又数组来容纳,而用单个变量来分别代表各个属性,又难以反映出它们的内在联系。难以反映出它们的内在联系。C语言提供结构体语言提供结构体(structure)数据结构数据结构,将不同数将不同数据类型、但相互关联的一组数据,组合成一个有机整据类型、但相互关联的一组数据,组合成一个有机整体使用。体使用。12.1 12.1 概概 述述第3页,本讲稿共68页 1.结构类型定义结构类型定义 定义形式:定义形式:strcut 结构类型名结构类型名 数据类型数据类型成员;成员;数据类型数据类型成员;成员;数据类型数据类型成员成员n;;/*些行的分号不能少些行的分号不能少*/也可以表述成如下形式:也可以表述成如下形式:struct 结构体名结构体名 分量表分量表 ;12.2 12.2 结构类型与结构变量的定义结构类型与结构变量的定义(1)struct是结构是结构类型关键字类型关键字(2)“结构体名结构体名”和和“数据项名数据项名”的的命名规则,与变量命名规则,与变量名相同。名相同。(3)个数据项称个数据项称为结构类型的个为结构类型的个成员(或分量)。成员(或分量)。第4页,本讲稿共68页 2.结构体类型特点结构体类型特点 ()定定义义一一个个结结构构体体类类型型,系系统统不不会会为为其其分分配配内内存存单单元元。定定义义一一个个类类型型只只是是表表示示这这个个类类型型的的结结构构,即即告告诉诉系系统统它它由由哪哪些些类类型型的的成成员员构构成成,各各占占多多少少个个字字节节,各各按按什什么形式存储,并把它们当作一个整体来处理。么形式存储,并把它们当作一个整体来处理。()结结构构体体类类型型由由多多个个成成员员组组成成,成成员员的的数数据据类类型型可可以以是是整整型型、实实型型、字字符符型型、数数组组 ,也也允允许许是是另另一一个个已已经经定义的结构体类型。定义的结构体类型。()结构体类型是根据设计者的需要来组合的。结构体类型是根据设计者的需要来组合的。()结构体类型系统没有预先定义,凡需要使用结构结构体类型系统没有预先定义,凡需要使用结构体类型数据的,都必须在程序中自己定义。体类型数据的,都必须在程序中自己定义。第5页,本讲稿共68页struct student int num;char name20;char sex;int age;float score;char addr30;例如:定义学生档案信息例如:定义学生档案信息结构类型结构类型:成员表列成员表列 struct是类型关是类型关键字键字后分号不能少,后分号不能少,表明语句结束。表明语句结束。结构体名结构体名第6页,本讲稿共68页 又例如,定义一个日期结构类型:又例如,定义一个日期结构类型:struct date int year;int month;int day;数数据据类类型型相相同同的的数数据据项项,既既可可逐逐个个、逐逐行行分分别别定定义义,也可合并成一行定义。写为如下形式:也可合并成一行定义。写为如下形式:struct date int year,month,day;3.结构体成员的类型可以是结构体类型结构体成员的类型可以是结构体类型 在在定定义义一一个个结结构构体体类类型型时时,可可以以利利用用已已定定义义的的另另一一个个结结构体类型来定义其成员的类型。构体类型来定义其成员的类型。第7页,本讲稿共68页 例例12.1 嵌套结构体类型定义的例子嵌套结构体类型定义的例子。struct date struct student int month;int num ;int day;char name20 int year;char sex,;int age;struct date birthday;char addr30;numnamesexage birthdaymonthdayyearaddr 结构类型结构类型student的的“birthday”数据项可以是一个已数据项可以是一个已经定义的结构类型经定义的结构类型date第8页,本讲稿共68页 4 4.声明结构体类型变量声明结构体类型变量 (1)(1)先定义结构体类型再定义变量名。先定义结构体类型再定义变量名。定义了结构体类型定义了结构体类型 struct student 后,后,struct student char no7;char name9;char sex3;struct date birthday;可以用它定义变量。如:可以用它定义变量。如:struct student st1,st2;不能写成不能写成 struct st1,st2;第9页,本讲稿共68页 为了方便起见,可以在程序开头定义符号常量进为了方便起见,可以在程序开头定义符号常量进行简化。如:行简化。如:#define STUDENT struct student 则在程序中可以直接写成:则在程序中可以直接写成:STUDENT char no7;char name9;char sex3;struct date birthday;STUDENT st1,st2;第10页,本讲稿共68页 (2)在定义类型的同时定义变量。在定义类型的同时定义变量。则一般定义形式为:则一般定义形式为:struct 结构体名结构体名 分量表;分量表;变量表;变量表;如:如:struct student char no7;char name9;char sex3;struct date birthday;st1,st2;第11页,本讲稿共68页 (3)直接定义结构类型变量定义形式为直接定义结构类型变量定义形式为:struct 分量表分量表;变量表;变量表;在在 struct 后不出现结构体名,因此也不能再以此定义相同后不出现结构体名,因此也不能再以此定义相同的结构体变量。的结构体变量。如:如:struct char no7;char name9;char sex3;struct date birthday;st1,st2;第12页,本讲稿共68页1.结构变量的引用结构变量的引用 对对于于结结构构变变量量,要要通通过过成成员员运运算算符符“.”.”,逐逐个个访访问问其其成员,访问的格式为:成员,访问的格式为:结构变量名结构变量名.成员成员 例如,例如,struct student st1,st2;st1.no,引用结构变量引用结构变量st1中的中的no成员;成员;st1.name 引用结构变量引用结构变量st1中的中的name成员,成员,st2.name 引用结构变量引用结构变量st2中的中的name成员,成员,也可以引用结构体变量以及变量成员的地址也可以引用结构体变量以及变量成员的地址例如,例如,&st1&st1.no其中的其中的“.”是成员是成员运算符运算符 12.3 12.3 结构体变量的初始化和引用结构体变量的初始化和引用第13页,本讲稿共68页如如果果某某成成员员本本身身又又是是一一个个结结构构类类型型,则则只只能能通通过过多多级级的的分分量量运运算,对最低一级的成员进行引用。算,对最低一级的成员进行引用。此时的引用格式扩展为:此时的引用格式扩展为:结构变量名结构变量名.成员成员.子成员子成员.最低最低1级子成员级子成员例如,引用结构变量例如,引用结构变量st1中的中的birthday成员的格式分别为:成员的格式分别为:st1.birthday.yearst1.birthday.monthst1.birthday.day(1)对对最最低低一一级级成成员员,可可像像同同类类型型的的普普通通变变量量一一样样,进进行行相相应应的各种运算。的各种运算。第14页,本讲稿共68页 (2)只能对结构体变量的各分量进行输入输出,不能将一只能对结构体变量的各分量进行输入输出,不能将一个结构体变量直接进行输入输出。个结构体变量直接进行输入输出。scanf(“%s,%s,%s,%d,%d,%d”,&st1);错误错误 printf(“%s,%s,%s,%d,%d,%d”,st1);错误错误 scanf(“%s”,st1.name);正确正确 scanf(“%d”,&st1.birthday.day);正确正确 printf(“%s,%d”,st1.name,st1.birthday.day);正确正确 (3)分量和结构体变量的地址均可以被引用。如:分量和结构体变量的地址均可以被引用。如:scanf(“%s”,st1.name);(输入输入st1.name的值的值)printf(“%x”,&st1);(以十六进制输出以十六进制输出st1的首地址)的首地址)第15页,本讲稿共68页2.结构变量的初始化结构变量的初始化结构变量初始化的格式,与一维数组相似结构变量初始化的格式,与一维数组相似:结构变量结构变量=初值表初值表 不不同同的的是是:如如果果某某成成员员本本身身又又是是结结构构类类型型,则则该该成成员员的初值为一个的初值为一个初值表初值表。例如:例如:st1=“000102”,“张三张三”,“男男”,1980,9,20 注注意意:初初值值的的数数据据类类型型,应应与与结结构构变变量量中中相相应应成成员员所所要要求求的的一致,否则会出错。一致,否则会出错。第16页,本讲稿共68页 例例12.2 外部存储类的结构体变量初始化外部存储类的结构体变量初始化struct student1 long int num;char name20;char sex;char addr30;a=89031,“Li Lin”,M,“123 Beijing Road”;main()printf(“%ld,%s,%c,%sn”,a.num,a.name,a.sex,a.addr);输出结果输出结果:89031,Li Lin,M,123 Beijing Road第17页,本讲稿共68页 3.关于结构体类型的几点说明关于结构体类型的几点说明 (1)类型与变量是两个不同的概念。类型与变量是两个不同的概念。先定义结构体类型,再定义该类型变量。在编译先定义结构体类型,再定义该类型变量。在编译时,对时,对变量分配空间变量分配空间,对,对类型来说不存在分配空间。类型来说不存在分配空间。变量可以赋值、存取或运算,而类型没有这些操变量可以赋值、存取或运算,而类型没有这些操作。作。(2)结构体中的分量名可以与程序中的其它变量同名,它结构体中的分量名可以与程序中的其它变量同名,它们代表不同的对象,互不干扰们代表不同的对象,互不干扰。对结构体中的对结构体中的分量可以单独使用分量可以单独使用。第18页,本讲稿共68页(3)不可以将两个结构变量进行关系比较不可以将两个结构变量进行关系比较非法语句非法语句struct temp int a;char ch;x1,x2;main()x1.a=10;x2.ch=a;if(x1=x2)第19页,本讲稿共68页 (4)(4)可以把一个结构体变量赋给另一个同类型的可以把一个结构体变量赋给另一个同类型的结构体变量结构体变量。struct temp int a;char ch;x1,x2;main()x1.a=10;x1.ch=a;x2=x1 printf(%d,%c,x2.a,x2.ch);把结构变量把结构变量x1的值的值 赋给结构变量赋给结构变量x2.第20页,本讲稿共68页 (5)(5)结构体类型的变量在内存中占有一段连续的存结构体类型的变量在内存中占有一段连续的存储单元。占有连续存储单元的大小取决于成员的数据类储单元。占有连续存储单元的大小取决于成员的数据类型型.如如:struct exp int a;float b;char ch8;;struct exp x=1234,56.7,text结构体类型变量结构体类型变量x在内存在内存共占用共占用14个字节个字节的连续单元的连续单元第21页,本讲稿共68页(6)(6)可通过可通过sizeof()sizeof()运算符获得结构体变量占用的运算符获得结构体变量占用的内存大小。内存大小。struct exp int a;float b;char ch8;x;main()int size;size=sizeof(x);printf(size=%dn,size);第22页,本讲稿共68页例例12.3 结构体成员的使用结构体成员的使用#include#include struct score int math;int eng;int comp;struct stu char name12;char sex;long StuClass;struct score sub;第23页,本讲稿共68页main()struct stu s1=LiMing,M,990324,88,80,90;struct stu s2;clrscr();s2=s1;s2.name0=H;s2.name1=u;s2.StuClass=990325;s2.sub.math=83;printf(Record1%s,%c,%ld,%d,%d,%dn“,s1.name,s1.sex,s1.StuClass,s1.sub.math,s1.sub.eng,p);printf(Record2%s,%c,%ld,%d,%d,%dn,s2.name,s2.sex,s2.StuClass,s2.sub.math,s2.sub.eng,p);相同结构类型变量可相同结构类型变量可直接赋值直接赋值第24页,本讲稿共68页12.412.4 结结 构构 体体 数数 组组结构体数组每个数组元素都是一个结构体类型的数据,结构体数组每个数组元素都是一个结构体类型的数据,且这些数据又分别包括各个分量。且这些数据又分别包括各个分量。结构体数组的定义、初始化等操作和内存中的存放方式结构体数组的定义、初始化等操作和内存中的存放方式与普通数组相类似。与普通数组相类似。1.结构体数组的定义结构体数组的定义与结构变量的定义相似,结构数组的定义也分直接定义与结构变量的定义相似,结构数组的定义也分直接定义和间接定义两种方法,只需说明为数组即可。和间接定义两种方法,只需说明为数组即可。结构体类型名结构体类型名 数组名数组名n例如:例如:struct student stu 3 struct BookLib Book4;第25页,本讲稿共68页 2.结构数组初始化结构数组初始化 与普通数组一样结构数组也可在定义时进行初始化。与普通数组一样结构数组也可在定义时进行初始化。初始化的格式为:初始化的格式为:结构数组结构数组n 初值表初值表1,初值表初值表2,.,初值表初值表n 例例12.4 用用结结构构类类型型 struct student 定定义义一一个个结结构构体体数数组组stu3,用于存储和显示三个学生的基本情况。,用于存储和显示三个学生的基本情况。#include struct.h struct student stu 3=“000102”,“张三张三”,“男男”,1980,9,20,“000105”,“李四李四”,“男男”,1980,8,15,“000112”,“王五王五”,“女女”,1980,3,10 ;第26页,本讲稿共68页 main()int i;/*表示表示1个空格字符个空格字符*/printf(No.NameSexBirthdayn);for(i=0;i成员成员运运算算符符左左侧侧的的运运算算对对象象,只只能能是是指指向向结结构构变变量量(或或结结构构数数组组)的的指针变量指针变量。“-”称为指向运算符。称为指向运算符。(3)(*p).成员成员 (*p)表示表示p指向的结构体变量,不得省去括号。指向的结构体变量,不得省去括号。这样就有:这样就有:st1.num 等价于等价于(*p).num 等价于等价于 p-num,第30页,本讲稿共68页 请注意:请注意:pn 得到得到p指向的结构体变量中的分量指向的结构体变量中的分量n的值。的值。pn+等价于等价于(pn)+得到得到p指向的结构体变量指向的结构体变量中的分量中的分量n的值,用完该值后加的值,用完该值后加1。+pn 等价于等价于+(p n)得到得到p指向的结构体变指向的结构体变量中的分量量中的分量n的值,并在用该值前,先加的值,并在用该值前,先加1。第31页,本讲稿共68页例例12.5指向结构体变量的指针变量应用。指向结构体变量的指针变量应用。include“stdio.h”struct student char number9;char name8;char department20;main()struct student student1,*p;printf(“n学号学号:”);gets(student1.number);printf(n 姓名姓名:”);gets(student1.name);printf(“n 系名系名:”);gets(student1.department);p=&student1;printf(“n 学号学号:%s 姓名姓名:s 所在系所在系:%s”,(*p).number,(*p).name,(*p).department);第32页,本讲稿共68页4.用结构体变量的指针作函数参数用结构体变量的指针作函数参数在在函数调用时,可以函数调用时,可以用结构体变量名做形参和实参,也可以用结构体变量名做形参和实参,也可以用结构体变量的指针作函数参数。用结构体变量的指针作函数参数。例例12.6函数的返回值是结构体变量。函数的返回值是结构体变量。#include“stdio.h”struct student char number9;char name8;char department20;struct student input();第33页,本讲稿共68页main()struct student st1;st1=input();printf(“n学号学号:%s 姓名姓名:%s 所在系所在系:%s”,st1.number,st1.name,st1.department);struct student input()struct student temp;printf(“n学号学号:”);gets(temp.number);printf(“n姓名姓名:”);gets(temp.name);printf(“n所在系所在系:”);gets(temp.department);return temp;第34页,本讲稿共68页例例12.7 用结构体变量名做形参和实参。用结构体变量名做形参和实参。#include char*s;struct tree int a;x;void fun(struct tree t)t.a=t.a+10;t.s=computer;printf(%d,%sn,x.a,x.s);x.s=minicomputer;main()x.a=6;func(x);程序运行结果:程序运行结果:16,computer 用结构体变量名用结构体变量名 做实参、形参做实参、形参 第35页,本讲稿共68页12.6 12.6 结构体指针与链表结构体指针与链表链链表表是是一一种种常常见见的的动动态态地地进进行行存存储储分分配配的的数数据据结结构构。链链表表有有 “单单向向链链表表”、“双双向向链链表表”、“循循环环链链表表”、“双双向向循环链表循环链表”之分。之分。1链表结构链表结构链表作为一种常用的、能够实现动态存储分配的数据结构。链表作为一种常用的、能够实现动态存储分配的数据结构。(1)头指针变量头指针变量 head:指向链表的首结点。:指向链表的首结点。(2)每个结点由每个结点由2个域组成:个域组成:数据域:存储结点本身的信息。数据域:存储结点本身的信息。指针域:指向后继结点的指针。指针域:指向后继结点的指针。(3)尾尾结结点点的的指指针针域域置置为为“NULL(空空)”,作作为为链链表表结结束束的的标标志。志。第36页,本讲稿共68页 2.单向链表单向链表 单向链表是按照输入数据的顺序建立的。单向链表是按照输入数据的顺序建立的。它有一个它有一个“头指针头指针”(图中为图中为head),指向第一个元素;,指向第一个元素;每一个元素称为每一个元素称为“结点结点”,每个结点包括两个域:数,每个结点包括两个域:数据域和指下一个结点的指针域;据域和指下一个结点的指针域;最后一个元素的指针域为最后一个元素的指针域为“NULL”(“空地址空地址”),表,表示链表的结束,称为示链表的结束,称为“表尾表尾”。下图是一个下图是一个“单向链表单向链表”的示例。的示例。第37页,本讲稿共68页3对链表的基本操作对链表的基本操作对对链链表表的的基基本本操操作作有有:创创建建、检检索索(查查找找)、插插入入、删删除除和和修修改改等。等。(1)创创建建链链表表是是指指,从从无无到到有有地地建建立立起起一一个个链链表表,即即往往空空链链表表中依次插入若干结点,并保持结点之间的前驱和后继关系。中依次插入若干结点,并保持结点之间的前驱和后继关系。(2)检索操作检索操作是指,按给定的结点索引号或检索条件,是指,按给定的结点索引号或检索条件,查找某查找某个结点个结点。如果找到指定的结点,则称为检索成功;否则,称为。如果找到指定的结点,则称为检索成功;否则,称为检索失败。检索失败。(3)插插入入操操作作是是指指在在链链表表中中增增加加一一个个新新结结点点,使使线线性性表表的的长度增长度增1,并且保持原有逻辑关系。,并且保持原有逻辑关系。(4 4)删删除除操操作作是是指指在在链链表表中中删删除除一一个个结结点点,线线性性表表的的长长度减度减1 1,且,且保持原有保持原有逻辑关系。逻辑关系。第38页,本讲稿共68页 4.4.简单链表的建立简单链表的建立 例例12.8简简单单链链表表的的建建立立,将将已已经经赋赋值值的的结结构构变变量量student1student1和和student2student2链起来链起来,构成一个具有,构成一个具有2 2个结点的单链表。程序如下:个结点的单链表。程序如下:#include“stdio.h”struct student char number9;char name8;char department20;struct student *next;第39页,本讲稿共68页main()struct studentstudent1=“M43000148”,”egg”,”计计科科系系”,student2=“M43000101”,”csc”,”计科系计科系”,*head,*p;head=&student1;student1.next=&student2;/*指指向向下下一一个个学学生生信信息息存存放放的首地址的首地址*/student2.next=NULL;p=head;while(p.next)printf(“学学号号:%s 姓姓名名:%s 所所在在系系:%sn”,p-number,p-name,p-department);p=p-next;第40页,本讲稿共68页 6.用于动态存储分配的函数用于动态存储分配的函数(1)malloc函数函数 函数调用方式:函数调用方式:void*malloc(unsigned size)函数说明:函数说明:malloc()函数的原型在函数的原型在stdlib.h和和alloc.h中。中。函函数数功功能能:从从系系统统中中请请求求分分配配大大小小为为size的的内内存存单单元元,如如果果成成功功则则返返回回指指向向该该区区域域的的首首字字节节的的指指针针;如如果果分分配配失失败败则则返返回回一个空指针一个空指针NULL,即地址为。即地址为。malloc()函函数数的的返返回回值值是是一一个个无无类类型型指指针针,其其特特点点是是可可以以指指向任何类型的数据。向任何类型的数据。例如以下例如以下2条语句:条语句:int pa;pa=(int*)malloc(sizeof(int)*5);执执行行上上述述语语句句后后,指指针针变变量量pa,指指向向内内存存中中1个个由由10字字节存储节存储单元的首字节。单元的首字节。第41页,本讲稿共68页(2)free函数函数函数调用方式:函数调用方式:void free(void*p);函数说明:函数说明:free()函数原型在函数原型在stdlib.h,alloc.h中。中。函函数数功功能能:释释放放p所所指指的的内内存存块块,并并将将它它返返回回给给堆堆,以以便便这这些些内内存存成成为为再再分分配配时时的的可可用用内内存存。p 是是调调用用malloc()函函数数的的返返回回值值。该函数该函数无返回值。无返回值。原原则则上上,在在使使用用malloc()malloc()函函数数申申请请的的内内存存存存储储块块,操操作作结结束束后后,应应及及时时使使用用free()free()函函数数予予以以释释放放。尤尤其其是是循循环环使使用用mallocmalloc()()函函数数时时,如如果果不不及及时时释释放放不不再再使使用用的的内内存存块块,很很可可能能很很快快就就耗尽系统的内存资源,从而导致程序无法继续运行耗尽系统的内存资源,从而导致程序无法继续运行第42页,本讲稿共68页(3)calloc函数函数函函数数调调用用方方式式:void*calloc(unsigned num,unsigned size);函数说明:函数说明:calloc函数原型在函数原型在stdlib.h和和alloc.h中。中。函函数数功功能能:从从系系统统中中请请求求分分配配大大小小为为num*size大大小小的的内内存存单单元元,如如果果如如果果成成功功则则返返回回指指向向该该区区域域的的首首字字节节的的指指针针;如如果果分分配失败则返回一个空指针,即地址为。配失败则返回一个空指针,即地址为。(4)realloc函数函数函数调用方式:函数调用方式:void realloc(void*p,unsigned newsize)函数说明:函数说明:realloc()函数原型在函数原型在stdlib.h和和alloc.h中中函函数数功功能能:把把p所所指指向向的的已已分分配配的的内内存存大大小小变变成成由由newsize所所确定的新的大小。确定的新的大小。第43页,本讲稿共68页例例12.9动态存储分配的函数使用实例。动态存储分配的函数使用实例。#include#include#include#include void main()char*str1,*str2;if(str1=(char*)malloc(10)!=NULL)gets(str1);if(str2=(char*)calloc(10,sizeof(char)!=NULL)strcpy(str2,str1);printf(“str1:%sn str2:%sn”,str1,str2);free(str1);recalloc(str2,0);return;第44页,本讲稿共68页7.动态申请结点,建立单链表动态申请结点,建立单链表 动动态态申申请请结结点点,建建立立单单链链表表有有两两个个关关键键问问题题:第第一一,结结点点的的存存储储空空间间必必须须是是由由程程序序来来请请求求分分配配;第第二二,结结点点之之间间必必须须形形成链状。成链状。8.建立单链表算法建立单链表算法(1)建立头结点:建立头结点:指针指针 p 指向向系统申请的第一个结点指向向系统申请的第一个结点,输入结点数据域的数据;,输入结点数据域的数据;头指针头指针 head和和指针指针rear指向头结点;指向头结点;头指针头指针 head,指向链表的头结点,作函数返回值。,指向链表的头结点,作函数返回值。第45页,本讲稿共68页(2)在头结点后增加第在头结点后增加第2个结点,第结点,第3个结点结点 p 指向申请的第指向申请的第2个新结点新结点,用用rear-next=p;实现连接;实现连接第第2个新结点新结点;rear=p;rear指向第指向第2新结点新结点;p 指向申请的第指向申请的第3个新结点新结点,用用rear-next=p;实现连接;实现连接第第3个新结点新结点;rear=p;rear指向第指向第3新结点新结点;(3)rear指向链表的尾结点时,指向链表的尾结点时,rear-next=NULL。第46页,本讲稿共68页例例12.10用动态存储分配函数,动态申请结点,建立单链表程序。用动态存储分配函数,动态申请结点,建立单链表程序。#include“stdio.h”struct studentchar number9,name8,department20;struct student *next;main()struct student*head=NULL,*p,*last;char Is_exit;while(1)p=(struct student*)malloc(sizeof(struct student);if(p=NULL)continue;/*如果申请失败,继续申请直到成功为止如果申请失败,继续申请直到成功为止*/第47页,本讲稿共68页 printf(“n学号:学号:”);gets(p-number);printf(“n姓名:姓名:”);gets(p-name);printf(“n所在系所在系:”);gets(p-department);p-next=NULL;if(head=NULL)head=p;last=p;continu;else last-next=p;last=p;printf(“n是否继续录入数据是否继续录入数据:(Y/N)”);scanf(“%c”,Is_exit);if(Is_exit=y|Is_exit=Y)continu;else break;last-next=NULL;第48页,本讲稿共68页 9.删除一个新结点删除一个新结点 基本思路基本思路:通过单链表的头指针,顺着结点的指针通过单链表的头指针,顺着结点的指针域找到要域找到要删除删除结点,将该结点从结点,将该结点从单链表中断开单链表中断开。在有序的单链表中删除一个新结点,存在的在有序的单链表中删除一个新结点,存在的4种情况。种情况。(1)(1)为空表,无结点删除为空表,无结点删除 (2)(2)删除第一个结点删除第一个结点 ,头指针指向第二个结点,头指针指向第二个结点 (3)(3)删除链表中的结点删除链表中的结点 (4)(4)删除最后一个结点(表尾结点)删除最后一个结点(表尾结点)第49页,本讲稿共68页 10.插入一个新结点插入一个新结点 单链表中插入一个新结点,可能存在的单链表中插入一个新结点,可能存在的4种情况。种情况。(1)为空表,插入一个新结点,构成只有一个结点为空表,插入一个新结点,构成只有一个结点的链表的链表 (2)在第一个结点前插入,插入新结点为头结点在第一个结点前插入,插入新结点为头结点 (3)顺着结点的指针域找到第顺着结点的指针域找到第i个结点,将新结点插个结点,将新结点插入到第入到第i i个结点之后,链表长度增加个结点之后,链表长度增加1 (4)(4)在最后一个结点后插入,新结点为尾结点在最后一个结点后插入,新结点为尾结点 第50页,本讲稿共68页12.7 12.7 共共 用用 体体 1共用型概念共用型概念 使几个不同的变量占用同一段内存空间的结构称为共用型。使几个不同的变量占用同一段内存空间的结构称为共用型。2共用类型的定义共用类型的定义与结构类型的定义类似与结构类型的定义类似 union 共用类型名共用类型名 成员列表成员列表 ;3共用变量的定义共用变量的定义与结构变量的定义类似与结构变量的定义类似 直接定义形式如下:直接定义形式如下:间接定义形式如下:间接定义形式如下:union union 共用体名共用体名 union union 共用体名共用体名 分量表分量表 分量表分量表 ;变量表变量表 ;union ;union 共用体名共用体名 变量表变量表;第51页,本讲稿共68页共用变量的引用共用变量的引用与结构变量一样只能逐个引用共用变量的成员与结构变量一样只能逐个引用共用变量的成员 printf(“%d”,a);错误错误 scanf(“%d”,&a);错误错误访问变量访问变量 a 各成员的格式为:各成员的格式为:a.i、a.ch、a.f scanf(“d”,&a.i);printf(“%dn”,a.i);5.共用体与结构体相似之处共用体与结构体相似之处(1 1)都是由不同类型的数据项组成一个都是由不同类型的数据项组成一个(2 2)都只能对分量进行操作和引用。都只能对分量进行操作和引用。第52页,本讲稿共68页例例12.12对共用体变量的使用对共用体变量的使用struct int num;编号编号 char name10;姓名姓名 char sex;性别性别 char job;类别:类别:s 学生学生 t 教师教师 union int ciass;班号班号 char position10;职务职务 category;per 2;构造类型构造类型(数组、数组、结构体、共用体结构体、共用体)的定义可以嵌的定义可以嵌套套第53页,本讲稿共68页 main()int n,i;for(i=0;i2;i+)scanf(“%d%s%c%c”,&peri.num,peri.name,&peri.sex,&peri.job);if(peri.job=s)scanf(“%d”,&peri.category.class);else if(peri.job=t)scanf(“%s”,peri.category.position);else printf(“input error!”);prints(“n”);第54页,本讲稿共68页6共用变量特点共用变量特点(1)系统采用覆盖技术,实现共用变量各成员的内存共享,系统采用覆盖技术,实现共用变量各成员的内存共享,所以在某一时刻,存放的和起作用的是最后一次存入的成员值。所以在某一时刻,存放的和起作用的是最后一次存入的成员值。(2)由由于于所所有有成成员员共共享享同同一一内内存存空空间间,故故共共用用变变量量与与其其各成员的地址相同。各成员的地址相同。(3)不不能能对对共共用用变变量量进进行行初初始始化化(注注意意:结结构构变变量量可可以以);也也不不能能将将共共用用变变量量作作为为函函数数参参数数,以以及及使使函函数数返返回回一一个个共共用用数数据据,但但可以使用指向共用变量的指针。可以使用指向共用变量的指针。(4)共用类型可以出现在结构类型定义中,反之亦然。共用类型可以出现在结构类型定义中,反之亦然。第55页,本讲稿共68页 struct memb float v;int n;char c;sa1;sa1占占7个字个字 节节内存空间内存空间union memb float v;int n;char c;usa2;usa2占占4个字节个字节内存空间内存空间 100110051007vnc2001vnc200220032004 共用变量占用的内存空间,等于最长成员的长度,而共用变量占用的内存空间,等于最长成员的长度,而不是各成

    注意事项

    本文(结构体与共用体优秀课件.ppt)为本站会员(石***)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

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




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开