北京科技大学C语言第7章PPT.ppt
《北京科技大学C语言第7章PPT.ppt》由会员分享,可在线阅读,更多相关《北京科技大学C语言第7章PPT.ppt(86页珍藏版)》请在三一办公上搜索。
1、1,第7章 其他自定义数据类型,北京科技大学 计算机系,C 语言程序设计,2023/9/5,2,第7章 结构体与共用体,主要内容7.1 构造数据类型概述7.2 结构体类型7.3 共用体类型7.4 枚举类型7.5 类型重命名7.6 案例分析,2023/9/5,3,一个学生的信息有学号、姓名、性别、年龄、住址、成绩等。一本图书的信息有分类编号、书名、作者、出版社、出版日期、价格、库存量等。如何描述这些类型不同的相关数据?,7.1 构造数据类型概述,?,信息管理,结构体一种构造类型数据 结构体由若干不同类型的数据项组成,构成结构体的各个数据项称为结构体成员。,2023/9/5,4,struct 结构
2、体名 数据类型1 成员名1;数据类型2 成员名2;数据类型n 成员名n;,7.2 结构体类型,7.2.1 结构体与结构体类型的定义,结构体类型定义的一般形式:,struct为关键字;结构体名是用户定义的类型标识。中是组成该结构体的成员。成员的数据类型可以是C语言所允许的任何数据类型。,2023/9/5,5,例如图书类型的定义:struct bookcard char num10;/*图书分类编号是字符数组类型*/char name30;/*书名是字符数组类型*/char author30;/*作者是字符数组类型*/char publisher60;/*出版社是字符数组类型*/float pri
3、ce;/*价格是单精度实型*/int n;/*库存量是整型*/;,7.2 结构体类型,7.2.1 结构体与结构体类型的定义,2023/9/5,6,例如学生类型的定义:struct student char num8;/*学号是字符数组类型*/char name30;/*姓名是字符数组类型*/char sex;/*性别是字符型*/int age;/*年龄是整型*/char addr60;/*住址是字符数组类型*/int score6;/*成绩是整型数组类型*/;,7.2 结构体类型,7.2.1 结构体与结构体类型的定义,2023/9/5,7,7.2 结构体类型,7.2.2 结构体变量的定义、引用
4、与初始化,1.结构体类型变量的定义,利用已定义的结构体类型名定义变量 struct 结构体名 变量名表;例如:struct bookcard book1100;struct student s30,t1,t2;,结构体变量的各个成员在内存中占用连续存储区域,结构体变量所占内存大小为结构体中每个成员所占用内存的长度之和。,2023/9/5,8,类型与变量是不同的概念。应先定义一个结构体类型,而后再定义结构体变量。系统对类型不分配空间,仅对变量分配空间。只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算。,成员也可以是结构体变量。,对结构中的成员,可以单独使用,它的作用与地位相当于普通变
5、量。成员名可与程序中的变量名相同时,也可与不同结构体类型的成员名相同,二者代表不同的对象。,struct date int year,month,day;struct student char num8;char name30;char sex;struct date birthday;/*成员为结构体类型*/char addr60;int score6;,7.2 结构体类型,结构体类型与变量的说明,2023/9/5,9,7.2.2 结构体变量的定义、引用与初始化,1.结构体类型变量的定义,在定义结构体类型的同时定义变量,例如:struct student char num8,name20,s
6、ex;int age;float score;st30;,struct 结构体名 成员定义表;变量名表;,2023/9/5,10,1.结构体类型变量的定义,直接定义结构体类型变量,例如:struct char num8,name20,sex;int age;float score;st30,a,b,c;,struct 成员定义表;变量名表;,7.2.2结构体变量的定义、引用与初始化,2023/9/5,11,2.结构体变量的初始化,【例7-4】结构体变量的初始化。struct date int year,month,day;struct student char num8,name20,sex;
7、struct date birthday;float score;a=“40826011,Li ming,M,1991,2,9,87.5,b=“40826025,Zhang qiang,F,1990,5,12,85,c;,如果初值个数少于结构体成员个数,则将无初值对应的成员赋以0值。如果初值个数多于结构体成员个数,则编译出错。,7.2.2结构体变量的定义、引用与初始化,2023/9/5,12,2.结构体变量的初始化,【例7-5】结构体数组的初始化。struct s char num8,name20,sex;float score;stu3=“40826011,Li ming,M,87.5,“4
8、0826025,Zhang qiang,F,85,“40826032,Wang xinping,F,90;,元素的个数可以省略,根据赋初值时结构体常量的个数确定数组元素的个数,7.2.2结构体变量的定义、引用与初始化,2023/9/5,13,3.结构体变量的运算,用sizeof运算符计算结构体变量所占内存空间,struct date int year,month,day;struct student char num8,name20,sex;struct date birthday;float score;a;,sizeof(a)的结果为8+20+1+12+4=45 sizeof(struct
9、 student)的结果为45,7.2.2结构体变量的定义、引用与初始化,2023/9/5,14,3.结构体变量的运算,同类型结构体变量之间的赋值运算,结构体变量之间进行赋值时,系统将按成员一一对应赋值。,struct date int year,month,day;struct student char num8,name20,sex;struct date birthday;float score;a=“40826011,Li ming,M,1977,12,9,87.5,b,c;c=a;,7.2.2结构体变量的定义、引用与初始化,2023/9/5,15,3.结构体变量的运算,对结构体变量进
10、行取址运算,struct date int year,month,day;struct student char num8,name20,sex;struct date birthday;float score;a;,对结构体变量a进行&a 运算,可以得到a的首地址,它是结构体类型指针。,7.2.2结构体变量的定义、引用与初始化,2023/9/5,16,4.结构体变量成员的引用,结构体变量成员引用的一般形式:结构体变量名.成员名,结构体变量a的各成员可分别表示为a.num、a.name、a.sex、a.birthday、a.score,struct date int year,month,da
11、y;struct student char num8,name20,sex;struct date birthday;float score;a;,“.”是分量运算符,运算级别最高。,a.birthday.yeara.birthday.montha.birthday.day,结构体变量的各个成员可进行何种运算,由该成员的数据类型决定,7.2.2结构体变量的定义、引用与初始化,2023/9/5,17,【例7-6】编写一个统计选票的程序。struct candidate char name20;/*name为候选人姓名*/int count;/*count为候选人得票数*/list=invalid
12、,0,Zhang,0,“Wang,0,“Li,0,“Zhao,0,“Liu,0;,7.2.2结构体变量的定义、引用与初始化,2023/9/5,18,main()int i,n;printf(Enter voten);scanf(%d,/*输入所投候选人编号*/,7.2.2结构体变量的定义、引用与初始化,2023/9/5,19,for(i=1;i=5;i+)printf(%s:%dn,listi.name,listi.count);printf(%s:%dn,list0.name,list0.count);,7.2.2结构体变量的定义、引用与初始化,2023/9/5,20,7.2 结构体类型,1
13、.结构体指针变量的定义,结构体指针变量定义的一般形式:struct 结构体名*指针变量名;,struct date int year,month,day;*q;,例如:struct student*p;,p是指向struct student结构体变量的指针变量,7.2.3 结构体的指针,2023/9/5,21,7.2.3 结构体的指针,2.结构体成员的三种引用形式,用结构体变量名的引用形式:d.year d.month d.day,struct date int year,month,day;d,*p=,用结构体指针变量的引用形式:(*p).year(*p).month(*p).day p-y
14、ear p-month p-day,“-”是指向结构体成员运算符,优先级为一级,p=&d.year,2023/9/5,22,【例】输入今天的日期,然后输出该日期。main()struct date/*在函数中定义结构体类型*/int year,month,day;today,*p=,7.2.3 结构体的指针,Enter today date(YYYY/MM/DD):2006/06/23Today:2006/6/23,2023/9/5,23,3.指向结构体数组的指针,【例7-7】利用结构体指针输出一组化学 元素名称及其原子量。struct list int i;char name4;float
15、w;tab4=1,H,1.008,2,He,4.0026,3,Li,6.941,4,Be,9.01218;,7.2.3 结构体的指针,2023/9/5,24,3.指向结构体数组的指针,main()struct list*p;printf(NotNametAtomic Weightn);for(p=tab;pi,p-name,p-w);,No Name Atomic Weight,1 H 1.008,2 He 4.0026,3 Li 6.941,4 Be 9.01218,7.2.3 结构体的指针,2023/9/5,25,【例7-8】分析自增自减运算对程序结果的影响。struct code int
16、 i;char ch;a=1000,E,2000,F,3000,G,4000,H;(接后面),7.2.3 结构体的指针,2023/9/5,26,main()struct code*p=a;printf(%dt,+p-i);printf(%ct,(+p)-ch);printf(%dt,(p+)-i);printf(%ct,+p-ch);printf(%dt,p-i+);printf(%dn,p-i);,p,1001,H,3001,1001,F,2000,H,3000,3001,7.2.3 结构体的指针,2023/9/5,27,7.2 结构体类型,7.2.4链表结构体的应用,链表中每个元素称为一个
17、结点。构成链表的结点必须是结构体类型数据。,1.链表的基本结构,head 1782 2008 3246 1085 5736图7-2 动态单向链表示意图,相邻结点的地址不一定是连续的,依靠指针将 它们连接起来。,struct nodechar c;struct node*next;,2023/9/5,28,C语言提供了相关的存储管理库函数。这里仅介绍其中三个,它们的原型说明在“stdlib.h”头文件和“alloc.h”头文件中,使用这三个函数时,应选择其中一个头文件包含到源程序中。,动态分配存储区函数malloc()函数原型:void*malloc(unsigned size);调用格式:ma
18、lloc(size)功能:在内存分配一个size字节的存储区。调用 结果为新分配的存储区的首地址,是一个void 类型指针。若分配失败,则返回NULL(即0)。,7.2.4 链表,2.动态分配和释放存储单元,在ANSI C标准中,关键字void有两种用法。第一种用法,可将无返回值的函数定义为void类型第二种用法,用void*定义指针,这是一个指向非具体数据类型的指针,称为无类型指针。,2023/9/5,29,【例7-9】调用malloc函数分配所需存储单元。#include#include main()struct st int n;struct st*next;*p;p=(struct s
19、t*)malloc(sizeof(struct st);p-n=5;p-next=NULL;printf(p-n=%dtp-next=%xn,p-n,p-next);,将函数返回值转换成结构体指针,7.2.4 链表,p-n=5 p-next=0,2023/9/5,30,动态分配存储区函数calloc()函数原型:void*calloc(unsigned int n,unsigned int size);调用格式:calloc(n,size)功能:在内存分配一个n倍size字节的存储区。调用结果为新分配的存储区的首地址,是一个void类型指针。若分配失败,则返回NULL(即0)。,2.动态分配和
20、释放存储单元,7.2.4 链表,2023/9/5,31,【例7-10】调用calloc函数分配所需存储单元。#include main()int i,*ip;ip=(int*)calloc(10,4);for(i=0;i10;i+)scanf(%d,ip+i);for(i=0;i10;i+)printf(%d,*(ip+i);printf(n);,动态分配了10个存放整型数据的存储单元,7.2.4 链表,2023/9/5,32,释放动态分配存储区函数free()函数原型:void free(void*p);,2.动态分配和释放存储单元,此函数无返回值,实参必须是一个指向动态分配存储区的指针,它
21、可以是任何类型的指针变量。,调用格式:free(p)功能:释放p所指向的动态分配的存储区。,7.2.4 链表,2023/9/5,33,建立链表就是根据需要一个一个地开辟新结点,在结点中存放数据并建立结点之间的链接关系。,【例7-11】建立一个学生电话簿的单向链表函数。,3.建立单向链表,7.2.4 链表,2023/9/5,34,#include#include#include#define NEW(struct node*)malloc(sizeof(struct node)struct node char name20,tel9;struct node*next;,7.2.4 链表,2023
22、/9/5,35,struct node*create()static struct node*h;struct node*p,*q;char name20;h=NULL;printf(name:);gets(name);while(strlen(name)!=0)/*当输入的姓名不是空串循环*/p=NEW;/*开辟新结点*/if(p=NULL)/*p为NULL,新结点分配失败*/printf(Allocation failuren);exit(0);/*结束程序运行*/,7.2.4 链表,2023/9/5,36,strcpy(p-name,name);/*为新结点中的成员赋值*/printf(
23、tel:);gets(p-tel);p-next=NULL;if(h=NULL)/*h为空,表示新结点为第一个结点*/h=p;/*头指针指向第一个结点*/else/*h不为空*/q-next=p;/*新结点与尾结点相连接*/q=p;/*使q指向新的尾结点*/printf(name:);gets(name);return h;,7.2.4 链表,main()struct node*head;head=create();,2023/9/5,37,【例7-12】输出学生电话簿链表函数。,4.输出单向链表中各结点信息,7.2.4 链表,2023/9/5,38,#include#include#incl
24、ude#define NEW(struct node*)malloc(sizeof(struct node)struct node char name20,tel9;struct node*next;,void prlist(struct node*head)struct node*p;p=head;while(p!=NULL)printf(%st%sn,p-name,p-tel);p=p-next;,main()struct node*head;head=create();prlist(head);,2023/9/5,39,在链表中,如果要删除第i个结点,一般是将第(i-1)个结点直接与第(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 北京科技大学 语言 PPT

链接地址:https://www.31ppt.com/p-5932640.html