IT计算机课件结构体与公用体_第1页
IT计算机课件结构体与公用体_第2页
IT计算机课件结构体与公用体_第3页
IT计算机课件结构体与公用体_第4页
IT计算机课件结构体与公用体_第5页
已阅读5页,还剩74页未读 继续免费阅读

下载本文档

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

文档简介

第八章结构体与共用体

8-1概述

8.2定义结构体类型和定义结构体变量

83_结构体变量的引用

8A结构体变量的初始化

8.5结构体数组

&6指针与结构体

87用指针处理链表

*8.8共用体

*8,9枚举类型

8.10用typedef定义类型

&T概述.YA皿L

「数组:同类型数据的集合;

C构造类型1结构体:不同类型数据的集合;

〔共用体:不同类型的量共用存储单元。

若:表示学生多门课成绩,各门课成绩数据类型一

致,适合用数组表示。

若:对一系列整数排序,适合用数组表示。

3

若:编程处理若干学生的基本情况;其中每个学生

的基本情况由若干项组成,而各项的类型可能

相同或不同。

项目:学号姓名性别出生日期成绩电话号码

数据:210510LiFengM1984.5.4680029-8482500

类型:长整/字串字串字符字串整型字串

该例中构成每个学生基本情况的数据类型不同,

可采用结构体这种数据类型实现。

4

8.2定义结构体类型新薇B构体变量

1.定义结构体类型

定义一般形式:struct结构体名

{类型标识符成员名1;

类型标识符成员名2;

I

I

类型琮识符成员名n;

);

其中:

1)struct结构体名组成具体的结构体类型标识符,

可用这个结构体类型标识符去定义变量等对象;

2)结构体名、成员名应符合标识符命名规则;

3)类型标识符确定各成员类型;

5

【例】定义可表示学生基本情况的结构体类型。

项目:学号姓名性别出生日期成绩电话号码

数据:010510LiFengM1981.5.4680029-8482500

类型:长整/字串字串字符字串整型字串

structstudent/*特定结构体类型标识*/

{longnum;

charname[20];

charsex;

charbirthday[12];

floatscore;

chartel[15];

);/*该类型共有6个成员*/

L6

1)结构体不可能有统一的结构,因此一个结构体的

成员数目、各成员的类型必须依据具体情况由用

户自己定义;

2)一个C程序可定义多个结构体类型;定义的位置

可在函数之内,也可在函数之外;位置决定其有

效范围;

如:结构体类型1定义;

main()—y------------::-

(结M体类型2定义;类型2有效类型1有效

…;}—

funl(…)

■)

57

3)成员名可与程序中其它量同名,且互不干扰;

4)成员的类型也可是已定义过的结构体类型;

如:structdate/*该结构体有3个成员*/

{intm;

intd;

inyy;};

structstudent/*该结构体有6个成员*/

{longnum;

charname[20];

charsex;

structdatebirthday;/*成员类型:结构体*/

floatscore;

chartel[15];};

8

5)定义结构体类型仅仅声明了一种数据结构,编译

系统是不会为类型分配存储空间的;此时在有效

范围内,可用已定义的结构体类型去定义结构体

变量或数组,编译系统将为结构体变量或数组分

配存储空间;

2.定义结构体类型的变量

三种定义方法:

1)先定义结构体类型,再用类型标识去定义变量

structstudentstul,stu2;

structstudent是已定义的结构体类型标识符;

对stul>stu2是所定义的结构体变量;编译时将为

结构体变量分配各自的存储空间;

2)定义类型的同时定义变量

structstudent

/*各成员的定义*/

}stul,stu2;

3)不使用结构体名,定义类型的同时定义变量

struct/*无结构体名*/

{…;

・・・,

}stul,stu2;

说明:

界结构体变量可以是局部的或全局的。

器结构体变量存储空间大小为各成员长度之和;

如变量stul存储字节数:4+20+1+6+4+15=50

11

对结构体变量的存储结构:各成员按定义顺序连续

存储;

stul

如:

num4

structstudent

{longnum;name20

charname[20];

1、共56字节

charsex;sex

charbirthday[12];birthday12

floatscore;score4

chartel[15];

tel15>

}stul,stu2;

成员成员字节

