C语言程序设计 结构体和共用体样本教案_第1页
C语言程序设计 结构体和共用体样本教案_第2页
C语言程序设计 结构体和共用体样本教案_第3页
C语言程序设计 结构体和共用体样本教案_第4页
C语言程序设计 结构体和共用体样本教案_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

构造体与共用体第一讲

内容说明

主要1.构造体的概念及其根本操作

内容2.构造体变量的引用方法

3.构造体数组的运用

1.对构造体类型的理解

重点

2.构造体类型内运用

难点构造体变量的引用

前面己经介绍了根本数据类型一整型、浮点型、字符型,也介绍了例子:

问题一种构造类型一数组,数组中各元素是属于同一种类型的。inta[5];

提出例如:一个学生的学号、姓名、性别、年龄、成果、家庭地址等项,

各项的数据类型并不一样(如下图)

numnamesexagescoreaddr通过举例说

10010LiFanin1888chengde明定义构造

假如将num、name、sex、age、score、addr分别定义为相互独立体类型的必

要性。

的简洁变量,难以反映它们之间的内在联络,如何解决此类问题呢?

一、构造体类型引入

处理这样的二维表数据时,通常以记录为单位进展处理,而每条记录

中包含多种数据类型,按以前所讲的数据类型没有方法处理。故引入了

构造类型。即将多个根本类型作为一个集体定义成一种新的用户自定义

类型。例:和根本类型

Structstudent变量进展比

{intnum;拟分析,进一

charname[20];步说明必需

charsex;定义构造体

类型。

intage;

floatscore;

charaddr[30];};

说明:

1.Struct是一个关键字,标记着这是一个构造体类型。

2.Structstudent是一个类型名;,

二、构造类型的运用步骤

stepl:说明所定义的构造类型的构造形式,成员构成;

分相当于建立数据库二维表的表构造.强调

step2:用所定义的构造类型定义构造变量(记录变量);

分相当于为数据库二维表的各记录定义一个记录名.留意与以往

变量应用的

通过所定义构造变量(记录变量)访问对应记录中的成员.

stcp3:区分

分相当于编辑数据库二维表的记录中的各项.

(1)构造类型的说明:

在TurboC中,构造也是一种数据类型,但不同二维表所对应

的构造不同,故在运用前须要对构造状况进展说明,即构造类型的说明.

构造类型说明的一般格式为:

struct构造名

(

类型名1成员变量名1;

类型名2成员变量名2;

类型名n成员变量名n;

二匕拟)

说明:

1)“struct〃是关键字,是构造类型的标记;

2)〃构造名〃是用户所说明的构造类型的名称的标识符,

而不是变量名,以后可用它来定义构造变量.

3)〃类型名〃为以前所讲的各种数据类型(int,char

等),也可以是己说明的构造类型。

4)〃成员变量名〃是构成构造的每一个成员变量的名称,

相当于数据库二维表中的各字段名.

举例例1:先声明一个

structdateStructdate

{intyear;类型,然后在

intmonth;定义Struct

intday;student类型

);时,将成员

例2:Birthday定

structstudent义为Struct

{charname[12];date类型。

charsex;

sturetdatebirthday;

floatsc[4];

1

在c语言中,构造类型可以嵌套定义,所以以上两例可以合并为:

structstudent

{charnamefl2];

charsex;

structdate

{intyear;

intmonth;

intday;

}birthday;

floatscf41;

)

(2)构造变量的定义及构造变量的内存安排:

1)构造变量的定义

象其它类型的变量一样,在运用构造变量时要先对其定义。构造变

量可以是一般构造变量,构造数组,和构造指针等形式.

定义构造变量有三种格式,现分别举例说明:

格式一:先说明构造类型,再单独进展构造变量定义.

例:

structstudent

