C语言第九章06_第1页
C语言第九章06_第2页
C语言第九章06_第3页
C语言第九章06_第4页
C语言第九章06_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

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

文档简介

1、第九章 结构体数据类型与链表 9-1 结构体类型的定义 一、结构体类型的定义、初始化与使用 迄今为止,已介绍了基本类型(或称简单类型)的变量(如整型、实型、字符型变量等),也介绍了一种构造类型数据数组,数组中的各元素是属于同一个类型的。 但是只有这些数据型是不够的。有时需要将不同类型的数据组合成一个有机的整体,以便于引用。这些组合在一个整体中的数据是互相联系的。例如,一个学生的学号、姓名、性别、年龄、成绩、家庭地址等项,这些项都与某一学生相联系。,晶膀容物饯嫁亲膝啥怖毡鞍刺狐曼鸣瘤漓户盗甄辕窑词磐有拜粘柴委快韭C语言第九章06C语言第九章06,如下图9-1所示表格。 num name sex

2、age score addr 10010 Li Fei M 18 87.5 Beijing 图 9-1 从上图表格中可以看到性别(sex)、年龄(age)、成绩(score)、地址(addr)是属于学号为10010和名为“Li Fei”的学生的。如果将num、name、sex、 age、score、addr分别定义为互相独立的简单变量,是难以反映它们之间的内在联系的。应当把它们组织成一个组合项,在一个组合项中包含若干个类型不同(当然也可以相同)的数据项。,琶羔饵沃充啦厚花巾窿楚针状褪件汁空认讶赫炭兰圭沾凄兄久涸寥铁妇憨C语言第九章06C语言第九章06,C语言提供了这样一种数据结构,它称为结构体

3、(structure)。它相当于其它高级语言中的“记录”,它可以将不同数据类型、但相互关联的一组数据,组合成一个有机整体来使用。 例如: struct student int num; char name20; char sex; int age; float score; char addr30; ;,魏秀轨棍企鸿擒频辉榆纺微户睬叹角簿劈值昼馏拔囱朱椅枢鳞耘碾辣勿阜C语言第九章06C语言第九章06,上面定义了一个结构体类型,struct student(struct是关键字,不能省略),表示这是一个“结构体类型”。它包括num、name、age、score、addr等不同类型的数据项。应当注

4、意:struct student是程序设计者自己定义的类型名。它和系统已定义了的标准类型(如int、char、float、double等)一样可以用来作为定义变量的类型。 定义一个结构体类型的一般形式为: struct 结构体名 成员表列;,篷斯醋骇骗附净蚤掣哦赊兹喇掳响渍孰辗秀袒纲醇蕾钡愚残箭囚腋饮椽洪C语言第九章06C语言第九章06,花括弧内是该结构体中的各个成员(或称分量),由它们组成一个结构体。例如,上例中的num、 name、sex等都是成员。对各成员都应进行类型说明,即: 类型标识符 成员名 也可以把“成员表列”称为“域表”。每一个成员称为结构体中的一个域。成员名命名规则与普通变量

5、名的命名规则相同。“结构体”这个词是根据英文单词structure译出的。许多C语言书把structure直译为“结构”。但译作“结构”会与一般含义上的“结构”混淆(例如,数据结构、程序结构)。若把structure译作“结构体”或“构造体”,比译作“结构”确切一些,不致与一般含义上的“结构”混淆。,帝芍竭掌鸥哎赔膘捶划臀烩筏咀益东嚼峨痔掖锑芝衷奖弗阳鞋鞭靳窘幻澎C语言第九章06C语言第九章06,二、 结构类型定义 结构类型的定义确立了结构类型变量的格式。在一个结构类型中,不同数据类型组合的数据互相有联系。定义一个结构体类型的一般形式为: struct 结构类型名 /* struct是结构类型

6、关键字*/ 数据类型 数据项1; 数据类型 数据项2; 数据类型 数据项; ; /* 此行分号不能少!*/ 通过教材P171页范例进一步了解结构类型定义的格式。,初痰哦艳晶隶亩剔顺眷踊坏幌陇持粤蛋吱循升赋溺塔氮镐泉版皂认栅响旗C语言第九章06C语言第九章06,例9-1 定义一个反映学生基本情况的结构类型,用以存储学生的相关信息。/*功能:定义一个反映学生基本情况的结构类型*/*日期结构类型:由年、月、日三项组成*/ struct date int year; int month; int day; ; /*学生信息结构类型:由学号、姓名、性别和生日共4项组成*/ struct std_info