12

如:

structdatestul

{intm;num4、

intd;

name20

inyy;};

structstudent

sex1》共50字节

{longnum;m

birthdayd6

charname[20];y

charsex;score4

structdatebirthday;tei15」

floatscore;口7

chartel[15];成员成员字节

}stul,stu2;

13

8.3结构体变量的引用,、.

数组引用的单位是元素,而不能引用整个数组。

结构体变量引用的单位则是成员,同样结构体

变量不能被整体引用。

1.结构体变量各成员的引用

引用形式:结构体变量名,成员名

其中:成员运算符',':一级,自左而右;

如:按以上定义

stul.num引用结构体变量stu1的num成员;

stul.name引用stul的name成员(字符指针);

[i]引用name成员的第i个元素;

stul.birthday.y只能对最低级成员进行引用;

2,结构体变量各成员的输入、输出

应按成员类型选择输入、输出的格式符。

【例】按以上定义输入

scanf("%ld",&stul.num);,■于&*/

scanf《'%d,%d,%cT,&stul-birthday,m,

&stu1,birthday.d,&stu1.birthday.y);

,0110234/(不保存前导0)

5,242981/

【例1gets(stu);/*成员name的指针*/

seanf(,,%sn,stu1.tel);/*成员tel的指针*/

>LiFeng/

【例】按以上定义输出

printf("munber:%07ld\n",stul.num);/*前导0*/

printf(”%d,%d,%cr,stul.birthday.y,

stul-birthday-m,stul.birthday.d);

printf("name:%s\n",);

^for(i=0;[i]!=0;i++)/*数组成员输出*/

-printf("%c",[i]);

说明:,与口运算符同为一级,自左而右运算。

16

3.成员的赋值

1)数值型成员赋值

如:stul,num=110234;/*不力口前导0*/

stul,birthday.y=1981;

stul-birthday,m=5;

2)字符数组成员赋值

如:strcpy(stul,name,"LiFeng");

错误:="LiFeng";

17

3)结构体变量间的赋值

如:stu2=stul;

注:TC下允许同类型结构体变量间直接赋值;

其结果是按成员一一对应赋值。

4.对成员对象可像普通变量一样进行相应运算

如:sum=stul.score+stu2,score;

如:stul.num++;/*,1级/++2级*/

先访问成员num,而后num自加1;

18

5,结构体变量的指针、结构体成员的指针

注:&优先级为2级,低于,和口;।

图示:变量stul的指针:&Stljlnum*l

num成员指针:&stu1.num

name成员指针:stul.name

name第i个元素指针:&stu1.name[i]

birthday

最低级成员y的指针:&stul,birthday,y-----------

score

成员tel的指针:stul.tel

r19

。一网”fg好也亭学^^触婚<#r

,…,I

8.4结构体变量的初始化

定义结构体变量的同时用初值表给出初值。

【例】定义结构体变量存放两位学生的基本情况,

计算平均成绩,并以大写形式输出name成员。

#include"stdio-h"

structstudent/*定义全局结构体类型*/

{longnum;

charname[20];

floatscore;};

main()/*!按成员顺序给出初值*/

{structstudentstul={109031,"LiFeng",89.0},

stu2={109032,"WangLi",71.0);

floataver;inti;…;}

20

aver=(stul.score+stu2,score)/2.0;

printf("\n\taverage=%7,2f\n",aver);

rfor(i=0;[i]!=0;i++)/*处理stul*/

if([i]>=,a,&&[i]<=,z,)

<[i]-=32;/*成员name[i]运登*/

rfor(i=0;[i]!=0;i++)/*处而stu2*/

if(stu2,name[i]>=,a,&&[i]<=,z,)

、stu2,name[i]-=32;

printf(“\n\t%ld,%s,%7,2f2

stul.num,stubname,stul.score);

printf("\n\t%ld,%s,%Z2f\nn,

stu2,num,stu2,name,stu2,score);

}/*main*/

21

8.5结构体数组

数组是同类型元素的集合;结构体数组也是同

类型元素的集合,只不过每个元素的类型均为相同

的结构体类型。

前面介绍的结构体变量可用来表示一位学生的

基本情况,要表示多个学生的基本情况时,采用结

