第9章结构体与共同体.ppt

上传人:本田雅阁 文档编号:2094665 上传时间:2019-02-13 格式:PPT 页数:44 大小:242.51KB
返回 下载 相关 举报
第9章结构体与共同体.ppt_第1页
第1页 / 共44页
第9章结构体与共同体.ppt_第2页
第2页 / 共44页
第9章结构体与共同体.ppt_第3页
第3页 / 共44页
亲,该文档总共44页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《第9章结构体与共同体.ppt》由会员分享,可在线阅读,更多相关《第9章结构体与共同体.ppt(44页珍藏版)》请在三一文库上搜索。

1、,第9章 结构体与共同体,9.1 结构体 9.2 结构体数组 9.4 共用体,9.1 结构体,确定该类型数据的表示形式、取值范围、存储结构及其允许参加的运算。 在程序中每个变量在使用前要确定其类型,在前面所定义的类型都是标准类型。 在前面介绍的内容均为系统定义类型,用户只要按要求用这些类型说明变量即可。,类型的作用,例如: int x; float y; char a30;,这些基本类型只能解决简单的问题,而实际应用中的类型是千变万化的。,简单类型(整、实、字)的变量是独立的,变量之间无内在的联系;数组类型虽能同时存放多个数据,但必须是同类型的。 C允许用户按需求自己定义类型。,例如:在计算机

2、等级考试管理系统中,若每个考生 都有如下信息 :,考号 : 长整型 姓名 :字符串 性别 :字符 年龄 :无符号整型 报考等级:字符串 成绩 :实型,数据分属不同的类型,显然不能采用前面已介绍过的类型来处理。 C语言提供了解决这类问题的类型结构体类型。,struct student1 int num; char name20; char class10; char sex; float score; ,struct student2 int num; char name20; char class10; date birth; ,struct date short year; short mo

3、nth ; short day; ,结构类型的定义,struct student1 stu1, stu2,方法1:,方法2:,struct student2 int num; char name20; char class10; date birth; stu1,stu2,在VC中若文件名*.cpp,用结构类型说明变量时可省略struct。,结构类型变量的定义,1. 由于结构类型是一个复合类型,其由多个成员组成,因此不能访问结构体变量(同数组),只能按如下方法访问变量的成员。 变量名 . 成员名 变量名 . 一级成员 . 二级成员 (嵌套时),结构类型变量的访问,struct student1

4、 stu1= 2001802,“李“, “计011“,女,85.2 ; struct student2 stu2= 2001802,“李“, “计011“,女, 12, 3, 1986, 85.2 ;,scanf(“%d“, stu1.num ); gets( stu2.name ); stu1.sex=getchar( ); stu1.birth.day=12; printf(“%d”, stu1.birth.day ); puts( stu2.name ),2.对成员,可根据其类型进行相应的运算。,3.由于结构型变量的成员多,C允许两个同 类型的结构变量可互相整体赋值。,例如: struc

5、t s int no; float score; stu1,stu2= 200123, 76.5 ; stu1=stu2;,4. 结构体变量中的各成员在内存中占一片连续的单元,其长度为: 各成员所占单元之和,5. 不能在定义类型时给成员赋值。,struct stu long num=97031; char name20 =“li ming“; char sex=m; student;,错,不能对类型赋值!,可用结构类型定义指针。即存放结构对象的首地址。,例如: struct student int num; char name20; char sex; float score; ;,struc

6、t student x,*p; p=,由于结构类型变量占用连续单元,故p存放num成员的首地址,指向结构体的指针,结构型变量 . 成员名 结构型指针成员名,访问成员时,有两种表示:,见P.198 例9.3,结构体变量作为函数参数,因为结构体变量中的每个成员都被分配了存储单元, 故当参数是结构体变量时, 采用值传递方式, 将实参的每个成员对应传递给形参成员。 见P.200 例9.4,9.5,9.2 结构体数组,单个结构型变量没有实际的意义,可用简单变量来完成工作。仅当结构体与数组相结合时,才能解决复杂问题,弥补数组的缺点。,用结构类型定义数组。即每个数组元素是结构类型。 见P.202-203,结

