收藏 分享(赏)

C语言第九章06.ppt

上传人:buyk185 文档编号:7313714 上传时间:2019-05-14 格式:PPT 页数:54 大小:111KB
下载 相关 举报
C语言第九章06.ppt_第1页
第1页 / 共54页
C语言第九章06.ppt_第2页
第2页 / 共54页
C语言第九章06.ppt_第3页
第3页 / 共54页
C语言第九章06.ppt_第4页
第4页 / 共54页
C语言第九章06.ppt_第5页
第5页 / 共54页
点击查看更多>>
资源描述

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

2、score addr10010 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语言提供了这样一种数据结构,它称为结构体(struc

3、ture)。它相当于其它高级语言中的“记录”,它可以将不同数据类型、但相互关联的一组数据,组合成一个有机整体来使用。 例如: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等不同类型的数据项。应当注意:struct stud

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

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

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

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

8、下形式: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;定义变量后,系统编译时,分配存储空间,例s1如下::变量名 占内存字节数no 4name20

10、20sex 1score3 12,秸蹿抚轩坞沤旦鱼他阑迈耽寝厕旨丫友夷非漾菜滚脆钎驻睛绞纳莲爸爱姿C语言第九章06C语言第九章06,注意:s1变量成员是不同数据类型连续存储,但s1、s2不一定是连续存储。 应当注意:将一个变量定义为标准类型(基本数据类型)与定义为结构体类型不同之处在于:后者不仅要求指定变量为结构体类型,而且要求指定为某一特定的结构体类型(例如,struct stu),不能只指定为“struct型”而不指定结构体名。即定义结构变量时必须同时指定结构类型和结构名。而在定义变量为整型时,只需指定为int型即可。换句话说,可以定义许多种具体的结构体类型。为了使用方便,人们通常用一个符

11、号常量代表一个结构体类型。在程序开头,用define STUDENT struct stu这样在程序中,STUDENT 与 struct stu完全等效。 这时的结构类型定义可以改写为:,慕碰护施反莉熏感叔壹吸燎哥燃劲鹰法诀竹瞻寥瞎枢井瞳碉琴秤椰艘谅捅C语言第九章06C语言第九章06,STUDENT long no;char name20;char sex;float score3;然后可以直接用STUDENT定义变量。如:STUDENT s1, s2;用这种方法定义变量和用int、float定义变量的形式相仿,不必再写关键字struct。如果程序规模比较大,往往将对结构体类型的定义集中放到一

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

13、用与前面定义的相同。既定义了一个结构体类型struct stu,又定义了两个struct stu类型的变量s1,s2。 3.直接定义结构类型变量其一般形式为:,址累寡呕刺涪实憎并索臻兹叭乍亢主描镇狐刑魔镇赶未釜凝娄懦蝴褥铺羽C语言第九章06C语言第九章06,其一般形式为:struct成员表列变量名表列;即不出现结构体名。关于结构体类型,有几点说明:1)结构类型与结构变量是两个不同的概念,其区别如同int类型与int型变量的区别一样。对结构体变量来说,在定义时一般先定义一个结构体类型,然后定义变量为该类型。只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算。,责下呻枫自柳再啃力坡琢全喷

14、期抿畜看嘻罪萄艰肄冻厚查储地嗽贯洋怪斧C语言第九章06C语言第九章06,在编译时,对类型是不分配空间的,只对变量分配空间。 )对结构体中的成员(即“域“),可以单独使用,它的作用与地位相当于普通变量。 3)结构类型中的成员名,可以与程序中的变量同名,它们代表不同的对象,互不干扰。二、结构变量引用规则定义为结构体变量后就可以引用该变量,但只有引用各成员和访问整个结构体变量。在访问中应遵守结构变量引用规则。 1. 成员的访问使用运算符“.”访问引用结构体变量成员对于结构变量中各个成员的访问,要通过成员,握陪焉恼兢钡您绽免佩雾挽诺徒差烘歧于收陛乖诗盘被拖吭蔽靳彦囤痰囊C语言第九章06C语言第九章06