构体数组比较方便。

22

1.结构体数组的定义和初始化

例:structstudent

{longnum;

charname[20];

floatscore;

}stu[3]={{99001,"LiFeng",89.5},

{99002,"WangYi",70.5},

{99003,"ZhaoHui",92}};

说明:

1)数组stu各元素类型相同,都为structstudent型;

2)结构体数组stu的存储字节数为:

元素类型长X元素个数=(4+20+4)X3=84字节

23

3)结构体数组stu的存储结构

990014

LiFeng\0

stu[O]<20>28

89.54J

99002

WangYi\0

stu[l]<84byte

70.5stu[l].score

99003stu[2].num

ZhaoHui\0

stu[2]

92.07

-24

2.结构体数组的引用“‘

结构体数组在引用时,不仅要确定引用哪一个

元素,还要确定引用该元素的哪一个成员。

引用形式:数组名[下标].成员名

其中:运算符口与.同为一级,自左而右结合;

过程:依据数组名及下标先定位到元素,然后再定

位到成员;

如:

stu[O].num访问stu数组首元素的成员num;

stu[l].score访问以1为下标那个元素的score成员;

awarn这

【例】编程求三位学生的平均成绩,并输出成绩最

高者的学号、姓名、成绩。

main()

{struct/*定义局部结构体类型及数组*/

{longnum;

charname[20];

floatscore;

}stu[3]={{99031,"LiLin",89.0},

{99032,"WangFang",71.0},

{99033,"ZhaoPing”,92.0});

floatmaxs,sum=0;

inti,p;

…;)

main()

{结构体类型、结构体数组stu的定义及赋初值;

floatmaxs,sum=0;

inti,p;

maxs=0;

rfor(i=0;i<3;i++)

{sum=sum+stu[i].score;/*累力口各元素score成员*/

if(stu[i],score>maxs){maxs=stu[i].score;p=i;}

1}

printf("\n\taverage=%f\n",sum/3,0);

prin曲\tnum:%ld,name:%s,score:%7,2f\n”,

stu[p].num,stu[p],name,stu[p].score);

)

27

【例】30张选票,对三名侯选人之一投票选举,输

入得票人名字,按名字计数,输出最后选举结果。

#include"stdio.h"led[O].name

#defineN30led[0].count

structperson

{charname[20];

intcount;

);

main()

{structpersonled[3]=

0,“Zhang”,0,"Wang",0};

-;)

28

main()

{structpersonled[3]=

{"Li",0,"Zhang",0,"Wang",0};

charlname[20];inti,j;

rfor(i=l;i<=N;i++)/*i控制选票张数*/

{printf("Input%dNO.name:”,i);gets(lname);

rfor(j=0;j<3;j++)/*j控制数组下标*/

if(strcmp(led[j].name,lname)==0)/*串比较*/

〔{led[j],count+=l;break;}/*计票*/

1}

for(i=0;i<3;i++)

-printf(,,\n%-10s:%d",led[i].name,led[i].count);

)YS

29

8.6指针与结构体

1.指向结构体变量的指针

一个结构体变量的指针是该变量存储区域的起

始地址,它指向结构体这个整体。

在程序中可定义一个指向同类型结构体的指针

变量,并将该指针变量指向某结构体变量,之后便

可利用指针变量访问各成员。

二,/工卡30

【例】利用结构体指针,对某学生基本情况赋值并输出。

main()

{structstudentYS

{longnum;charname[20];floatscore;

}stul,*p;stul

stul.num=99001;pastui*46899001

1

strcpy(,"LiFeng');472name[0]

stul.score=89.5;473namerr

p=&stul;

printf(”num:%ld\n”,(*p).num);

printf(”name:%s\n”,(*p).name);491name[19]

printf(',score:%7.2\n,,,(*p).score);49289.5

printf("%u,%u,%u,%u\nn,

&stul,&stul.num,stul,name,&stul.score);

)

、',31

1)当p=&stul;且保持不变时,

(*p).num表示访问p所指向变量的num成员;

其中:*号为2级,括号可保证先使p与*结合。

2)当p=&stul;且保持不变时有:

stul.numu>(*p),num<=>p->num

3),称为指向成员运算符;1级,自左而右;

p->num中->代替了*和.运算符,看着更直观;

如:

p->score:访问p所指向变量的score成员;

p->name[i]:访问p指向变量的name成员第i个元素。

32

2.用结构体指针变量访问结构体数组元素

【例】输入/输出三位学生基本情况,计算平均成绩

#include"stdio.h"pn99001

#include"math.h"LiFeng

<

structstudentstu[0]

I89.5

{longnum;r

charname[20];99002

WangYi

floatscore;};stu[l]

main()

I70-5

r

{structstudent*p,stu[3];99003

ZhaoHui

inti;floatsum=0;stu[2]<

・・・;...;p=stu;

92.0

)

33

sqrt(25);/*激活浮点运算*/

rfor(i=0;i<3;i++)/*输入所有数据*/

{printf("\t%dnumber:",i+1);

scanf("%ldn,&stu[i].num);getchar();

printf("\tname:");gets(stu[i].name);

printf("\tscore:");scanf("%f",&stu[i].score);

1)

rfor(p=stu;p<stu+3;p++)/*输出所有数据*/

printf(”\t%-8ld%-20s%-7.2f\n”,

[p->num,p->name,p->score);

for(p=stu,i=0;i<3;i++)/*p不变*/

sum=sum+(p+i)->score;/*累加成绩*/

printf("\taverage=%-7,2f\n",sum/3.0);

)

34

说明:

1)^p=stu;p++的增量为元素类型长28,从而使

p指向下一个元素;

2)当p=stu;且保持不变时,