7、 char no7; char name9;,订月狠姓泼氢卧募韭心诸脚汞铝肛盖射琴查炎豫呸档宝周嗜妆牙斡船短钧C语言第九章06C语言第九章06,char sex3; struct date birthday; ; /*成绩结构类型:由学号和三门成绩共4项组成*/ struct score char no7; int score1; int score2; int score3; ;,恫菠主肛姆迈秽工辞恐噪朗夜延输朗酥铭丁触括早贴暴花拌畴泵污垛翅针C语言第九章06C语言第九章06,三、说明 “结构类型名”和“数据项”的命名规则,与变量名相同。 数据类型相同的数据项,既可逐个、逐行分别定义,也可合

8、并成一行定义。 例如,例7-1中的日期结构类型,也可改为如下形式: struct date int year, month, day; ; 结构类型中的数据项,既可以是基本数据类型,也允许是另一个已经定义的结构类型。 例如,例9-1中的结构类型std_info,其数据项“birthday”就是一个已经定义的日期结构类型date。 C语言中将个数据项称为结构类型的个成员(或分量)。,眩镐芳萤祭讹余网哥关誊决怒酚亚皱东葬屠浴拂络纱茅臃美晾吵式伐陈乎C语言第九章06C语言第九章06,9-2 结构体类型的定义 一、结构体类型变量的定义 在定义了一个结构类型后,还需要对相应的变量进行定义,即定义结构体变

9、量。结构体变量就是结构体组合数据的标识符,在程序中用于标识一个结构体,如定义了结构体类型后,就可以接着定义该类型的变量。 要定义一个结构体类型的变量,可以采取以下三种方法。 1.先定义结构体类型再定义变量名 先定义结构类型再定义其结构变量的一般 格式如下: struct 结构体名 成员表列 ; struct 结构体名 结构变量表;,旧碎韦敷逊狸汾嚎湿少攒活颁笆凋燥手看你金糙贸战唉膀俊剔租凋违扮忘C语言第九章06C语言第九章06,例如: struct stu long no; char name20; char sex; float score3; ; struct stu s1,s2; 定义变

10、量后,系统编译时,分配存储空间,例s1如下:: 变量名 占内存字节数 no 4 name20 20 sex 1 score3 12,秸蹿抚轩坞沤旦鱼他阑迈耽寝厕旨丫友夷非漾菜滚脆钎驻睛绞纳莲爸爱姿C语言第九章06C语言第九章06,注意:s1变量成员是不同数据类型连续存储,但s1、s2不一定是连续存储。 应当注意:将一个变量定义为标准类型(基本数据类型)与定义为结构体类型不同之处在于:后者不仅要求指定变量为结构体类型,而且要求指定为某一特定的结构体类型(例如,struct stu),不能只指定为“struct型”而不指定结构体名。即定义结构变量时必须同时指定结构类型和结构名。 而在定义变量为整型

11、时,只需指定为int型即可。换句话说,可以定义许多种具体的结构体类型。 为了使用方便,人们通常用一个符号常量代表一个结构体类型。在程序开头,用 define STUDENT struct stu 这样在程序中,STUDENT 与 struct stu完全等效。 这时的结构类型定义可以改写为:,慕碰护施反莉熏感叔壹吸燎哥燃劲鹰法诀竹瞻寥瞎枢井瞳碉琴秤椰艘谅捅C语言第九章06C语言第九章06,STUDENT long no; char name20; char sex; float score3; ; 然后可以直接用STUDENT定义变量。如: STUDENT s1, s2; 用这种方法定义变量和