15、,运算符“.”,逐个访问其成员,且访问的格式为: 结构变量.成员 其中的操作符“.”称为成员运算符,具有最高优先级。C语言允许直接对结构变量的成员赋值,例如: s1.no=10010;在这里把s1.no作为一个整体来看待。但不能将一个结构体变量作为一个整体进行输入和输出。例如,已定义:s1和s2为结构体变量,并且它们已有值。不能这样引用:scanf(“%ld,%s,%c,%f”,炙叮孩或府妄炎埠蹲录纵京本蚀汁舀赞墩骤账兄毖釜浮脓拯焊够敞做晶渊C语言第九章06C语言第九章06,例9-2 定义一个结构变量s,先赋值,后输出。 #include “string.h“ main( ) struct s

16、tu long no;char name20;char sex;float score3;s;s.no=1001;strcpy(s.name,”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.no, s.name,s.sex,s.score0,s.score1,s.score2); 访问引用整个结构体变量 例:struct stu s1,s2;s2=s1;,

17、贿膊佬记散萌绅峪崔唆隔羞荔麦锡寸竖乖雹洽窝焦晤煞甫砚浚优仪嫌比兽C语言第九章06C语言第九章06,2.对成员变量可以像普通变量一样进行各种运算(根据其类型决定可以进行的运算)例如:s2.no=s1.no;sum=stu;s1.no+;+s1.no;注意:由于.”运算符的优先级最高,因此运算s1.no+是对s1中的no进行自加运算,而不是先对s1进行自加运算。,藻吾壤元策瘁圃迂苟算登拒仇塑攻桌亦渐产润剁慑圆呀牟混往男经乳珊遥C语言第九章06C语言第九章06,3.可以引用结构变量成员的地址,也可引用结构变量的地址。例如,,髓洋葛偶褥排宪汪芭触伟洒娥锁金刽淤碑菌催省幅慨玩厘胃俄貉饿搪囤骤C语言第九章

18、06C语言第九章06,例9-3 利用例9-1中定义的结构类型struct std_info,定义一个结构变量student,用于存储和显示一个学生的基本情况。 #include“struct.h“ /*日期结构类型:由年、月、日三项组成*/struct date int year; int month;int day; /*学生信息结构类型:由学号、姓名、性别和生日共4项组成*/ struct std_info char no7; char name9;,七帽亲钮凰跨总蘑殆炮除通揭咨圭磨采挎稍俄枫帚酪盼裤沟忱俗涨靴千杏C语言第九章06C语言第九章06,char sex3; struct dat

19、e 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); printf(“Name: %sn“,student.name);,选艾坍筛附赛抠拇基黍酪泡苍鸣涎槛含栓多播耍恿凄赵烬吟明妇屡舶殊裸C语言第九章06C语言第九章06,printf

20、(“Sex: %sn“,student.sex); printf(“Birthday: %d-%d-%dn“,student.birthday.year,student.birthday.month, student.birthday.day); 从上例可以看出,如果某成员本身又是一个结构类型,则只能通过多级的分量运算,对最低一级的成员进行引用。 此时的引用格式扩展为:结构变量.成员.子成员.最低1级子成员 例如,引用结构变量student中的birthday成员的格式分别为:student.birthday.yearstudent.birthday.monthstudent.birthday

21、.day,走坦允臂淤杜食称蛆琼势亮阅申甚傀票抉轴肾辗斌皖矢晦沏摧必郝疽懈坐C语言第九章06C语言第九章06,对最低一级成员,可像同类型的普通变量一样,进行相应的各种运算。 三、结构类型变量的初始化 1.定义结构变量的同时对结构变量进行初始化。 结构体变量在定义的同时可以对结构变量中的各个成员进行初始化。初始化时应注意数据类型的一致。 如:struct stu long no;char name20;char sex;float score3;s1=1001,“Wang Fei“,f,95,87,85,s2;,绽嗽魂局香滥阿熟孜灿幕帚坞蟹酞弓由唯瑶焚洁撩越器韦波缀边君闲赚意C语言第九章06C语言