p+i的值:stu+ix元素类型长

=stu+ix28

p+i含义:数组元素str[i]的地址;

即:p+i<=>stu+io&stu[i]:结构体数组元素指针;

(*(P+i)).num0(p+i)->num处str[i].num;

35

3,结构体指针作为函数参数

此时实参与形参对应关系为:

实参形参

结构体变量,成员

-成员的值・一与成员同类型变量

成员产本类型变量一

数组成员的指针

数组名、姒筌拜人口"日¥,同类型形参数组

结构体变量的指针结构体变量的指针,结构体指针变量

结构体变量名各成员值对应传递-同类型结构体变量

36

【例】一结构体类型,可表示学号、姓名、三门课

成绩及平均成绩,编程对两位学生的成绩求个人平

均分、输出所有数据项。

要求:1)分别用结构体变量stul、stu2存储数据;

2)由函数aver实现平均分计算;

3)由函数pfun实现输出;

函数间信息传递:

源程序:

structstudent

{longnum;

charname[20];

floatscore[3];

floataver;

);

main()

structstudentstul={...},

stu2={...};/*定义变量并赋初值*/

)

去,「•y38

main()

{structstudent/*I定义结构体变量并赋初值*/

stul={99001,nLiHong",89,76,90,0},

stu2={99002,"WangLi",70.5,85.5,76,0};

voidaver(structstudent*p);

voidpfun(structstudents);

aver(&stul);/*实参:结构体变量的指针*/

aver(&stu2);

pnntf("\tnumber\tname\

\t\tscorel\tscore2\tscore3\taverage\n");

pfun(stul);/*实参:结构体变量*/

pfun(stu2);

)

二J

voidaver(structstudent*p)

{inti;floatsum=0;

[for(i=0;i<3;i++)sum=sum+p->score[i];

p->aver=sum/3,0;

return;

)

voidpfun(structstudents)/*实形参对应成员值传递*/

{inti;

printf("\t%ld\t%s\t",s.num,);

for(i=0;i<3;i++)/*输出成绩成员的各元素*/

、printf("\t%"7.2f",s.score[i]);

pnntf(n\t%7.2f\n",s.aver);

return;}

;:40

【例】设计一软件计时器,力字符显示时「务秒'

structtime_stru/*该类型全局有效*/

{inth,m,s;};/*三个成员用一个标识符*/

main()

{voidupdata(structtime_stru*t);

voiddisplay(structtime_stru*t);

structtime_strutime;/*定义结构体变量*/

time.h=time,m=time,s=O;clrscr();

while(!kbhit())/*击键测试*/

{updata(&time);

display(&time);

)

)

voidupdata(structtime_stru*t)

{longi;

t->s++;/*秒成员自加1*/

if(t->s==60){t->m++;t->s=O;}

if(t->m==60){t->h++;t->m=0;}

if(t->h==24)t->h=O;

for(i=l;i<8500000;i++);/*模拟1秒延时*/

return;

)

voiddisplay(structtime_stru*t)

{gotoxy(35,12);

printf(”%02d:%02d:%02d)t->h,t->m,t->s);

return;}

u-542

【例】调用标准函数,显示日期和时间。

系统口期函数原形:voidgetdate(structdate*datep);

系统时间函数原形:voidgettime(structtime*timep);

dos.h头文件中结构体类型的定义:

structtime{unsignedcharti_min;

unsignedcharti_hour;

unsignedcharti_hunt;,分之…秒*/

unsignedcharti_sec;

);

structdate{intda_year;

charda_day;

chardamon;

);

43

#include"dos.h"#include"graphics.h"

#definePATH,,c:\\tc30n

main()

{structdate*dp,sysdate;/*定义结构体变量*/

structtime*tp,systime;unsignedchart;

intgd=VGA,gm=VGAHI,size;charch[20],*p;

initgraph(&gd,&gm,PATH);/*图位初始化*/

setcolor(14);circle(320,240,200);/*画黄色圆*/

dp=&sysdate;getdate(dp);/*取系统日期*/

printf(“\t\tdate:%d,%d,%d“,/*输出日期各成员*/

dp->da_yeacdp->da_mon,dp->da_day);

size=imagesize(260,380,460,420);/*求画面字节数*/

p=(char*)malloc(size);申请动态存储区*/

getimage(260,380,460,420,p);/*存储背景色画面*/

L.:XTMo44

tp=&systime;gettime(tp);WWW-

t=tp->ti_sec;/*保存秒成员*/

/while(!kbhit())/*击键测试*/

{gettime(tp);/*不断取系统时间*/

/if(tp->ti_sec!=t)/*测试秒成员是否改变*/

{putimage(260,380,p,0);/*输出画面擦除文本*/

sprintf(ch,nTIME:%u:%u:%u",/*输出到ch中*/

tp->ti_houi;tp->ti_min,tp->ti_sec);

outtextxy(260,380,ch);/南形模式文未输出*/

sound(500);delay(200);/*扬声器发声*/

nosoundQ;/*关闭声音*/

t=tp->ti_sec;/*更新t*/

)

45

8.7用指针处理链表

1.链表概述

1)动态数据结构概念

数组和结构体是定长数据结构,而链表、堆

栈、队列、树、图等是执行时大小可变的动态数

据结构。

链表是连成一行的数据项集合,每一个数据

项(元素)称为节点,可以在链表中的任意位置进

行节点插入或删除操作,使链表数据项的个数随

之增加或减少。

46

2)链表的构成

单向链表图示:

head

其中:

用head是指针变量,存放链表的头指针1048;

算各节点是相同的结构体类型,该类型有三个成员;

就各节点应包含一个指针成员存放下一节点的地址;

就各节点存储有可能不连续,但各节点逻辑上连续。

3)节点的构成

上图每个节点具有如下结构体类型:

structstudent

{longnum;

floatscore;

structerstudent*next;/*链节成员*/

);

其中:

对血员num、score用于存放一个节点的具体数据;

犹成员next是指针类型,用于存放下一节点指针,

最后一个节点的next成员存放空指针NULL;

我成员next是指向与自身同一类型的结构,这种结

构称为自引用结构。(只有指针成员可自弓I用)

48

4)动态内存分配和释放

建立和维护动态数据结构需要实现动态内存

分配;如在链表中插入节点需要先申请一段存储

区域,而删除一个节点需要释放该节点原先占用

的存储区域,这可由标准函数实现。

内存分配函数原形:void*malloc(unsignedsize);

功能:在内存申请一块长度为size个字节的空间;

若申请成功,该函数返回指向存储块起始

地址的指针,该指针类型为void*;否则返

回空指针(NULL)。

内存释放函数原形:voidfree(void*p);

功能:释放p所指向的内存块。

49

5)采用链表的意义

并与定长数据结构数组相比,链表能更好地利用

内存,按需分配和释放存储空间。

就在链表中插入或删除一个节点,只需改变某节

点“链节”成员的指向,而不需要移动其它节点,

相对数组元素的插入和删除效率高。

50

2.单链表的建立和输出

建立链表的准备工作:

1)定义链表的节点类型;