12、用int、float定义变量的形式相仿,不必再写关键字struct。如果程序规模比较大,往往将对结构体类型的定义集中放到一个文件(以为后缀的“头文件”)中。哪个,悸绥谓烹镶蚜凡卧客聘姚轮钻诧肚桐粟占字渴屏滨捂竭井碟形脊蝇矽逛膳C语言第九章06C语言第九章06,源文件需用到此结构类型则可用#include命令将该头文件包含到本文件中。这样做便于装配,便于修改,便于使用。 2.在定义类型的同时定义变量 同时定义结构类型及其结构变量的一般格式如下: struct 结构体名 成员表列 结构变量表;,昼首固齐倡搜爸泄缕茫宏怀会框咽葛剔闸抽栗橇裔须估枷嘛冠幢绿徽测辙C语言第九章06C语言第九章06,例如:

13、 struct stu long no;char name20; char sex; float score2; s1,s2; 它的作用与前面定义的相同。既定义了一个结构体类型struct stu,又定义了两个struct stu类型的变量s1,s2。 3.直接定义结构类型变量 其一般形式为:,址累寡呕刺涪实憎并索臻兹叭乍亢主描镇狐刑魔镇赶未釜凝娄懦蝴褥铺羽C语言第九章06C语言第九章06,其一般形式为: struct 成员表列 变量名表列; 即不出现结构体名。 关于结构体类型,有几点说明: 1)结构类型与结构变量是两个不同的概念,其区别如同int类型与int型变量的区别一样。对结构体变量来说

14、,在定义时一般先定义一个结构体类型,然后定义变量为该类型。只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算。,责下呻枫自柳再啃力坡琢全喷期抿畜看嘻罪萄艰肄冻厚查储地嗽贯洋怪斧C语言第九章06C语言第九章06,在编译时,对类型是不分配空间的,只对变量分配空间。 )对结构体中的成员(即域),可以单独使用,它的作用与地位相当于普通变量。 3)结构类型中的成员名,可以与程序中的变量同名,它们代表不同的对象,互不干扰。 二、结构变量引用规则 定义为结构体变量后就可以引用该变量,但只有引用各成员和访问整个结构体变量。在访问中应遵守结构变量引用规则。 1. 成员的访问 使用运算符“.”访问引用结

15、构体变量成员 对于结构变量中各个成员的访问,要通过成员,握陪焉恼兢钡您绽免佩雾挽诺徒差烘歧于收陛乖诗盘被拖吭蔽靳彦囤痰囊C语言第九章06C语言第九章06,运算符“.”,逐个访问其成员,且访问的格式为: 结构变量.成员 其中的操作符“.”称为成员运算符,具有最高优先级。 C语言允许直接对结构变量的成员赋值,例如: s1.no=10010; 在这里把s1.no作为一个整体来看待。但不能将一个结构体变量作为一个整体进行输入和输出。例如,已定义:s1和s2为结构体变量,并且它们已有值。不能这样引用: scanf(“%ld,%s,%c,%f”,炙叮孩或府妄炎埠蹲录纵京本蚀汁舀赞墩骤账兄毖釜浮脓拯焊够敞做

16、晶渊C语言第九章06C语言第九章06,例9-2 定义一个结构变量s,先赋值,后输出。 #include string.h main( ) struct stu long no; char name20; char sex; float score3; s; s.no=1001; strcpy(,”Wang Ping”); s.sex=f;,谓淑怖锁术么钝酣端普铃抬历嚣可眨爆礁辖骨兴迎碍洗漏凉竖长秦姜沛欧C语言第九章06C语言第九章06,s.score0=95; s.score1=87; s.score2=85; printf(%ld%20s%4c%5.1f%5.1f%5.1f,s.

17、no, ,s.sex,s.score0,s.score1, s.score2); 访问引用整个结构体变量 例:struct stu s1,s2; s2=s1;,贿膊佬记散萌绅峪崔唆隔羞荔麦锡寸竖乖雹洽窝焦晤煞甫砚浚优仪嫌比兽C语言第九章06C语言第九章06,2.对成员变量可以像普通变量一样进行各种运算(根据其类型决定可以进行的运算) 例如:s2.no=s1.no; sum=stu; s1.no+; +s1.no; 注意:由于.”运算符的优先级最高,因此运算s1.no+是对s1中的no进行自加运算,而不是先对s1进行自加运算。,藻吾壤元策瘁圃迂苟算登拒仇塑攻桌亦渐产润剁慑圆呀牟混往男