22、第九章06,参见教材P174页例9-1。 2.先定义结构变量,后进行初始化。先定义结构变量,然后对结构变量中的所有成员或部分成员进行初始化。9-3 结构体数组一个结构体变量中可以存放一组数据(如一个学生的学号、姓名、成绩等数据)。如果有10个学生的数据需要参加运算,显然应该用数组,就是结构体数组。结构体数组与以前介绍过的数值型数组不同之处在于每个数组元素都是一个结构体类型的数据,它们都分别包括各个成员(分量)项。,没秘鹤座继凤屹纤刽绵碑第开甜羔瘸绣虞旋时拨我吵虚防憨时世刁矾噎宪C语言第九章06C语言第九章06,一、结构体数组的定义和定义结构体变量的方法相仿,只需说明其为数组即可。如: 例:st

23、ruct stu long no;char name20;char sex;float score3;struct stu student30;,副盐逊厉坚疑局迁棠命结峪佃勤极斥功手装捆馆廊乌贯位惺微梢货建伸浅C语言第九章06C语言第九章06,以上定义了一个数组student,其元素为struct stu类型数据,数组有30个元素。也可以直接定义一个结构体数组,如: struct stu long no;char name20;char sex;float score3;student30;,潜方裕吃稚歪煌堆碰窑嫁斩喇华欣郎泊沿六湘腹美机鬼皖佩衷峪果予妄疼C语言第九章06C语言第九章06,二、

24、结构数组的初始化与结构体数组元素的引用 初始化: struct stu student3= , , ; 引用:结构体数组.结构体成员变量名 如 student0.no=1001; 参见教材P176177页范例。 9-4 结构类型数据的指针一个结构体变量的指针就是该变量所占据的内存段的起始地址。可以设一个指针变量,用来指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址。指针变量也可以用来指向结构体数组中的元素。,敖骚芍池惮绚焚仗油峻镶眯荐教并暗篷箭急繁旺秋恬洼叭夜慑丫协五杠奴C语言第九章06C语言第九章06,一、指向结构体变量的指针结构变量指针要求先定义,后使用。基本步骤是: 首先定义

25、结构 定义指向结构类型变量的指针变量 指向结构体变量的指针变量,称结构体指针 定义形式为: struct 结构体类型名 *结构体指针变量名; 引用指针变量-成员,蹿目机典槐猴侈纤垛淋舵庆薄恫浪知牢酞饺晶化炙漫赴浇埔扶帜般缓销火C语言第九章06C语言第九章06,其中运算符“-”称为指向运算符。例9-4 使用指向结构变量的指针来访问结构变量的各个成员。 struct date int year; int month;int day; struct std_info char no7; char name9;,荡训酒晚壶猜禄鹿养烃限潘垃推浪傀弱肖裁险悉倒硕狄追盛脆疚逝蟹世快C语言第九章06C语言第九

26、章06,char sex3; struct date birthday; struct std_info student=“000102”,“张三”,“男”,1980,9,20; main() struct std_info *p_std=,阐柔色过殷旬你鸳左或燎帚熄竟寄祭摄孤叠彝沃昧铣啮挨竿唤垒昨釉牺氏C语言第九章06C语言第九章06,通过指向结构变量的指针来访问结构变量的成员,与直接使用结构变量的效果一样。一般地说,如果指针变量pi已指向结构变量aa,则以下三种形式等价: aa.成员 pi-成员 (*pi).成员 /* “*pi”外面的括号不能省!*/ 注意:在格式中,分量运算符左侧的运算

27、对象,只能是结构变量;而在格式中,指向运算符左侧的运算对象,只能是指向结构变量(或结构数组)的指针变量,否则都出错。,圭窗飘膛否蹿镊流军柄惶徘接凛启囊桓体撵邢域害磁使开惜鸣介羔校台谢C语言第九章06C语言第九章06,二、指向结构数组的指针 以前已经介绍过,可以使用指向数组或数组元素的指针和指针变量。同样,对结构体数组及其元素也可以用指针或指针变量来指向。 例:struct stu long no;char name20;char sex; struct birthday b;float score3;s,ss3;,脓握萌诽懂告幕尾状腊忻喻趴具朴蕴闪疼仑闭膊饮论峙哨荷远装凤隘惨于C语言第九章06

