第09章复杂数据类型.ppt
《第09章复杂数据类型.ppt》由会员分享,可在线阅读,更多相关《第09章复杂数据类型.ppt(57页珍藏版)》请在三一办公上搜索。
1、,只能定义单一的数据类型,反映事物单一属性,第9章:复杂数据类型,学习的意义,如定义学生成绩:float score;,能定义复杂的数据类型,反映事物多个属性,如定义学生信息:struct STU char no9;/学号 char name12;/姓名 char sex;/性别 float score;/成绩 student;,复杂数据类型丰富了C语言对数据信息的处理能力。离开了复杂数据类型,很多信息的描述是无法进行定义,更无法进行处理的。计算机中的信息表示更多是由复杂数据类型来定义的,象数据结构课程中的链表、树、图等 可以更好地理解数据库中的记录的含义,为C+语言中类的概念的理解提供了帮助
2、。,9.1 结构体,结构体是一种构造数据类型 用途:把不同类型的数据组合成一个整体-自定义数据类型 引入结构体的好处:加强数据项之间的联系,如学生的基本信息,包括学号、姓名、性别、年龄、班级、成绩等数据项。这些数据项描述了一个学生的几个不同侧面。,独立的变量表示:,结构体变量表示:,char no9;/学号char name20;/姓名char sex;/性别unsigned int age;/年龄unsigned int classno;/班级float grade;/成绩,1、结构体类型的定义,struct 结构体类型名 数据类型名1 成员名1;数据类型名2 成员名2;数据类型名n 成员名
3、n;,struct是关键字,不能省略,合法标识符可省:无名结构体,成员类型可以是基本型或构造型,以分号;结尾,例1:struct Student_Info char no9;/学号 char name20;/姓名 char sex;/性别 unsigned int age;/年龄 unsigned int classno;/班级 float grade;/成绩;,例2:struct Date int year;/年 int month;/月 int day;/日;,在结构体中数据类型相同的成员,既可逐个、逐行分别定义,也可合并成一行定义,就象一次定义多个变量一样。,struct Student
4、_Info char no9;/学号 char name20;/姓名 char sex;/性别 unsigned int age;/年龄 unsigned int classno;/班级 float grade;/成绩;,struct Student_Info char no9,name20,sex;unsigned int age,classno;float grade;,struct Date int year;/年 int month;/月 int day;/日;,struct Date int year,month,day;,注意:结构类型只是用户自定义的一种数据类型,用来定义描述结构
5、的组织形式,不分配内存,只有用它来定义某个变量时,才会为该变量分配结构类型所需要大小的内存单元。所占内存的大小是它所包含的成员所占内存大小之和。,2、结构体变量的定义和引用,struct 结构体类型名 数据类型名1 成员名1;数据类型名n 成员名n;struct 结构体类型名 变量名列表;,结构体变量的定义,间接定义法:先定义结构类型,再定义结构变量,struct student;,struct Student_Info student1,student2;,一次定义多个结构体类型变量,定义指向结构体类型的指针变量,struct Student_Info*pstu;,间接定义法中几种错误的结构
6、体变量的定义方法,没有结构体类型名,Student_Info student;,缺省struct关键字,struct Point p;struct Point int x,y;,结构类型Point定义在后,2、结构体变量的定义和引用,struct 结构体类型名 数据类型名1 成员名1;数据类型名n 成员名n;变量名列表;,结构体变量的定义,直接定义法:定义结构体类型的同时定义结构体变量,struct Student_Info char no9;/学号 char name20;/姓名 char sex;/性别 unsigned int age;/年龄 unsigned int classno;/
7、班级 float grade;/成绩 student1,student2;,struct char no9;/学号 char name20;/姓名 char sex;/性别 unsigned int age;/年龄 unsigned int classno;/班级 float grade;/成绩 student1,student2;,或,无名结构体定义,变量只能一次,几点说明:,(1)结构体类型与结构体变量概念不同 类型:不分配内存;变量:分配内存 类型:不能赋值、存取、运算;变量:可以,(2)结构体可以嵌套,struct Point int x,y;struct Img int tag;st
8、ruct Img*pimg;/正确,可以包含自身类型的指针 struct Img img;/错误,不能包含自身类型的变量;,(3)结构类型中的成员名,可以与程序中的变量同名,它们代表不同的对象,互不干扰,struct Student_Info student;char name20;,(4)结构体类型及变量的作用域和生存期与基本类型变量相同,结构体变量的引用,引用规则,结构体变量不能整体引用,只能引用变量成员,引用方式:,结构体变量名.成员名/非指针型结构体变量的引用,可以将一个结构体变量赋值给另一个结构体变量,结构体嵌套时逐级引用,结构体指针-成员名 或(*结构体指针).成员名/指针型结构体
9、变量的引用,成员(分量)运算符结合性:从左向右,成员(分量)运算符结合性:从左向右,结构体变量名.成员名.子成员名最低级子成员名,注意:在利用指针引用结构体成员时,-和之间不能有空格。,3、结构体变量的赋值,结构体变量初始化赋值,先定义结构体类型,再定义结构体变量时赋初值,注意:赋初值时,中间的数据顺序必须与结构体成员的定义顺序一致,否则就会出现混乱。,struct Student_Info stu=20020306,ZhangMing,M,18,1,90;,struct Student_Info stu=18,ZhangMing,M,20020306,1,90;,3、结构体变量的赋值,结构体
10、变量初始化赋值,定义结构体类型的同时,定义结构体变量并赋初值,struct Date int year,month,day;birthday=1986,12,10;,struct int year,month,day;birthday=1986,12,10;,或,struct Student_Info char no9;/学号 char name20;/姓名 char sex;/性别 unsigned int age;/年龄 unsigned int classno;/班级 float grade;/成绩 student=20020306,ZhangMing,M,18,1,90;,strcpy
11、(stu1.no,stu.no);strcpy(stu1.name,stu.name);stu1.sex=stu.sex;stu1.age=stu.age;stu1.classno=stu.classno;stu1.grade=stu.grade;,struct Student_Info stu;strcpy(stu.no,20020306);strcpy(stu.name,ZhangMing);stu.sex=M;stu.age=18;stu.classno=1;stu.grade=90;struct Student_Info stu1;stu1=stu;,3、结构体变量的赋值,结构体变量在
12、程序中赋值,如果在定义结构体变量时并未对其赋初始值,那么在程序中要对它赋值的话,就只能一个一个地对其成员逐一赋值,或者用已赋值的同类型的结构体变量对它赋值,memcpy(,【例】计算学生5门课的平均成绩,最高分和最低分。,#include struct score float grade5;float avegrade,maxgrade,mingrade;void main()int i;struct score m;printf(input the grade of five course:n);for(i=0;i 5;i+)/输入5门课的成绩 scanf(%f,m.avegrade=0;m
13、.maxgrade=m.grade0;m.mingrade=m.grade0;for(i=0;i m.maxgrade)?m.gradei:m.maxgrade;m.mingrade=(m.gradei m.mingrade)?m.gradei:m.mingrade;m.avegrade/=5;printf(avegrade=%5.1f maxgrade=%5.1f mingrade=%5.1fn,m.avegrade,m.maxgrade,m.mingrade);,运行结果(设5门课的成绩为:75 80 86 90 68):avegrade=79.8 maxgrade=90.0 mingra
14、de=68.0,&m.gradei,注:.和 同优先级,具有左结合性,高于&的优先级,4、简化结构体类型名,利用typedef语句为结构体类型起别名,这样可使定义结构体类型的变量显得更为简洁,同时也增加程序的易读性。,typedef语句的格式为:,typedef 类型名 类型名的别名;,必须是已经定义的数据类型名或C语言提供的基本类型名,必须是合法的标识符,通常用大写字母来表示,必须以分号结尾,typedef int INTEGER;/INTEGER是别名typedef char*STRING/STRING是别名struct teacher_info char name20,char sex,
15、unit30;unsigned int age,workyears;float salary;typedef struct teacher_info TEACHER;/TEACHER是别名INTEGER a;/相当于int a;STRING str;/相当于char*str;TEACHER t;/相当于struct teacher_info t;,typedef char ARRAY81;/ARRAY是别名ARRAY str;/相当于char str81;,5、结构体数组,结构体数组的每一个元素都是具有相同结构体类型的下标结构变量。,结构体数组的定义,三种形式:,形式一:struct Stud
16、ent_Info char no9,name20,sex;unsigned int age,classno;float grade;struct Student_Info stu10;,形式二:struct Student_Info char no9,name20,sex;unsigned int age,classno;float grade;stu10;,形式三:struct char no9,name20,sex;unsigned int age,classno;float grade;stu10;,结构体数组与二维表的对应关系,结构体数组就相当于一张二维表,一个表的框架对应的就是某种结
17、构体类型,表中的每一列对应该结构体的成员,表中每一行信息对应该结构体数组元素各成员的具体值,表中的行数对应结构体数组的大小。,结构体类型Student_Info,struct Student_Info char no9;char name20;char sex;unsigned int age;unsigned int classno;float grade;stu10;,结构体数组的初始化,初始化的格式为:,struct 结构体类型名;struct 结构体类型名 结构体数组size=初值表1,初值表n;,struct 结构体类型名 结构体数组size=初值表1,初值表2,初值表n;,或,结构
18、体数组的引用,引用格式为:,结构体数组名下标.成员名;,struct Student_Info char no9;char name20;char sex;unsigned int age;unsigned int classno;float grade;stu10;,strcpy(stu0.name,WangFei);,stu1.grade+;,printf(%s,stu0.name);,【例】统计侯选人选票。,#include#include struct person char name20;/候选人姓名 int count;/得票数 leader3=Li,0,Zhang,0,Wang,
19、0;,void main()int i,j;char leader_name20;while(1)/统计候选人得票数 scanf(%s,leader_name);/输入候选人姓名 if(strcmp(leader_name,0)=0)/输入为0结束 break;for(j=0;j 3;j+)/比较是否为合法候选人 if(strcmp(leader_name,leaderj.name)=0)/合法 leaderj.count+;/得票数加1 for(i=0;i 3;i+)/显示后选人得票数 printf(%5s:%dn,leaderi.name,leaderi.count);,9.3 线性链表,
20、1、线性链表概述及其结构,线性表:当一组数据元素形成了“前后”关系时,我们称之为线性表,线性表在内存中的两种形式,顺序表:以数组的形式存放,元素在内存中是连续存放的,线性链表:数据元素在内存中不需要连续存放,而是通过指针将各数据单元链接起来,就象一条“链子”一样将数据单元前后元素链接起来,特点:插入或删除一个数据元素时,需要移动其它数据元素,特点:插入或删除一个数据元素时,不需要移动其它数据元素,节点,实际数据链表,头节点,表示NULL,数据域,指针域,线性链表中的节点可以用一个结构体类型来定义,其形式为:,struct 节点结构体类型名 数据成员定义;struct 节点结构体类型名*指针变量
21、名;;,例:struct Grade_Info int score;struct Grade_Info*next;typedef struct Grade_Info NODE;,2、线性链表的基本操作,基本操作有:创建、插入、删除、输出和销毁等。,链表的创建操作,含义:从无到有地建立起一个链表,即往空链表中依次插入若干结点,并保持结点之间的前驱和后继关系。,基本思想:首先创建一个头节点,让头指针head和尾指针tail都指向该节点,并设置该节点的指针域为NULL(链尾标志);然后为实际数据创建一个节点,用指针pnew指向它,并将实际数据放在该节点的数据域,其指针域置为NULL;最后将该节点插入
22、到tail所指向节点的后面,同时使tail指向pnew所指向的节点。,【例】链表创建操作函数Create_LinkList。,NODE*Create_LinkList()/创建链表 NODE*head,*tail,*pnew;int scor;head=(NODE*)malloc(sizeof(NODE);/创建头节点 if(head=NULL)/创建失败,则返回 printf(no enough memory!n);return(NULL);head-next=NULL;/头节点的指针域置NULL tail=head;/开始时尾指针指向头节点,pnew-score=score;pnew-ne
23、xt=NULL;tail-next=pnew;tail=pnew;return(head);,【例】链表创建操作函数Create_LinkList。,input the score of students:,70,70,65,65,78,78,90,95,-1,printf(input the score of students:n);while(1)/创建学生成绩线性链表 scanf(%d,2、线性链表的基本操作,链表的插入操作,含义:在第i个结点Ni与第i+1节点Ni+1之间插入一个新的结点N,使线性表的长度增1,且Ni与Ni+1的逻辑关系发生如下变化:插入前,Ni是Ni+1的前驱,Ni+
24、1是Ni的后继;插入后,新插入的结点N成为Ni的后继、Ni+1的前驱,基本思想:通过单链表的头指针head,首先找到链表的第一个结点;然后顺着结点的指针域找到第i个结点,最后将pnew指向的新结点插入到第i个结点之后。插入时首先将新节点的指针域指向第i个结点的后继节点,然后再将第i个结点的指针域指向新节点。注意顺序不可颠倒。当i=0时,表示头节点。,【例】链表插入操作函数Insert_LinkList。,void Insert_LinkList(NODE*head,NODE*pnew,int i)NODE*p;int j;p=head;for(j=0;j next;if(p=NULL)/表明链
25、表中第i个节点不存在 printf(the%d node not foundt!n,i);return;pnew-next=p-next;/将插入节点的指针域指向第i个节点的后继节点 p-next=pnew;/将第i个节点的指针域指向插入节点,假设i=2,2、线性链表的基本操作,链表的删除操作,含义:删除链表中的第i个结点Ni,使线性表的长度减1。删除前,节点Ni-1是Ni的前驱,Ni+1是Ni的后继;删除后,结点Ni+1成为Ni-1的后继。,基本思想:通过单链表的头指针head,首先找到链表中指向第i个结点的前驱节点的指针p和指向第i个节点的指针q;然后删除第i个结点。删除时只需执行p-ne
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 09 复杂 数据类型
链接地址:https://www.31ppt.com/p-5637256.html