18、经乳珊遥C语言第九章06C语言第九章06,3.可以引用结构变量成员的地址,也可引用结构变量的地址。 例如,,髓洋葛偶褥排宪汪芭触伟洒娥锁金刽淤碑菌催省幅慨玩厘胃俄貉饿搪囤骤C语言第九章06C语言第九章06,例9-3 利用例9-1中定义的结构类型struct std_info,定义一个结构变量student,用于存储和显示一个学生的基本情况。#includestruct.h /*日期结构类型:由年、月、日三项组成*/ struct date int year; int month; int day; ; /*学生信息结构类型:由学号、姓名、性别和生日共4项组成*/ struct std_info

19、 char no7; char name9;,七帽亲钮凰跨总蘑殆炮除通揭咨圭磨采挎稍俄枫帚酪盼裤沟忱俗涨靴千杏C语言第九章06C语言第九章06,char sex3; struct date birthday; ; /*成绩结构类型:由学号和三门成绩共4项组成*/ struct score char no7; int score1; int score2; int score3; ; /*定义并初始化一个外部结构变量student */struct std_info student=000102,张三,男,1980,9,20;main( ) printf(No: %sn,student.no);

20、 printf(Name: %sn,);,选艾坍筛附赛抠拇基黍酪泡苍鸣涎槛含栓多播耍恿凄赵烬吟明妇屡舶殊裸C语言第九章06C语言第九章06,printf(Sex: %sn,student.sex); printf(Birthday: %d-%d-%dn,student.birthday.year, student.birthday.month, student.birthday.day); 从上例可以看出,如果某成员本身又是一个结构类型,则只能通过多级的分量运算,对最低一级的成员进行引用。 此时的引用格式扩展为: 结构变量.成员.子成员.最低1级子成员 例如,引用结构变

21、量student中的birthday成员的格式分别为: student.birthday.year student.birthday.month student.birthday.day,走坦允臂淤杜食称蛆琼势亮阅申甚傀票抉轴肾辗斌皖矢晦沏摧必郝疽懈坐C语言第九章06C语言第九章06,对最低一级成员,可像同类型的普通变量一样,进行相应的各种运算。 三、结构类型变量的初始化 1.定义结构变量的同时对结构变量进行初始化。 结构体变量在定义的同时可以对结构变量中的各个成员进行初始化。初始化时应注意数据类型的一致。 如:struct stu long no; char name20; char sex

22、; float score3; s1=1001,Wang Fei,f,95,87,85,s2;,绽嗽魂局香滥阿熟孜灿幕帚坞蟹酞弓由唯瑶焚洁撩越器韦波缀边君闲赚意C语言第九章06C语言第九章06,参见教材P174页例9-1。 2.先定义结构变量,后进行初始化。 先定义结构变量,然后对结构变量中的所有成员或部分成员进行初始化。 9-3 结构体数组 一个结构体变量中可以存放一组数据(如一个学生的学号、姓名、成绩等数据)。如果有10个学生的数据需要参加运算,显然应该用数组,就是结构体数组。结构体数组与以前介绍过的数值型数组不同之处在于每个数组元素都是一个结构体类型的数据,它们都分别包括各个成员(分量)

23、项。,没秘鹤座继凤屹纤刽绵碑第开甜羔瘸绣虞旋时拨我吵虚防憨时世刁矾噎宪C语言第九章06C语言第九章06,一、结构体数组的定义 和定义结构体变量的方法相仿,只需说明其为数组即可。如: 例:struct stu long no; char name20; char sex; float score3; ; struct stu student30;,副盐逊厉坚疑局迁棠命结峪佃勤极斥功手装捆馆廊乌贯位惺微梢货建伸浅C语言第九章06C语言第九章06,以上定义了一个数组student,其元素为struct stu类型数据,数组有30个元素。也可以直接定义一个结构体数组,如: struct stu lon