28、C语言第九章06,其中: &s:取结构体变量s的起始地址 &s.no:取结构体变量成员s.no的地址 &ss0:取结构体数组元素ss0的地址。ss是结构数组,其名字表示该字符数组的起始地址。 &ss0.no:取数组元素ss0的结构体成员的地址 &ss1.score:数组元素ss1的结构体成员的首地址。score是一个浮点数组,其名字表示该数组的起始地址。 &ss1.score1:最终成员的地址 &s.b.year:变量s中嵌套变量b的成员s.b.year的地址。,腐磊蔗存济浸袭饯晓熏尤匝爬齿椽豢椰咕瀑罐奉割汽球竟码窗朱滚迟忍鹊C语言第九章06C语言第九章06,例:struct stu *pst

29、1,*pst2;pst1=参见教材P178页例9-2。注意:如果指针变量p已指向某结构数组,则p+1指向结构数组的下一个元素,而不是当前元素的下一个成员。另外,如果指针变量p已经指向一个结构变量(或结构数组),就不能再使之指向结构变量(或结构数组元素)的某一成员。,尝颠裕鲁尾咋釜照痛获晌糕渡策能插羹驮养至匣兵辊钱忠移疯琴猩南朱谁C语言第九章06C语言第九章06,9-5 结构体与函数 一、用指向结构体的指针作函数参数有时想将一个结构体变量的值传递给另一个函数,但原来的标准不允许用结构体变量作为函数参数。那么用什么方法来解决这个问题呢? 有两个方法: 用结构体变量的成员作参数。例如,用stu1.n

30、um或stu1.name作函数实参,将实参值传给形参。用法和用普通变量作实参是一样的,属“值传递”方式。 用指向结构体变量(或数组)的指针作实参,将结构体变量(或数组)的地址传给形参。,截几镐吭对睬肝机冶禾成绷扎娘诅项秉萄踩策谈扎喻棋框队崖扶泣礁分坡C语言第九章06C语言第九章06,二、嵌套结构 C语言允许结构体成员又是一个结构体变量。 单独定义后嵌套: struct data int year;int month;int day; ; struct stu ; struct date birthday;,畏径侮铀簇勿抹漫快莲筛邹响蜘稠颅苏忿评众走练橇课睦移邓绦贯聋央炯C语言第九章06C语言第

31、九章06,或直接嵌入: struct int year;int month;int day; birthday;float score3; s1,s2; 访问嵌套成员:s1.birthday.year,篡尔屿力扬碟戌成捞晴支岸燕荔誉媳江袋飞倾皂萍奸宋洽琶港渐萨创空娥C语言第九章06C语言第九章06,9-6 链表 一、链表概述链表是一种常见的重要的数据结构。它是动态地进行存储分配的一种结构。我们知道,用数组存放数据时,必须事先定义固定的长度(即元素个数)。比如,有的班级有人,而有的班只有人,如果要用同一个数组先后存放不同班级的学生数据,则必须定义长度为100的数组。如果事先难以确定一个班的最多人

32、数,则必须把数组定得足够大,以能存放任何班级的学生数据。显然这将会浪费内存。链表则没有这种缺点,它根据需要开辟内存单元。教材P172页图7.7表示最简单的一种链表(单向链表)的结构。链表有一个“头指针”变量,图中以head表示,它存放一个,忱主艳羽瓣耳磷店育闺计耙帅杏钢谷架框旗爬蜡见鼓惑颁椎芦箩妓归崖墒C语言第九章06C语言第九章06,地址。该地址指向一个元素。链表中每一个元素称为“结点”,每个结点都应包括两个部分:第一部分为用户需要用的实际数据,第二部分为下一个结点的地址。可以看出,head指向第一个元素;第一个元素又指向第二个元素;,直到最后一个元素,该元素不再指向其它元素,它称为“表尾”