2)定义与节点同类型的链表头指针变量head并赋

值0,表示链表在建立之前是空的;

3)定义与节点同类型的工作指针变量pl、p2o

51

建立链表的步骤:

1)开辟第一个节点的存储区域,使head、pl、p2

指向第一个节点,并输入第一个节点数据;

head

p2101

pl-895

P2—

2)开辟下一节点的存储区域,使pl指向新节点、

输入新节点数据,并将上一个节点的next成员

52

3)将p2也指向新节点;

head

4)重复第2、3步,建立并链接多个节点直至所需

长度,将末尾节点的next成员赋值0。

head

【例】建立并输出有3名学生数据的单链表。

#include"stdio.h"/*包含NULL的定义*/

#include"math-h"

#defineN3

structstudent/*结构体类型定义*/

{longnum;

floatscore;

structstudent*next;/*自引用结构体指针*/

);

main()

)

卫广等眦汨但可受MY南-t冢弋XTM54

-1r9^」二

main()w

{structstudent*head,*pl,*p2;

inti,len;sqrt(5.5);/*激活浮点运算*/

head=NULL;/*head不指向任何位置*/

len=sizeof(structstudent);/*求类型长*/

rfor(i=l;i<=N;i++)/*/强制转换为结构体指针类型*/

{pl=(structstudent*)malloc(len);/*申请*/

printf("Enternum,score:");I输入数据*/

scanf("%ld,%f",&pl->num,&pl->score);

rif(i==l)head=p2=pl;/*指向首节点*/

〔else{p2->next=pl;p2=pl;}/*节点链接*/

if(i==N)p2->next=NULL;"标记末尾节点*/

I):

55

main()

「for(i=l;i<=N;i++)/*建立链表*/

L{:}

rfor(i=l;i<=N;i++)/*输出链表*/

{rif(i==l)pl=head;/*pl指向首节点*/

〔elsepl=pl->next;/*pl指向下一节点*/

printf("%d:num=%ld,score=%5,2f\rT,

i,pl->num,pl->score);

i)

}/*main*/