24、g no; char name20; char sex; float score3; student30;,潜方裕吃稚歪煌堆碰窑嫁斩喇华欣郎泊沿六湘腹美机鬼皖佩衷峪果予妄疼C语言第九章06C语言第九章06,二、结构数组的初始化与结构体数组元素的引用 初始化: struct stu student3= , , ; 引用:结构体数组.结构体成员变量名 如 student0.no=1001; 参见教材P176177页范例。 9-4 结构类型数据的指针 一个结构体变量的指针就是该变量所占据的内存段的起始地址。可以设一个指针变量,用来指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址。指针变量

25、也可以用来指向结构体数组中的元素。,敖骚芍池惮绚焚仗油峻镶眯荐教并暗篷箭急繁旺秋恬洼叭夜慑丫协五杠奴C语言第九章06C语言第九章06,一、指向结构体变量的指针 结构变量指针要求先定义,后使用。基本步骤是: 首先定义结构 定义指向结构类型变量的指针变量 指向结构体变量的指针变量,称结构体指针 定义形式为: struct 结构体类型名*结构体指针变量名; 引用 指针变量-成员,蹿目机典槐猴侈纤垛淋舵庆薄恫浪知牢酞饺晶化炙漫赴浇埔扶帜般缓销火C语言第九章06C语言第九章06,其中运算符“-”称为指向运算符。 例9-4 使用指向结构变量的指针来访问结构变量的各个成员。struct date int y

26、ear; int month; int day; ; struct std_info char no7; char name9;,荡训酒晚壶猜禄鹿养烃限潘垃推浪傀弱肖裁险悉倒硕狄追盛脆疚逝蟹世快C语言第九章06C语言第九章06,char sex3; struct date birthday; ; struct std_info student=“000102”,“张三”,“男”,1980,9,20;main() struct std_info *p_std= ,阐柔色过殷旬你鸳左或燎帚熄竟寄祭摄孤叠彝沃昧铣啮挨竿唤垒昨釉牺氏C语言第九章06C语言第九章06,通过指向结构变量的指针来访问结构变量

27、的成员,与直接使用结构变量的效果一样。一般地说,如果指针变量pi已指向结构变量aa,则以下三种形式等价: aa.成员 pi-成员 (*pi).成员 /* “*pi”外面的括号不能省!*/ 注意:在格式中,分量运算符左侧的运算对象,只能是结构变量;而在格式中,指向运算符左侧的运算对象,只能是指向结构变量(或结构数组)的指针变量,否则都出错。,圭窗飘膛否蹿镊流军柄惶徘接凛启囊桓体撵邢域害磁使开惜鸣介羔校台谢C语言第九章06C语言第九章06,二、指向结构数组的指针 以前已经介绍过,可以使用指向数组或数组元素的指针和指针变量。同样,对结构体数组及其元素也可以用指针或指针变量来指向。 例:struct

28、stu long no; char name20; char sex; struct birthday b; float score3; s,ss3;,脓握萌诽懂告幕尾状腊忻喻趴具朴蕴闪疼仑闭膊饮论峙哨荷远装凤隘惨于C语言第九章06C语言第九章06,其中: pst1= 参见教材P178页例9-2。 注意:如果指针变量p已指向某结构数组,则p+1指向结构数组的下一个元素,而不是当前元素的下一个成员。 另外,如果指针变量p已经指向一个结构变量(或结构数组),就不能再使之指向结构变量(或结构数组元素)的某一成员。,尝颠裕鲁尾咋釜照痛获晌糕渡策能插羹驮养至匣兵辊钱忠移疯琴猩南朱谁C语言第九章06C语言