7、构体数组的定义,stu1=97001; 错误 stu1.num=97001; 正确,1. 可引用数组元素的成员,不能引用数组元素。因为每 个数组元素是结构类型。,2. 同一结构体类型变量及数组元素之间可整体赋值。,struct student s1,s10; s1=s2; s1=s0; 正确,结构体数组的访问,struct student int num; char name20; char class10; char sex; float score4; void main() struct student stu3; int j ;,例如:输入/出3个学生的信息,每个学生的信息如下:学号,

8、姓名,班级,性别,4门成绩。,for( j=0; j3; j+) scanf(“%d”, ,输出同上。,例程9-1:,某单位有3人参加04年计算机等级考试。现需将每名考生的准考证号、姓名、性别、报考级别和成绩录入计算机,并统计平均分和及格率。,例程9-02: 利用指针访问结构型数组。,9.3 链 表,一、链表的概述:,将数组与结构配合起来使用,可以解决复杂的数据结构,但数组仍需静态定义。,虽然可利用malloc函数动态分配存储单元,但这些动态分配的单元地址不连续,或只能按数组的形式分配单元,仍然不是完全动态分配。,C程序提供了链表类型来解决上述矛盾。,1、什么是链表?,一种动态分配的数据结构。

9、即用指针变量和结构变量将非连续的数据块连成一个整体的一种数据结构。,例如:,A,B,C,上述三个变量间没有任何联系,若希望象数组那样,借助于一个变量的首地址,就能访问到其他变量。,将B的地址存放到A中,将C的地址存放到B中,将A的地址保存,这样就可以通过A变量找到其他变量。,只能按如下方法处理:,即每个变量必须是结构类型,至少有两个成员:一个用来存放本变量的数据,另一个存放某变量的地址。这样只要知道第一个结构变量的地址,就能通过该变量的地址成员中的地址找到某变量。,链表:将若干数据项按一定的原则连接起来的表,表中由若干元素组成,每个元素称为接点。,&stu2,78,0001,&stu3,67,

10、0002,NULL,80,0003,&stu1,head,stu1,stu2,stu3,例如:,借助于链表,可将那些物理上无序的单元,在逻辑上变得有序,从而达到利用动态数据结构访问多个单元的目的。,1) 可动态地分配和释放存储空间。,2、链表的特点:,3) 链表中需设置一个指向第一个结点的头指 针,且最后一个结点设置为NULL。,2) 只能通过前一个接点才能找到下一个结点, 即只能顺序访问结点 ,不能象数组 那样随 机访问。,头指针很重要,它代表链表的首地址,故不要轻易地改变。,3、链表的分类:,单链表、环链表、双链表 ,单链表、环链表、双链表 ,二、链表的编程:,步骤: 1) 定义3个结构体

11、指针 head :保存链表首结点地址, p: 保存链表当前尾结点地址, pnew: 新结点地址。,1. 链表的建立和输出 :,2)给 3个指针赋初值,建立第一个结点: head=NULL; pnew=p=(struct stu *)malloc(LEN); 并给首结点各域赋值。,3)在循环中: 1) 利用malloc函数,产生动态单元(pnew )。 2)给动态单元pnew赋值。 3)将动态单元pnew挂到链表的尾部。,#define LEN sizeof( STU ) struct STU long num; float score; STU next; ;,同时定义三个指向这种类型的指针变

