复合数据类型(共38张PPT)_第1页
复合数据类型(共38张PPT)_第2页
复合数据类型(共38张PPT)_第3页
复合数据类型(共38张PPT)_第4页
复合数据类型(共38张PPT)_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第7章复合数据类型和类型定义结

型联

型枚

型类

义7.1

结构类型(复习引入)现实生活中,每个事物都有若干个属性,且

。例如,学生成绩登记表,表中每个学生都有学号、姓名、总分和名次等属性。其中学号用长整型表示;姓名用字符串表示;总分用浮点数表示;名次用整数表示。对于这样的数据形式,可以用结构体类型

来描述。7.1

结构定义、引用和初始化一

结构类型定义的一般形式:

P229struct

结构标识符{数据类型成员名1;数据类型成员名2;数据类型成员名n;};其中:struct是关键字,结构标识符和各成员由用户自行命名;关键字

struct连同其后的结构标识符一起称为结构类型名或结构名;各成

员的定义语句放在花括号中构成复合语句,花括号后面的分号是

整个定义语句的结尾。用

把、不、同类型

——构造出新的数据类型structaccount{

longid;charname[20];structdate

Date;dateyear;month;day;struct{

intint

int例如定义一个日期的结构体类型:例

:float

money;struct

stuchar

num[5],

name[10],int

age;float

score;char

speciality[20];};结构类型定义挡远结构的组织形式,确见了该类型的内存分

配模式,但不分配内存!二

、结构类型存储模式:

P230例sex;内存分配模式说明:P230●

结构体成员的类型可以是简单类型、数组类型或者是结构体类

型●

结构体类型的定义只是描述结构体的组织形式,并没

有分配一段内存单元来存放各数据项规员。只有定义

了这种类型的变量,系统才为变量分配内存空间,

占据存储单元。●

结构体类型定义可以在函数的内部,其作用域仅限于该函数内部;也可以定义在函数的外部,其作用域是从定义处开始到本文件结束

。●

在定义结构体类型时,数据类型相同的成员可以在

一行中说明,成员间用逗号分开。三、

结构体类型变量、结构数组和结构指针的定义:

P231某个结构体类型一经定义

就可以指明该种结构体的具体对象,即定义该种类型的

。定

:●

先定义结构体类型,再定义该种类型的变

。●

在定义结构体类型的同时定义结构体变量。●

直接定义结构体类型变量。1、

结构类型的作用域应用该类型定义变量或应用该类型变量的有效位置(1)局部结构类型的作用域函数名(

)struct

stul局部结构类型作用域从定义处至该函数结束从定义处开始,直到其所在源程序文件结束。{.…};函数名(){

……(2)全局结构类型的作用域全局结构类型作用域struct

stu2三、

结构变量、结构数组、结构指针的定义(1)先定义结构类型,再进行变量定义一般形式

struct

结构

名成员列表};struct

结构名

变量名表列;struct

student

define

STUDENT

struct

student{

int

num;char

name[20

{

int

num;char

sex;

char

name[20];char

sex;int

age;

int

age;};

};struct

student

s

STUDENT

st1,s[5],*p;STUDENTdefine

STUDENT

structSTUDENTint

num;char

name[20];char

sex;int

age;};STUDENT

st1,s[5],*p;思考:结构指针p所占空间大小是多少个字节?4

节结构数组s[5]的内存分配形式为:1ullnaimeSeXagenu1lnaineSeXagestudent29B(2)定义结构类型的同时定义变量一般形式:struct

结构名成员列表表列;struct

student{

int

num;char

name[20];char

sex;int

age;}stul,stu2[2],*p;例变量名表列;例

struct{

int

num;char

name[20];char

sex;int

age;}st1,s[5],*p;(

3

)

量一

:struct成员列表用无名结构直接定义

变量只能一次。注意:这

略了结构体名,因此

以后不能用它再来

。说

:结构体变量的定义在函数的数据说明部分进行,也可以在函数的外部定义。但都必须是类型定义在前,变量定义在

。结构体变量一经定义,在程序运行时,系统将按照结

定的存储单元。一个结构体变量在内存中占用存储空间的实际字节数,就

,可以利用sizeof

运算符求出一个结构体类型数据的长度。(4)嵌套结构定义(a)

当结构类型的成员属于一复杂类型时,称该结构类型为嵌套结构。(b)

嵌套结构有以下两种形式:例

struct

date{

int

month;int

day;例

struct

studentint

num;char

name[20];structdate

{

int

month;int

day;int

year;}birthday;}stu;numnamebirthdamonthdayyearchar

name[20];struct

date

birthday;

}stu;int

year;

};struct