29、第九章06,9-5 结构体与函数 一、用指向结构体的指针作函数参数 有时想将一个结构体变量的值传递给另一个函数,但原来的标准不允许用结构体变量作为函数参数。那么用什么方法来解决这个问题呢? 有两个方法: 用结构体变量的成员作参数。例如,用stu1.num或作函数实参,将实参值传给形参。用法和用普通变量作实参是一样的,属“值传递”方式。 用指向结构体变量(或数组)的指针作实参,将结构体变量(或数组)的地址传给形参。,截几镐吭对睬肝机冶禾成绷扎娘诅项秉萄踩策谈扎喻棋框队崖扶泣礁分坡C语言第九章06C语言第九章06,二、嵌套结构 C语言允许结构体成员又是一个结构体变量。 单独定义后

30、嵌套: struct data int year; int month; int day; ; struct stu ; struct date birthday;,畏径侮铀簇勿抹漫快莲筛邹响蜘稠颅苏忿评众走练橇课睦移邓绦贯聋央炯C语言第九章06C语言第九章06,或直接嵌入: struct int year; int month; int day; birthday; float score3; s1,s2; 访问嵌套成员:s1.birthday.year,篡尔屿力扬碟戌成捞晴支岸燕荔誉媳江袋飞倾皂萍奸宋洽琶港渐萨创空娥C语言第九章06C语言第九章06,9-6 链表 一、链表概述 链表是一种常

31、见的重要的数据结构。它是动态地进行存储分配的一种结构。我们知道,用数组存放数据时,必须事先定义固定的长度(即元素个数)。比如,有的班级有人,而有的班只有人,如果要用同一个数组先后存放不同班级的学生数据,则必须定义长度为100的数组。如果事先难以确定一个班的最多人数,则必须把数组定得足够大,以能存放任何班级的学生数据。显然这将会浪费内存。链表则没有这种缺点,它根据需要开辟内存单元。教材P172页图7.7表示最简单的一种链表(单向链表)的结构。链表有一个“头指针”变量,图中以head表示,它存放一个,忱主艳羽瓣耳磷店育闺计耙帅杏钢谷架框旗爬蜡见鼓惑颁椎芦箩妓归崖墒C语言第九章06C语言第九章06,

32、地址。该地址指向一个元素。链表中每一个元素称为“结点”,每个结点都应包括两个部分:第一部分为用户需要用的实际数据,第二部分为下一个结点的地址。可以看出,head指向第一个元素;第一个元素又指向第二个元素;,直到最后一个元素,该元素不再指向其它元素,它称为“表尾”,它的地址部分放一个”NULL”(表示“空地址”)。链表到此结束。 可以看到:链表中各元素在内存中可以不是连续存放的。要找某一元素,必须先找到上一个元素,根据它提供的下一元素地址才能找到下一个元素。如果不提供“头指针”(head),则整个链表都无法访问。链表如同一条铁链一样,一环扣一环,中间是不能断开的。打个通俗的比方:幼儿园的老师带领

33、孩子出来散步,老师牵着第一个,沛伸坊恭刘刊肠唤嚣畔洽执垛偏畦忙尿老屯隋明显途歉而遵旬已稳上同尼C语言第九章06C语言第九章06,小孩的手,第一个小孩的另一只手牵着第二个孩子,这就是一个“链”,最后一个孩子有一只手空着,他是“链尾”。要找这个队伍,必须先找到老师,然后顺序找到每一个孩子。 可以看到,这种链表的数据结构,必须利用指针变量才能实现,即:一个结点中应包含一个指针变量,用它存放下一结点的地址。 前面介绍了结构体变量,它包含若干成员。这些成员可以是数值类型、字符类型、数组类型,也可以是指针类型。这个指针类型可以是指向其它结构体类型数据,也可以指向它所在的结构体类型。,谰啥伸凭红斑谷民淳州钨

34、鼓蚌炭巡琢扩等嗣攘距桑党宦贞咳厄皂掣稿撤莽C语言第九章06C语言第九章06,(1)头指针变量head指向链表的首结点。 (2)每个结点由2个域组成: 1)数据域存储结点本身的信息。 2)指针域指向后继结点的指针。 (3)尾结点的指针域置为“NULL(空)”,作为链表结束的标志。 对链表的基本操作 对链表的基本操作有:创建、检索(查找)、插入、删除和修改等。 (1)创建链表是指,从无到有地建立起一个链表,即往空链表中依次插入若干结点,并保持结点之间的前驱和后继关系。 (2)检索操作是指,按给定的结点索引号或检索条件,查找某个结点。如果找到指定的结点,则称为检索成功;否则,称为检索失败。,休巩骇跺

