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

    第14讲指针链表和共用体.ppt

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

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

    第14讲指针链表和共用体.ppt

    第14讲 结构体与共用体(2)-指针链表和共用体,主讲教师:张常有Email:电话:13811931759,C语言程序设计,主要内容,作业,C语言程序设计,1.用指针处理链表(1),1.1 链表概述,链表是一种常见的重要的数据结构。它是动态地进行存储分配的一种结构。,说明,C语言程序设计,链表概述,1)链表有一个“头指针”变量,存放一个地址。该地址指向下一个元素。2)链表中每一个元素称为“结点”,每个结点都应该包括两个部分:一为用户需要用的实际数据;二为下一个结点的地址。3)链表中各元素在内存中可以不连续存放。要找某一元素,必须先找到上一个元素,根据它提供的下一元素地址才能找到下一元素。4)链表的数据结构,必须利用指针变量才能实现。即:一个结点中应包含一个指针变量,用它存放下一结点的地址。,C语言程序设计,1.用指针处理链表(2),建立一个简单链表,它由三个学生数据的结点组成。输出各结点中的数据。,#define NULL 0struct 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;,1.2 建立一个简单的链表(1),例 14-1,C语言程序设计,例14-1 建立一个简单的链表(2),head=,C语言程序设计,1.用指针处理链表(3),malloc函数,void*malloc(unsigned int size);其作用是在内存的动态存储区中分配一个长度为size的连续空间。此函数的值(即“返回值”)是一个指向分配域起始地址的指针。如果此函数未能成功地执行(如内存空间不足),则返回空指针。,calloc函数,void*calloc(unsigned n,unsigned size);其作用是在内存的动态区存储中分配n个长度为size的连续空间。函数返回一个指向分配域起始地址的指针;如分配不成功,返回NULL。,1.3处理动态链表所需的函数(1),C语言程序设计,1.用指针处理链表(4),free函数,void free(void*p);其作用是释放由p指向的内存区,使这部分内存区能被其他变量使用。p是最近一次调用calloc或malloc函数时返回的值。free函数无返回值。,1.3处理动态链表所需的函数(2),C语言程序设计,1.用指针处理链表(5),1.4 建立动态链表,建立动态链表是指在程序执行过程中从无到有地建立起一个链表,即一个一个地开辟结点和输入各结点数据,并建立起前后相链的关系。,例 14-2,C语言程序设计,例14-2写一函数建立一个有3名学生数据的单向动态链表,数据结构设计:,struct student long num;float score;struct student*next;,C语言程序设计,例14-2写一函数建立一个有3名学生数据的单向动态链表,算法:,C语言程序设计,例13-2写一函数建立一个有3名学生数据的单向动态链表,代码(1):,#include#define NULL 0#define LEN sizeof(struct student)struct student long num;float score;struct student*next;int n;struct student*creat(void)struct student*head;struct student*p1,*p2;n=0;,C语言程序设计,例14-2写一函数建立一个有3名学生数据的单向动态链表,代码(2):,p1=p2=(struct student*)malloc(LEN);scanf(“%ld,%f”,C语言程序设计,1.用指针处理链表(6),1.5 输出链表,首先,知道链表第一个结点的地址,也就是要知道head的值;然后,设一个指针变量p,先指向第一个结点,输出p所指向的结点;而后,使p后移 一个结点,再输出。直到链表的尾结点。,例 14-3,C语言程序设计,例14-3 编写一个输出链表的函数print,void print(struct student*head)struct student*p;printf(“nNow,These%d records are:n”,n);p=head;while(p!=NULL)printf(“%ld%5.1fn”,p-num,p-score);p=p-next;,C语言程序设计,1.用指针处理链表(7),1.6 对链表的删除操作,举例:一队小孩(A、B、C、D、E)手拉手,如果某一小孩(C)想离队有事,而要求队形保持不变。只要将C的手从两边脱开,B改为与D拉手即可。,A,B,C,D,E,例 14-4,C语言程序设计,例14-4 写一函数以删除动态链表中指定的结点(1),以指定的学号作为删除结点的标志。例如,输入99103表示要求删除学号为99103的结点。,解题思路:从p指向的第一个结点开始,检查该结点中的num值是否等于输入的要求删除的那个学号。如果相等就将该结点删除,如不相等,就将p后移一个结点,再如此进行下去,直到遇到表尾为止。,C语言程序设计,例14-4 写一函数以删除动态链表中指定的结点(2),解题步骤:1)设两指针变量p1和p2,先使p1指向第一个结点。如果要删除的不是第一个结点,则使p1后指向下一个结点。如此一次一次地使p后移,直到找到所要删除的结点或检查完全部链表都找不到要删除的结点为止。,思考:两种情况,如果删除的是第一个结点和不是第一个结点,C语言程序设计,例14-4 写一函数以删除动态链表中指定的结点(3),要删除的是第一个节点。这时须将头指针指向原有链表的第二个元素。如下图:,C语言程序设计,例14-4 写一函数以删除动态链表中指定的结点(4),要删除的不是第一个结点如下图:,C语言程序设计,例14-4 写一函数以删除动态链表中指定的结点(6),代码,struct student*del(struct student*head,long num)struct student*p1,*p2;if(head=NULL)printf(“nlist null!n”);p1=head;,C语言程序设计,例14-4 写一函数以删除动态链表中指定的结点(6),代码,while(num!=p1-num,C语言程序设计,1.用指针处理链表(8),1.7 对链表的插入操作,对链表的插入是指将一个结点插入到一个已有的链表中。,为了能做到正确插入,必须解决两个问题:怎样找到插入的位置;怎样实现插入。,例 14-5,C语言程序设计,例14-5 插入结点的函数(1),应用题目:如果有一群小学生,按身高顺序(由低到高)手拉手排好队。现在来了一名新同学,要求按身高顺序插入队中。,分析:首先,要确定插到什么位置。其次,进行插入。再次,确定插入的位置是否在第一个结点之前,或是链表之尾。,C语言程序设计,例14-5 插入结点的函数(2),C语言程序设计,例14-5 插入结点的函数(3),C语言程序设计,例14-5 插入结点的函数(4),C语言程序设计,例14-5 插入结点的函数(6),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;else,代码,C语言程序设计,例14-5 插入结点的函数(6),while(p0-nump1-num),代码,C语言程序设计,1.用指针处理链表(9),1.8 对链表的综合操作,将例13.213.5中的四个函数顺序排列,用main函数作主调函数。,main()struct student*head,stu;long del_num;printf(input Record:n);head=creat();print(head);printf(ninput the deleted number:);scanf(%ld,返回主菜单,C语言程序设计,2.共用体(1),2.1 共用体的概念(1),几种不同类型的变量存放到同一段内存单元中。变量在内存中占的字节数不同,但都从同一地址开始存放。也就是使用覆盖技术,几个变量互相覆盖。这种使几个不同的变量共占同一段内存的结构,称为“共用体”类型的结构。,整型 变量,1000地址,字符变量ch,实 型变 量 f,C语言程序设计,2.共用体(2),2.1 共用体的概念(2),定义共用体类型变量的一般形式为:,结构体变量所占内存长度是各成员占的内存长度之和。每个成员分别占有其自己的内存单元。,C语言程序设计,2.共用体(3),2.2 共用体的变量的引用方式(1),只有定义了共用体变量才能引用它。不能引用共用体变量,而只能引用共用体变量中的成员。例如:,C语言程序设计,2.共用体(4),2.3 共用体类型的特点(1),1)同一个内存段可以用来存放几种不同类型的成员,但在每一瞬时只能存放其中一种,而不是同时存放几种。也就是说,每一瞬时只有一个成员起作用,其他的成员不起作用,即不是同时都存在和起作用。,2)共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员就失去作用。,3)共用体变量的地址和它的成员的地址是同一地址。,例如:&a,&a.i,&a.c,&a.f是同一地址。,C语言程序设计,2.共用体(5),2.3 共用体类型的特点(2),4)不能对共用体变量名赋值,也不能企图引用变量名来得到一个值,又不能在定义共用体变量时对它初始化。,5)不能用共用体变量作为函数参数,也不能使函数带回共用体变量,但可以使用指向共用体变量的指针。,6)共用体类型可以出现在结构体类型定义中,也可以定义共用体数组。反之,结构体也可以出现在共用体类型定义中,数组也可以作为共用体的成员。,下列是不对的:1)unionint i;char ch;float f;a=1,a,1.5;2)a=1;3)m=a;,C语言程序设计,例14-6 共用体举例(1),设有若干个人员的数据,其中有学生数据和教师数据。学生的数据中包括:姓名、号码、性别、职业、班级。教师的数据包括:姓名、号码、性别、职业、职务。,C语言程序设计,例14-6 共用体举例(2),算法,是,否,job等于t?,真,假,job等于s?,真,假,C语言程序设计,例14-6 共用体举例(3),代码,struct int num;char name10;char sex;char job;unionint class;char position10;category;person2;main()int n,i;for(i=0;i2;i+)scanf(“%d%s%c%c”,返回主菜单,C语言程序设计,3.枚举类型,枚举是指将变量的值一一列举出来,变量的值只限于列举出来的值的范围内。,也可以直接定义枚举变量。例如:enumsum,mon,tue,wed,thu,fri,satworkday,week_end;,说 明,例 14-7,C语言程序设计,关于枚举类型的说明(1),1)在C编译中,对枚举元素按常量处理,故称枚举变量。它们不是变量,不能对它们赋值。例如:sun=0;mon=1;是错误的。,2)枚举元素作为常量,是有值的,C语言编译按定义时的顺序使它们的值为0,1,2,在上面定义中,sun的值为0,mon的值为1sat为6。如果有赋值语句:workday=mon;workday变量的值为1。这个整数是可以输出的。如:printf(“%d”,workday);将输出整数1。也可以改变枚举元素的值,在定义时由程序员指定,如:enum weekdaysun=7,mon=1,tue,wed,thu,fri,satworkday,week_end;定义sun为7,mon=1,以后顺序加1,sat为6。,C语言程序设计,关于枚举类型的说明(2),3)枚举值可以用来做判断比较。如if(workday=mon).if(workdaysun)枚举值的比较规则是按其在定义时的顺序号比较。如果定义时未人为指定,则第一个枚举元素的值认作0。故monsun,satfri.,4)一个整数不能直接赋给一个枚举变量。例如:workday=2;是不对的。它们属于不同的类型。应先进行强制类型才能赋值。workday=(enum weekday)2;相当于将顺序号为2的枚举元素赋给workday,相当于workday=tue;甚至可以是表达式。如:workday=(enum weekday)(5-3);,C语言程序设计,例14-7 枚举类型举例(1),口袋中有红、黄、蓝、白、黑5种颜色的球若干个。每次从口袋中先后取出3个球,问得到3种不同色的球的可能取法,输出每种排列的情况。,分析:球只能是5中色之一,而且要判断各球是否同色,应该用枚举类型变量处理。设取出的球为i,j,k。i,j,k为5种色球之一,应该用枚举类型变量处理。,C语言程序设计,例14-7 枚举类型举例(2),例13-7 枚举类型举例,算法,C语言程序设计,例14-7 枚举类型举例(3),代码,main()enum color red,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!=j),C语言程序设计,例14-7 枚举类型举例(4),代码,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);,返回主菜单,C语言程序设计,4.用typedef定义类型(1),可以用typedef声明新的类型名来代替已有的类型名。,例如:typedef int INTEGER;typedef float REAL;以下两句是等价的:int i,j;float a,b;INTEGER i,j;FLOAT a,b;,声明一个新的类型名的方法是:先按定义变量的方法写出定义体(如:int i;)。将变量名换成新类型名(如:将i换成COUNT)。在最前面加typedef(如:typedef int COUNT)。然后可以用新类型名去定义变量。,C语言程序设计,4.用typedef定义类型(2),举例说明:(对数组类型的定义类型)先按定义数组变量形式书写:int n100;将变量名n换成自己指定的类型名:int NUM100;在前面加上typedef,得到typedef int NUM100;用来定义变量:NUM n;习惯上,把用typedef声明的类型名用大写字母标示,以便与系统提供的标准类型标识符区别。,说 明,C语言程序设计,用typedef定义类型的说明(1),1)用typedef可以声明各种类型名,但不能定义变量。用typedef可以声明数组类型、字符串类型,使用比较方便。例如:int a10,b10,c10;使用typedef,typedef int ARR10;ARR a,b,c,d;可以看到,用typedef可以将数组类型和数组变量分离开来,利用数组类型可以定义多个数组变量。,2)用typedef只是对已经存在的类型增加一个类型名,而没有创造新的类型。如:typedef int NUM10;,C语言程序设计,用typedef定义类型的说明(2),3)typedef与#define有相似之处,如:typedef int COUNT 和#define COUNT int的作用都是用COUNT代表int。事实二者不同:#define是在预编译时处理的,只能做简单的字符串替换;而typedef是在编译时处理。,4)当不同源文件中用到同一类型数据时,常用typedef声明一些数据类型,把它们单独放在一个文件中,然后在需要用到它们的文件中用#include命令把它们包含进来。,C语言程序设计,用typedef定义类型的说明(3),5)使用typedef有利于程序的通用与移植。有时程序会依赖于硬件特性,用typedef便于移植。例如:有的计算机系统int型数据用两个字节,数值范围为-3276832767,而另外一些 机器则以4字节存放一个整数,数值范围为+21亿。如果把一个C程序从一个以4个字节存放整数的计算机系统移植到以2个字节存放整数的系统,按一般办法需要将定义变量中的每个int改为long。将“int a,b,c;”改为“long a,b,c;”,如果程序中有多处用int定义变量,则要动多处。但用typedef 可以如下改变:typedef int INTEGER;typedef long INTEGER;,返回主菜单,C语言程序设计,作业,思考题共用体的概念和使用枚举类型上机实验1111.11,11.12,C语言程序设计,The end,

    注意事项

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

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




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开