student{

int

num;(5)

化结构体类型变量在定义时也可以直接对其进行初始化。可以在主程序中定义并直接初始化结构体变量。P237【例7.2】一个汽车档案中包括汽车的编号、颜色和型号。输入一个

汽车编号,由find()函数进行查找,根据查找结果输出查找到汽车的

信息。#include

<stdio.h>struct

sample{

int

num;char

color;char

type;}

car[]={

101,'G','c',210,'Y','m',105,'R',T,220,'B','s',308,'W','b',0,\0',^\0'};、结构成员的访问一

引用结构体变量的成员项:一般情况下对结构体变量的使用,是用结构体的各个成

。引用结构体变量中的成员项的形式为:结

.

名例

2

0

2

1

5

1

2

给struct

date型

量Date

l

可表示成:Date1.

year=2021;Date1.

month=5;Date1.

day=12;说

:“.

”是一个运算符,表示对结构体变量的成员进行访问运算,它的优先级为最高级,结合方向是从

左到右。结构体成员项是结构体中的一个数据,对其进行何种运算是由它的类型决定,

允许参加运算的种类与同类型的简单变量的种类相同。如

量则要通过两个“.”运算符来访问该结构成员的结构成员。如

:wang=zhang;注意:不

组常

体变量。如下面的赋值语句是不合法的:二、

一个结构体变量作为一个整体来引用。C语言允许两个相同类型的结构体变量之间相互赋值,这

成员项的值赋给另一个结构体变量的相应部分。wang=【例7.1x】

结构变量的初始化struct

studentchar

number[5],*name;char

sex;struct

date{

int

year;

int

month;

int

day;}birthday;

float

score;char

speciality[11];char

school[31];};main()s

truct

student