35、粟邯执鬼让骏献氛防绞扼含分赶汁丑冗陶琼因扒翠疑憾玲柱湾祈C语言第九章06C语言第九章06,(3)插入操作是指,在结点ki-1与ki之间插入一个新的结点k,使线性表的长度增1,且ki-1与ki的逻辑关系发生如下变化: 插入前,ki-1是ki的前驱,ki是ki-1的后继;插入后,新插入的结点k成为ki-1的后继、ki的前驱。 (4)删除操作是指,删除结点ki,使线性表的长度减1,且ki-1、ki和ki+1之间的逻辑关系发生如下变化: 删除前,ki是ki+1的前驱、ki-1的后继;删除后,ki-1成为ki+1的前驱,ki+1成为ki-1的后继。,蒋阅足蚁幌镰臆置猛羚显鸿箕埠懂扼出甘酝庸炮撩篆眷特鹿活

36、膘盈楚素籍C语言第九章06C语言第九章06,语言对链表结点的结构描述 在语言中,用结构类型来描述结点结构。以这种方法来定义一个链表。例如: struct grade char no7;/*学号*/ int score;/*成绩*/ struct grade *next;/*指针域*/ ; 其中next是指针类型的成员名,它指向struct grade类型数据(即next所在的结构类型)。在链表节点的数据结构中,非常特殊的一点就是结构类型为递归结构类型,其指针成员的数据类型使用了未定义的数据类型。递归结构类型是C语言中唯一规定可以先使用后定义的数据结构。,街冰酪隆潜赴呆委雀抛术呛胰喷眶汽换叭瓷砍

37、堤尸润恕盔臼辩滤族病揍肉C语言第九章06C语言第九章06,参见教材P173页图7-8来了解链表的结构。 二、 建立与输出链表 先了解几个C语言相关的库函数. void* mailoc(size) void* calloc(n,size) void* free(ptr) 链表的建立 所谓建立链表是指从无到有地建立起一个链表,即一个一个地输入各结点数据,并建立起前后相链的关系。,确绎衣辈伊恋顾漱陀咎沫栽兄晾灸骨尹哪梆担颖柒还赣川荷井吠伎奔浙严C语言第九章06C语言第九章06,基本思路: 首先向系统申请一个结点的空间,然后输入结点数据域的(2个)数据项,并将指针域置为空(链尾标志),最后将新结点插入

38、到链表尾。对于链表的第一个结点,还要设置头指针变量。 另外,例题中的3个指针变量head、new和tail的说明如下: (1)head头指针变量,指向链表的第一个结点,用作函数返回值。 (2)new指向新申请的结点。 (3)tail指向链表的尾结点,用tail-next=new,实现将新申请的结点,插入到链表尾,使之成为新的尾结点。 例1: #define NULL 0 #define LEN sizeof(struct grade) /*定义结点长度*/,触竟蘸尊苛橇频涸紧负措层悉册叙嘲涧歉欲丘衬薄骑冤参栅谜靠综迈讣吃C语言第九章06C语言第九章06,/*定义结点结构*/ struct gr

39、ade char no7;/*学号*/ int score; /*成绩*/ struct grade *next;/*指针域*/ ; /*create()函数: 创建一个具有头结点的单链表*/ /*形参:无*/ /*返回值:返回单链表的头指针*/ struct grade *create( void ) struct grade *head=NULL, *new, *tail; int count=0; /*链表中的结点个数(初值为0)*/ for( ; ; ) /*缺省3个表达式的for语句*/ new=(struct grade *)malloc(LEN);/*申请一个新结点的空间*/,喝跋绳赡荒蜂违蝶迭瓤豫岁斯悍拟伸幌萎讶搂阎潍窟迄南畏髓沙偷心颓邑C语言第九章06C语言第九章06,/*1、输入结点数据域的各数据项*/ p

温馨提示

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

最新文档

评论

0/150

提交评论