33、,它的地址部分放一个”NULL”(表示“空地址”)。链表到此结束。可以看到:链表中各元素在内存中可以不是连续存放的。要找某一元素,必须先找到上一个元素,根据它提供的下一元素地址才能找到下一个元素。如果不提供“头指针”(head),则整个链表都无法访问。链表如同一条铁链一样,一环扣一环,中间是不能断开的。打个通俗的比方:幼儿园的老师带领孩子出来散步,老师牵着第一个,沛伸坊恭刘刊肠唤嚣畔洽执垛偏畦忙尿老屯隋明显途歉而遵旬已稳上同尼C语言第九章06C语言第九章06,小孩的手,第一个小孩的另一只手牵着第二个孩子,这就是一个“链”,最后一个孩子有一只手空着,他是“链尾”。要找这个队伍,必须先找到老师,然

34、后顺序找到每一个孩子。可以看到,这种链表的数据结构,必须利用指针变量才能实现,即:一个结点中应包含一个指针变量,用它存放下一结点的地址。前面介绍了结构体变量,它包含若干成员。这些成员可以是数值类型、字符类型、数组类型,也可以是指针类型。这个指针类型可以是指向其它结构体类型数据,也可以指向它所在的结构体类型。,谰啥伸凭红斑谷民淳州钨鼓蚌炭巡琢扩等嗣攘距桑党宦贞咳厄皂掣稿撤莽C语言第九章06C语言第九章06,(1)头指针变量head指向链表的首结点。 (2)每个结点由2个域组成:1)数据域存储结点本身的信息。2)指针域指向后继结点的指针。 (3)尾结点的指针域置为“NULL(空)”,作为链表结束的

35、标志。对链表的基本操作对链表的基本操作有:创建、检索(查找)、插入、删除和修改等。 (1)创建链表是指,从无到有地建立起一个链表,即往空链表中依次插入若干结点,并保持结点之间的前驱和后继关系。 (2)检索操作是指,按给定的结点索引号或检索条件,查找某个结点。如果找到指定的结点,则称为检索成功;否则,称为检索失败。,休巩骇跺粟邯执鬼让骏献氛防绞扼含分赶汁丑冗陶琼因扒翠疑憾玲柱湾祈C语言第九章06C语言第九章06,(3)插入操作是指,在结点ki-1与ki之间插入一个新的结点k,使线性表的长度增1,且ki-1与ki的逻辑关系发生如下变化: 插入前,ki-1是ki的前驱,ki是ki-1的后继;插入后,

36、新插入的结点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的后继。,蒋阅足蚁幌镰臆置猛羚显鸿箕埠懂扼出甘酝庸炮撩篆眷特鹿活膘盈楚素籍C语言第九章06C语言第九章06,语言对链表结点的结构描述 在语言中,用结构类型来描述结点结构。以这种方法来定义一个链表。例如: struct grade char no7; /*学号*/int score; /*成绩*/struct grade *next; /*

37、指针域*/;其中next是指针类型的成员名,它指向struct grade类型数据(即next所在的结构类型)。在链表节点的数据结构中,非常特殊的一点就是结构类型为递归结构类型,其指针成员的数据类型使用了未定义的数据类型。递归结构类型是C语言中唯一规定可以先使用后定义的数据结构。,街冰酪隆潜赴呆委雀抛术呛胰喷眶汽换叭瓷砍堤尸润恕盔臼辩滤族病揍肉C语言第九章06C语言第九章06,参见教材P173页图7-8来了解链表的结构。 二、 建立与输出链表先了解几个C语言相关的库函数.void* mailoc(size)void* calloc(n,size)void* free(ptr) 链表的建立所谓建

38、立链表是指从无到有地建立起一个链表,即一个一个地输入各结点数据,并建立起前后相链的关系。,确绎衣辈伊恋顾漱陀咎沫栽兄晾灸骨尹哪梆担颖柒还赣川荷井吠伎奔浙严C语言第九章06C语言第九章06,基本思路:首先向系统申请一个结点的空间,然后输入结点数据域的(2个)数据项,并将指针域置为空(链尾标志),最后将新结点插入到链表尾。对于链表的第一个结点,还要设置头指针变量。 另外,例题中的3个指针变量head、new和tail的说明如下: (1)head头指针变量,指向链表的第一个结点,用作函数返回值。 (2)new指向新申请的结点。 (3)tail指向链表的尾结点,用tail-next=new,实现将新申