st1={'1001","Liming",'0',1983,10,25,573,"Computer","3th

High

School,Beijing"'};三

针(1)、结构体数组:当数组中的元素是结构体类型的

就构成了结构体数组。结构体数组是具有相同结

。(2)、结构体指针指

构体

构体

的指针或结构体指针

。访

变量

的成员可以采用以下两种方法:方法1:(*结构体指针名入成员项名方法2:

结构体指针名->成员页名struct

student

s[5];例如:

(*s).name,

(*s).sex,

(*s).age或

s->name,

(s+1)->sex,

s[2].

segstruct

student

s[5],*p=s;例如:

(*p).name,

(*p).sex,

(*p).age或者

p->name,

Ip->sex,

p->sex7.13结构变量、结构数组的赋值、输入和输出

7.14结构类型数据在函数间的传递(1)P236

【例7.1】结构变量的赋值、输入和输出(2)结构体数组的赋值、输入和输出P241

【例7.6】建立一个小通讯录:input()用于输入通讯

录数据,

display()用于输出通讯录,主程序通过结构

数组名调用input()和display(。P241

【例7.6】建立一个小通讯录:

input()用于输入通讯录数据,display()用于输出通讯录,主程序通过结构数组名调用

input()和displayO。#include

<stdio.h>#define

MAX10struct

telephone{char

name[20];

char

mobile[12];

char

phone[12];};input(struct

telephone

*p){int

i;for(i=0;i<MAX;i++){printf("Name?");gets(p->name);if

(p->name[0]==^\0')

return(i);/*提前结束输入*printf("Mobile?");scanf("%*c%s",p->mobile);printf("Telephone?");scanf("%*c%s%*c",p->phone);};return

MAX;}void

display(struct

telephone

*p,int

n){

int

i;for(i=0;i<n;i++,p++)printf("%-20s%-

12s%-

12s\n",p->name,p->mobile,p->phone);main(){struct

telephonetx[MAX];

int

n;n=input(tx);display(tx,n);/*输出通讯录*/一、

返回值方式被调用函数可以通过返回一个结构变量或一个结构指

针的方式向调用函数传递结构型数据。返回结构变量

的函数称为结构型函数,属于基本类型函数;返回结

构指针的函数称为结构指针型函数,属于指针型函数o①

结构型函数说明或定义结构型函数的一般形式为:struct

结构标识符函数名(形参表)例如,struct

student

function(int

x,int

y){......}就定义了一个struct

student结构类型的函数,它可以将一个

结构变量返回到调用函数。②

结构指针型函数说明或定义结构指针型函数的一般形式为:struct结构名*函数名(形参表)例如,struct

student

*function(int

x,int

y){

......}定义了一个结构指针型函数function(),它可以将一

个结构指针返回到调用函数。结构类型数据在函数间的传递1、用结构变量的成员作参数—

值传递2

、用指向结构变量或数组的指针作参数—

地址传递3

、用结构变量作参数--多值传递(效率低)小结结构体声明及结构体类型变量的定义、初始化(a)结构体类型的定义形式注意的问题:①

每个成员都必须有自己的数据类型,位置上连续同类型的结构成员可

以出现在一条语句中,并共用同一个类型关键字。②

结构类型的成员可以是基本数据类型的变量、数组或指针,也可以是已定义

结构类型的变量、数组或指针。③

结构成员可以和程序中其他标识符同名,也可以和另一个结构的成员同名。④

结构类型定义的位置,可以在函数内部,也可以在函数外部。在

函数内部定义的结构类型,只能在函数内部使用。在函数外部定

义的结构类型,其有效范围是从定义处开始,直到它所在的源程

序文件结束。(b)结构体变量的说明——三种方法。(c)结构体变量的初始化小结结构体变量成员的引用(a)同一类型的结构体变量可相互赋值(b)引用结构体成员(在无嵌套的情况下,访问结构成员的方法)若已定义了一个结构变量及指向它的指针,可以用以下三种形式访

问该结构变量的成员:①结构变量名.成员名、②结构指针名->成员名、③(*结构指针名

).成员名(c)结构体变量的赋值、输入和输出(d)结构数组的赋值、输入和输出

(e)结构类型数据在函数间的传递用递归结构处理链表1.递归结构如果一个结构类型的某些成员是该结构类型的变量、数

组或指针,称之为递归结构,也叫自嵌套结构。使用最

多的递归结构是:结构的一个成员是指同本结构类型的指针。例如:struct

node{int

data;struct

node

*next;这种递归结构在处理诸如链表这样数据结构时特别有用2.链表的概念链表是一种很有用的动态数据结构,单向链表是一种最简单

的链表,它由若干个节点首尾相接而成,每个节点有两个域

:数据域data存放数据,指针域next存放下一节点的首地

址。链头指针

节点1

节点2

节点3

链尾单向链表中的节点可用如下递归结构来描述:struct

node{

int

data;struct

node

*next;};通过指针将各个节点链接起来,就构成单向链表。headdatanextdata

data

datanext

nextNLL3.动态链表的基本操作动态链表的特点是各节点所需要的存储空间是用动态内存分

配的方式获得的,每个节点都没有名字,对链表的操作只

能通过指针进行。动态链表的主要操作包括建立链表、删

除节点、插入节点和链表的输出。①

建立链表建立链表的过程是先建立链表的头节点,并将该头节点作为尾节点,然后不断增加新节点,将新增的节点连接

在当前尾节点的后面而作为新的尾节点。为此,需要设

置三个指针,

h指向链表的头节点,

p指向新建节点,q

指向

尾节点。hdata

next

data

nextTp

(新建节点)建立链表的算法(1)通过动态内存分配申请一段存储空间存放头节点,将该存储空

间的起始地址存放在指针h中,且其数据域和指针域均为空并使p

和q同时指向头节点,表示该节点既是头节点、也

是当前节点、又是尾节点;(2)输入一个数a;(3)若a为0,则进入⑥;否则,进入④;(4),再申请一段空间存放下一个新建节点,起始地址存放在指

针p中,称之为p节点。将数a存入p节点的data域,并将p节点

的首地址存入q节点的next域,这样,p节点就被链接在q节

点之后。再通过将首地址p存入指针q使新建节点成为新的

尾节点。(5)继续输入下一个数a,

返回③;(6)结束循环,并在尾节点的next域放入NULL,

作为链表结束的标记;(7)将链表的头指针h返回调用函数。②

输出链表输出链表的过程是根据链表的头节点找到下一个节点,先输

出其data域中的数据,然后根据其next域中的地址,取出后继节点,输出其data域中的数据。如此不断选取下一个节点,

直到链表末尾。输出链表的算法(1)根据调用程序传递来的链表首地址找到该链表的头节点1(2)由头节点next域中的地址找到下一个节点p;(3)若节点p的next域中的地址值不是NULL,

则进入下一步;否则,进入⑤;(4),输出节点p的data域中的数据,并由该节点next域中的地址

找到下一个节点,回到③;(5)返回调用函数。P244

【例7.7】先建立一个单向链表,将键盘输入的整数1、2、

3、4、5、6、7、8、9、10依次存入该链表各个节点的数据

域中,当输入整数0时,结束建立链表的操作。然后依次

输出链表中的数据,直到链表末尾。用一个结构指针型

函数creatlist()来建立链表,以便将该链表的头指针返回

调用函数。在函数creatlist()中先申请头书点的存储空间,

用指针h

存放该空间的首地址;然后不断申请下一个节点的存

储空间,其d

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论