12、量head, pnew, p.,例程: 写一个函数,建立5名学生数据的单向链表,每一个学生的数据块(结点)定义如下:,STU creat( ) / 赋初值 STU head, p, pnew ,int n=0; head=NULL; pnew=p=( STU ) malloc( LEN ); scanf( “%d %f “, ,建立链表,pnew=(STU ) malloc(LEN); scanf(“%ld, %f“, ,pnext=NULL; / 给尾指针赋空 return(head); ,while ( pnewnum != 0 ) n+ +; if( n= =1) head=pnew ;

13、 / 将结点挂到表尾 else pnext =pnew;,p=pnew; / 使hear指向当前表尾,void print ( STU head ) STU p; p=head; if (p = = NULL) printf(“Null List!”); do printf(“%ld %5.1f n“, pnum, pscore); p=pnext ; while (p!=NULL); ,输出链表,例如:,2、链表的删除和插入,链表的删除 :,删除结点操作: 若用2个指针操作 p.next=p1.next 若用1个指针操作 p.next=p.next.next,一般给出某一条件,当某一条件成立

14、时,则删除该结点:,STU del ( STU head, long num ) STU p1, p ; if ( head= =NULL ) printf( “n list null!=n“ ); return (head); ,1)表为空时,无任何删除 2)当第一个结点被删除时,修改表头 3)当最后一个结点不满足条件时,返回。,p1=head; while ( num != p1num 寻找删除点,if ( num= =p1num ) if (p1= =head) head=p1next; else pnext=p1next; printf (“delete: %ld n“, num);

15、n ; else printf (“%ld not been found!n“, num);,一般链表中结点的关键数据按顺序输入,待插入结点的关键数据与链表中的关键数据一一比较,插入适当的位置。,链表的插入,head,例如:,插入操作: new.next=p.next; p.next=new;,步骤: 1)定义3个指针new(指向待插入结点),p1(当前待操作结点),p(p1之前的结点),并赋初值。,2)若链表为空,则插入到表头,作为第一个结点。,3)若链表不为空,寻找插入点。 a. 若插入到第一个结点之前,则改变头指针的值。 b. 若插入在表中或表尾,则执行相应的插入操作。,算法:,STU

16、insert( STU *head, STU *new ) 待插入的结点可在函 STU *p1, *p; 数中输入 p1=head; if( head=NULL) 若为空表,将结点挂 head=new; newnext=NULL; 在头结点 else while( newnum p1num ) 寻找插入点,if( newnum =p1num ) if (head = p1) head=new; 插入在表头 else pnext=new; 插入在表中 newnext=p1; else p1next=new ; newnext=NULL; 插入在表尾 n+; return( head ); 9-4

17、.c 9-5.c,9.4 共有体,二、共用体数据类型的特点,几个不同类型的数据共用同一个存储单元。共用体变量所占内存长度=最长成员的长度,各成员轮流使用一个单元,所以共同体变量及其各成员地址相同。每一瞬间只能存放一个成员,共用体中起作用的是最后一次存入的成员。,一、共用体类型定义,把结构体类型中的关键字struct换成union即可。,例如: struct memb, float v;,int n;,char c;, stag;,stag占内存7个字节的空间,union memb, float v;,int n;,char c;, ustag;,utag分配 4字节, 共用体类型变量每次只能存

18、放一个成员的值。,三、共用体类型变量的引用,(共用体类型变量名). 成员名,1、共用体类型变量的访问同结构体类型变量。 2、不能对共同体变量初始化。 union int i; char ch; x=6, A 错误,例程 #include,union memb, float v;,int n;,char c;,main( ), union memb utag;,utag.v=36.7,utag.c=T ,utag.n=18,printf(“%5.1fn%dn%cn“, utag.v, utag.n, utag.c);,例程9-3: 某单位有3名职工参加计算机办公应用技能考试。设每个人的数据包括考号、姓名、年龄、和成绩。单位规定年龄为25岁以下的职工进行笔试,成绩为百分制,60分以上为及格。而25岁以上的职工进行操作考试,考试成绩为A、B、C 、D,C级以上为及格。请统计考试及格的人数,并输出每位考生考试的成绩。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1