56

【例】将上题利用函数实现,并求平均成绩。

定义如下函数:

建立链表函数:structstudent*creat(void);

输出链表函数:voidplink(structstudent*head);

求平均值函数:floataverf(structstudent*head);

函数间信息传递:

57

#include"stdio.h"

#include"math.h"

#defineN3

structstudent

{longnum;

floatscore;

structstudent*next;

);

main()

)

58

main()

{structstudent*head,*creat(void);

voidplink(structstudent*head);

floataverf(structstudent*head);

inti,len;floataver;

sqrt(5.5);clrscr();

head=NULL;

head=creat();/*返回链表头指针*/

plink(head);

aver=averf(head);/*返回平均值*/

printf("Average=%5,2f\n",aver);

)

structstudent*creat()

{structstudent*head,*pl,*p2;

inti,len;

len=sizeof(structstudent);

广for(i=l;i<=N;i++)

{pl=(structstudent*)malloc(len);

printf("Enternum,score:");

scanf("%ld,%f",&pl->num,&pl->score);

if(i==l)head=p2=pl;

else{p2->next=pl;p2=pl;}

if(i==N)p2->next=NULL;

1}

return(head);/*返回链表头指针*/

voidplink(structstudent*head)/*输出各节点*/

{structstduent*p;

inti;

rfor(i=l;i<=N;i++)

{if(i==l)p=head;

elsep=p->next;

printf("%d:num=%ld,score=%5,2f\n",

i,p->num,p->score);

1)

return;

)

floataverf(structstudent*head)

{structstudent*p;

floatsum=0;

intc=0;

p=head;/*使p指向首节点*/

<while(p!=NULL)

{C++;/*c统计节点数*/

sum=sum+p->score;

p=p->next;

i)

return(sum/c);/*返回平均值*/

YS

62

3.节点的删除

步骤:

1)按查找关键字查找要删除的节点;

2)找到,则将要删除节点的“链节”成员赋给前