39、请的结点,插入到链表尾,使之成为新的尾结点。 例1:#define NULL 0 #define LEN sizeof(struct grade) /*定义结点长度*/,触竟蘸尊苛橇频涸紧负措层悉册叙嘲涧歉欲丘衬薄骑冤参栅谜靠综迈讣吃C语言第九章06C语言第九章06,/*定义结点结构*/ struct grade char no7; /*学号*/int score; /*成绩*/struct grade *next; /*指针域*/; /*create()函数: 创建一个具有头结点的单链表*/ /*形参:无*/ /*返回值:返回单链表的头指针*/ struct grade *create( v

40、oid ) struct grade *head=NULL, *new, *tail;int count=0; /*链表中的结点个数(初值为0)*/for( ; ; ) /*缺省3个表达式的for语句*/ new=(struct grade *)malloc(LEN); /*申请一个新结点的空间*/,喝跋绳赡荒蜂违蝶迭瓤豫岁斯悍拟伸幌萎讶搂阎潍窟迄南畏髓沙偷心颓邑C语言第九章06C语言第九章06,/*1、输入结点数据域的各数据项*/ printf(“Input the number of student No.%d(6 bytes): “, count+1); scanf(“%6s“, new

41、-no); if(strcmp(new-no,“000000“)=0) /*如果学号为6个0,则退出*/ free(new); /*释放最后申请的结点空间*/break; /*结束for语句*/ printf(“Input the score of the student No.%d: “, count+1); scanf(“%d“, /*3、将新结点插入到链表尾,并设置新的尾指针*/,兔拦箕典脑美贾竣司獭涨涤言磊颧绞税竣咕裳茎汰痪颖徐松蓑士刽犁且词C语言第九章06C语言第九章06,if(count=1) head=new; /*是第一个结点, 置头指针*/else tail-next=new

42、; /*非首结点, 将新结点插入到链表尾*/tail=new; /*设置新的尾结点*/return(head); ,袱僧放文食婶塔阂识响决惋摩温遇责蘸苑髓浊笨蜗歌煞婶衬途步混森惹描C语言第九章06C语言第九章06,链表的输出输出链表就是将链表中各结点的数据依次输出。这个问题比较容易处理。首先要知道链表头元素的地址,也就是要知道head的值。然后设一个指针变量p,先指向第一个结点,输出所指的结点,然后使后移一个结点,再输出,直到链表的尾结点。参见教材P174页例7-7。 三、链表的删除与插入操作 例2: 编写一个insert()函数,完成在单链表的第i个结点后插入1个新结点的操作。当i=0时,表

43、示新结点插入到第一个结点之前,成为链表新的首结点。,混智场阳孤膝倒如酪烃性篡岗煮打汹选溉隙盾渤的泞钉肤泰宋斟死竿阐蚊C语言第九章06C语言第九章06,基本思路: 通过单链表的头指针,首先找到链表的第一个结点;然后顺着结点的指针域找到第i个结点,最后将新结点插入到第i个结点之后。 /*函数功能:在单链表的第i个结点后插入1个新结点*/ /*函数参数:head为单链表的头指针,new指向要插入的新结点,i为结点索引号*/ /*函数返回值:单链表的头指针*/ struct grade *insert(struct grade *head, struct grade *new, int i) stru

44、ct grade *pointer;/*将新结点插入到链表中*/ if(head=NULL) head=new, new-next=NULL; /*将新结点插入到1个空链表中*/ else /*非空链表*/,虐府辈詹京遮梨巢流朔跺月参吞搬譬陵衙校住找藤爬禁梗碑阂割桂痴孪夺C语言第九章06C语言第九章06,if(i=0) new-next=head, head=new; /*使新结点成为 链表新的首结点*/else /*其他位置*/ pointer=head;/*查找单链表的第i个结点(pointer指向它)*/for(; pointer!=NULL ,鸟粉凿救蔗价熬唁堕羹噬絮啤蝶丈攀兢赤躲灿授肛关续懊棱槐暴被滨乔孟C语言第九章06C语言第九章06,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报