{charname[12];

charsex;

sturctdatebirthday;

floatsc[4];

ji.,

structstudentstd.pcrs[3],*pstd;

说明:这个例子定义了三个构造类型名为student的构造变量:

①一般构造变量:std;

©构造数组变量:pcrs[3];

构造体数组

③指向该构造类型的指针变量:*pstd和数值型数

格式二:紧跟在构造类型说明之后进展构造变量定义:组不同之处

例:在于每个数

structstudent组元素都是

(charname[12];一个构造体

charsex;类型的数据。

sturctdatebirthday;

floatsc[4];

}std,pers[3],*pstd;

说明:

①假如省略变量名std,pers[3],*pstd,则变成对构造的说明.

②可以省略构造名,用一个无名构造类型干脆定义构造类型变量。

例:

struct

{charname[12];

charsex;

sturctdatebirthday;

floatsc[4];

}std,pers[3],*pstd;

这种构造类型变量定义的方式与不省略〃阂造名〃的方式相比,不同之处

在于:这种格式定义构造变量以后无法再定义此构造类型的其它构造变量,而

带有“构造名”的格式则可以.

先提示讲解

格式三:运用typedef说明一个构造类型名,再用新类型名定义构typedef

造变量.

例:

typedefstruct

{charname[12];

charsex;

sturctdatebirthday;

floatsc[4];

}STD_GRADE;

STD_GRADEstd,pers[3],*pstd;

说明:

这里STD_GRADE为用户定义的一个构造类型的类型名.

因此可用它来定义构造变量,而不再须要关键字sturct了.

例:

structstudent

{charname[121;

charsex;

sturctdatebirthday;

floatsc[4];

}pers[3]={{"Zhangsan","M”,l981,1,1,91,81,71,61},

{"Lisi",,1982,2,2,92,82,72,62},

{"Wangwu'\"F"J983,3,3,93,83,73,63}

);

有时构造数组长度可以省略,而由初值个数来示意.

(4)构造变量成员的引用和操作:难点

1)对构造变量成员的引用和操作:

三种引用形式:

①构造体变量名.成员名

少适用于一般构造变量和构造数组变量

例:

std.sex二"F";

std.sc[0]=91;

pers[l].sc[2]=67;

puts(per[2].name);

scanf("%c",&per[O].sex);

printf(M%d-%d",std.birthday.year,std.birthday.month);

②构造指针变量名->成员名

③(*构造指针变量名).成员名

分适用于指向构造类型的指针变量

例:

pstd->sex='M';3(*psd).sex='M';

pstd->sc[2]=87;U>(*pstd).sc[2]=87;

gets(pstd->name);gets((*psd).name);

scanf("%d",&pstd->birthday.day);<=>

scanf(',%d,,,&(*pstd).birlhday.day);

2)通过构造指针引用构造成员变量时,++和••运黄对结果的影响:

用以下实例来分析:

struct

{inta;

int*s;

}*P;

第一组引用:对成员变量a的引用

(D++p->aO++(p->a)

说明:成员变量a自增加1.

®(++p)->a

说明:指针p先挪动一个单位,然后引用对应的成员

变量a.

留意:p每挪动一个单位要挪动多少字节

(3)(p++)->a0p++->a

说明:先引用当前p所对应的成员a,引用完后,p挪动

一个单位.

第二组引用:对成员变量S的引用

①*p->s<=>*(p->s)

说明:引用s所指向的内存单元.

0*p->s++

说明:先引用S所指向的内存单元,然后指针S挪动一

个单位.

留意:S每挪动一个单位要挪动多少字节

<3)(*p・>s)++

说明:指针S所指的内存单元存储的数值自增1.

④*p++->s<=>*(p++->s)

说明:先引用s所指向的内存单元,然后指针p挪动一

个单位.

3)一样类型的构造变量之间整体赋值

例:

struct

{inta;

intb;

}perl,per2={2,3};

perl=per2;

留意:

整体赋值时,要保证='两边的构造变量的构造类型一样.

小结

本讲主要通过二维表引出了构造体类型,然后讲解了构造体类型的

构造类型定义、构造体变量定义、构造体变量的内存占用状况以及对构

造体数据的正确引用。

思索与练习

构造体与共用体第二讲

内容说明

主要L构造体变量在函数中的应用

为容A2.利用构造体变量构成链表

3.共用体

1.用指针处理链表

重点A

难点》指向构造体类型数据的指针;用指针处理链表

3,构造变量在函数中的应用

在C语言中,允许构造变量的成员,沟造变量的整体和构造变量

的地址做为实参传递给相应的形参。

(1)向函数传潴构造变量的成员通过举例说

构造变量的成员作实参明定义构造

举例A1

构造变量的成员可以是一般变量,数组或指针变量,它们做实参体变量的指

时的状况同以前七,八,九章所讲。针。

(2)向函数传涕构造变量

在主函数中

分构造变量整体作实参声明了

分单向数值传递struct

T接收者(形参)为同类型的构造变量student类

分执行时,系统会为形参开拓同样数量的内存空间来存放接收型,然后定义

到的数据struct

student类型

不会影响对应的实参中的各成员值.

的变量stu_l

少函数返回值可以是以下状况,但通常为1):又定义了一

1)构造变量整体例:P195例14.2个指针变量p

2)某成员变量的值它指向一个

3)无返回值struct

student类型

的数据。

(3)向函数传澧构造变量地址

分构造变量的地址作实参

分单向地址传递

结论A

今接收者(形参)为同构造类型的指针变量

玲执行时,会影响对应的实参中的各成员值

少返回值可以是以下状况,但通常为1)和2):

1)无返回值例1:P195例14.1;例2:P196

例:14.4

2)构造变量的地址例:P196例14.3

说明A3)某成员变量的值

4)构造变量整体

引例A

4•利用构造变量构成链表

(1)介绍一种特别的构造变量