一节点的“链节”成员,使删除的节点脱离链

表。

若:要删除节点为首节点,则将首节点“链节”

员赋给链头指针手

2918

蚓§

101,NULL

r5节63

V-U*

【例】按上例删除指定学号的节点

structstudent*del(structstudent*head,longn)

{structstudent*pl,*p2;/*fn:要删除学号*/

pl=head;

<if(pl->num==n)head=pl->next;*删除首节点*/

else

{rdo{p2=pl;pl=pl->next;

【}while(pl!=NULL&&pl->num!=n);

if(pl->num==n)p2->next=pl->next;

elseprintf(nNotbefound!\nn);

1}

free(pl);/*释放被删除节点的存储区*/

return(head);/*返回头指针*/

;:,64

voidplink(structstudent*head)/*更具通用性*/

{structstudent*p;

p=head;

rwhile(p!=NULL)

{printf("num=%ld,score=%5.2f\n",

p->num,p->score);

p=p->next;

1}

return;

注:本形式的链表输出函数具有通用性,可适应由

于删除或插入节点引起的链表长度的变化。

65

4.节点的插入"-一

插入可分为随意插入和按顺序插入,随意插

入包括插入到头部、尾部或中间指定位置;按顺

序插入是指按某关键字的顺序插入,而在插入前

链表必须已按该关键字进行了排序。

按顺序插入的步骤:

1)开辟待插入节点的存储区域并输入数据;

2)查找插入位置:从链表首节点开始按关键字成

员与待插入节点相同成员进行比较,直到确定

了插入位置;

66

3)将插入位置前一节点的“链节”成员赋给待插

入节

点的“链节”成员;

若:插入点在链头,则将头指针赋给待插入节点的

“链节”成员;

4)将待插入节点的指针赋给前一节点“链节”成

员;

【例】按上例在链表中插入节点

插入函数:

structstudent*insert(structstudent*head)

{structstudent*pO,*pl,*p2;

longn;intlen;

len=sizeof(structstudent);

p0=(structstudent*)malloc(len);申请新节点*/

printf("Enternum,scoretoinsert:");

scanf(H%ld,%f",&pO->num,&pO->score);

n=pO->num;7*产生学号副家n*/

pl=head;/*从首节点开始查找*/

I

!

pl=head;/*厂而入在头部*/

〔if(n<pl->num){pO->next=head;head=pO;}

else

{rdo/*查找插入位置*/

{p2=pl;

pl=pl->next;

L}while(pl!=NULL&&n>pl->num);

pO->next=p2->next;/*皤入在其余位置*/

p2->next=p0;

I}

return(head);

,}/"insert*/

69

【例】编写二个通用的函数;可根据需要建立任意

节点数的链表。

structstudent*creat()/*无参有返回值*/

{structstudent*head=NULL,*pl,*p2;

intlen;longn;floats;

len=sizeof(structstudent);

/*循环次数不确定*/

rwhile(l)

{printf("Enternumber;score:");

scanf("%ld,%f",&n,&s);

if(n==0)break;/*输入。表示数据结束*/

pl=(structstudent*)malloc(len);

1:}

return(head);}

rwhile(l)

{printf("Enternumber;score:");

scanf(n%ld,%fn,&n,&s);

if(n==O)break;/*以。表示数据结束*/

pl=(structstudent*)malloc(len);

pl->num=n;pl->score=s;*转存入节点*/

rif(head==NULL)head=p2=pl;

Ielse{p2->next=pl;p2=pl;}

1}

p2->next=NULL;/*末尾链节成员赋空*/

return(head);/*返回链表头指针*/

)/*creat*/

71

8.10用typedef定义类型的别名

关键字typedef可用来为类型标识符建立一个

别名,这个别名同样可用于变量、数组、函数等

对象的声明。

使用一般形式:typedef原类型名新类型名;

其中:原类型名可以是标准的或用户定义的;

新类型名即为别名,别名通常大写;

意义:

6用较短的别名代替用户定义的结构体类型名;

2)使程序具有更好的通用性。

如:typedeffloatREAL;/*定义类型别名*/

REALx,y;/*用类型别名定义变量*/

如:typed

温馨提示

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

评论

0/150

提交评论