好在构造体中含有指向本构造变量或同类型构造变量的成员

例:

structnode

{intdata;

structnode*next;

};

structnodea,b,c;

从这个构造类型的说明和构造变量的定义可以看出:

1)成员变量next是指向structnode这种构造类型的指

针;

引言A

2)a,b,c分别为structnode构造类型的变量.

此时系统会分别为a,b,c随机开拓内存空间,如下图:

a.dataa.nextb.datab.nextc.data

c.next

由于成员变量next是指向structnode这种构造类型的

指针,所以做如下操作:

a.next=&b;

举例A左侧是一个

b.next=&c;简洁的链表

结果如下图:构造

-----►----->

指向第

a.dataa.nextb.datab.nextc.datatread

一个元素,第

注释A

c.next一个元素又

这样就把构造变量a,b,c连接到了一起,形成了一个〃链表〃.指向第二个

这里的每个构造变量被称作链表中的〃结点〃,每个结点由两局元素……直

部构成:到最终一个

1)数据域(data)好用来存放当前结点的数值;兀素,该兀素

2)指针域(next)T用来存储下一个结点的地址.不在指向其

它元素,它称

为“表尾表

(2)静态链表与动态链表

1)静态链表

举例A在上面的介绍中,链接在一起的每个构造变量(结

点)a,b,c都是由系统开拓了固定的不连续的内存单元,在程序

执行过程中,不行能人为地安排和释放这些内存单元.从这个

角度动身,这种链表被称为〃静态链表〃.

2)动态链表

静态链表可能存在浪存储空恒的问题,若在程序执行过程

中,利用动态安排函数,依据须要随时为〃结点〃开拓内存空间,

不再须要时随时释放〃结点〃所占用的内存空间,就能比拟合理

的利用了内存了.这样形成的链表中的每个内存单元都是由动对结点num和

态存储安排获得的,故称这样的链表为〃动态链表〃.score成员赋

下面就介绍最常见的动态链表:带头结点的单链表.值。

(3)带头结点的单链表将结点ahc

什么是"单链表〃和〃带头结点的单链表〃如下图所示:的起始地址

分别赋值。

尾结点

思索》说明:

1)用一个〃头指针〃head来指明链表的起始位置(即链表第

一个结点的地址)

2)设置一个〃头结点〃,这个结点的〃数据域〃中不存放数据

(也可以不设置);

3)链表的尾结点不存放随意结点的地址值,置成

举例》'\0'(NULL)值.

这样的链表中,每个结点没有自己的名字,但每个结点有

一个指针域,用来存放下一个结点的地址,因此,这种链表只能

从前一结点找到后一结点,故称为"单链表〃.一般运用〃单链表

〃时,常含有〃头结点〃,故称为〃带有头结点的单链表〃.

由以上图示可以看出,〃单链表〃的每个结点由两个成员变

量组成:一个是整型的成员变量,一个是指向自身构造类型的

指针类型成员变量.所以,结点的类型说明如下:

structslist

{intdata;

structslist*next;开拓一个新

);单元

typedefsturctslistSLIST;

下面介绍〃单链表〃这种数据构造的相关操作:

1)建立带有头结点的单链表

①建立〃空单链表〃:

head_____________

3_>1〃I\。

头指针头结点

主要语句如下:

SLIST*h,*s;

h=(SLIST*)malloc(sizeof(SLIST));

s=(SLIST*)malloc(sizeof(SLIST));

h->next=s;

s->next=,\0'

举例A②建立非空〃单链表〃:

建立非空〃单链表〃主要操作步骤如下:

.读取数据;

.生成新结点;

.将数据存入结点的成员变量中;

.将新结点插入到链表中.

重复以上操作直至完毕.

2)依次访问单链表中各结点的数据

参考:P201例14.7

3)在单链表中插入结点

从动态链表

中删除一个

图示A绅点.

真正从内々

)

不把它抹掉1

点而是把它从

链表中分别

出来,只是撤

消原来的链

接关系。

举例A

主要操作步骤如下:

.生成所要插入的新结点;

.确定插入的位置;

.将新结点插入到链表中.

①在当前指针p所指结点后插入一个新结点:

主要语句如下:

SLIST*s;

s二(SLIST*)malloc(sizeof(SLTST));

s->data=x;

s->next=p->next;

p->next=s;

s->next=,\0'

©在当前指针p所指结点前插入一个新结点:

参考:P200例14.6

举例A3)删除单链表中的结点

q为了可以做

到正确的插

>1一必荒岷然

两彳、问li:—

头指针头结,、、、插入的位置,

尾结点二是怎样实

主要操作步骤如下:现插入。

.找到待删结点的前趋结点;

.删除要删除的结点

例:删除指针q所指结点的后继结点:

主要语句如下:

SLIST*p;

p=q->next;

q->next=p->next;

温馨提示

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

评论

0/150

提交评论