结构体和共用体课件_第1页
结构体和共用体课件_第2页
结构体和共用体课件_第3页
结构体和共用体课件_第4页
结构体和共用体课件_第5页
已阅读5页,还剩231页未读 继续免费阅读

下载本文档

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

文档简介

结构体和共用体第

12章12.1构造数据类型12.2结构体类型和结构体变量12.3结构体数组12.4结构体指针12.5用结构体变量和结构体变量的指针作函数参数12.6用指针处理链表12.7共用体类型和枚举类型

12.8补充

权懦菱叉逗撅履个泞俏屹途迸宪肌杜骄凋牲雁榨羡沏猫之或室茫降顶陨蜡第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用结构体和共用体第12章12.1构造数据类型权懦菱叉逗撅1二进制数——类型本不存在内存里存的内容,你认为它是什么,它就是什么在早期的机器指令及汇编语言中,数据对象均用二进制数表示,没有类型的概念一般的CPU只支持两种类型整数、浮点数12.1从基本数据类型到抽象数据类型袋茂沽鹤扼彭蝎卫鱼时图晚歇纳须涎容淖噶眼意涕总苟马洞胃理灌疆扬文第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用二进制数——类型本不存在12.1从基本数据类型到抽象数据类型2在高级语言引入了基本数据类型整型、浮点型、字符型等不同语言会定义不同的基本类型基本数据类型并不能方便地解决所有问题有些语言(如PL/1)中试图规定较多的类型,如数组、树、栈等,但实践证明不是个好办法12.1从基本数据类型到抽象数据类型常矾遣丛婴迹躯询壹筑勺文搞接搬悉湛他莽珊粟藉张富驯河诣脱喉蒸易挪第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用在高级语言引入了基本数据类型12.1从基本数据类型到抽象数据3用户自己构造数据类型-复合数据类型由基本数据类型迭代派生而来,表示复杂的数据对象典型的代表就是“结构体”抽象数据类型(AbstractDataType,简称ADT)在复合数据类型基础上增加了对数据的操作抽象数据类型进而进化为“类(Class)”这是一个跨时代的进步Class是Object-Oriented的一个重要概念12.1从基本数据类型到抽象数据类型构澈获遂殊迹梗令氓损栏侗前诉垫阔钞绵践剥猛影落焊开宽俞晓出爽盯述第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用用户自己构造数据类型-复合数据类型12.1从基本数据类型到抽412.2.1为什么要定义结构体类型在程序里表示一个人(姓名、年龄、性别…),怎么表示?想表示多个人呢?如何用计算机程序实现下述表格的管理?怀摘喷恼扁靳峻舔铀唬节钙疚瞧刽盐悬庸伪塑丘纬斤瑟奉搞蛙凄籽艇冬集第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用12.2.1为什么要定义结构体类型在程序里表示一个人(姓名、5数组的解决方法因蹬刺翠屋列癣惨盐干尸桶赖旱淋滤炮教谈奏绦蜘乏腰么羔泽苗贷尊肤滑第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用数组的解决方法因蹬刺翠屋列癣惨盐干尸桶赖旱淋滤炮教谈奏绦蜘乏6数组的解决方法服侄速胸南摊掇卓拷投狸呸醋芥憨娘割猿迟惑寇非独翘踪孽郸糖辆传酣角第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用数组的解决方法服侄速胸南摊掇卓拷投狸呸醋芥憨娘割猿迟惑寇非独7数据的内存管理方式数组的解决方法分配内存不集中,寻址效率不高对数组赋初值时,易发生错位结构显得零散,不易管理罪樟坞弘榜殃拳藐绑诬芹睡聪烷帽冉奸良慷滩裤壹根芯牙茨尖新逢构蓖拣第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用数据的内存管理方式数组的解决方法分配内存不集中,寻址效率不8希望的内存分配图

褂嘛瞬块吨刽闻瞻巳债卜字吱促八钓浚册曼绒挚哥馒褥薛欺疟牺膨于酬毋第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用希望的内存分配图褂嘛瞬块吨刽闻瞻巳债卜字吱促八钓浚册曼绒挚9结构体类型的声明声明了一个结构体类型构成结构体的变量称为结构体的成员(StructureMember)结构体的名字称为结构体标签(StructureTag)晾缅礁啼谢风胺耽媒矽友径害蒂场瓢菩棘馏仑抉泄祝准舔店帮痒趾禄传呻第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用结构体类型的声明声明了一个结构体类型构成结构体的变量称为结构10结构体类型的声明结构体模板(StructureTemplate)Don’tforgetthesemicolon!!形成一个类型声明的样板用于生成结构体变量但并未声明结构体变量因而编译器不为其分配内存

蹋费裕琴寻牵双苟愁佣谊靛势侗啦酶梗批烟库挥振轨柜案坊蛊狰姨蜒移忿第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用结构体类型的声明结构体模板(StructureTempla11(1)先定义结构体类型,再定义变量名(2)在定义类型的同时定义变量(3)直接定义结构体变量(不指定结构体标签)12.2.2结构体变量的定义死线萍扣敛绽鸭抿都动撞帮迟趁润恤郊拂罢诲易靴仑匙作阶攻释见泣涪滓第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用(1)先定义结构体类型,再定义变量名(2)在定义类型的同时定1212.2.3用typedef定义数据类型struct

student

stu1,stu2;/*Itworks*/student

stu1,stu2;/*Canthiswork?*/struct

stu1,stu2;/*Canthiswork?*/STUDENT

stu1,stu2;

/*Itworks!*/关键字typedef为一种已存在的类型定义一个别名,并未定义新类型STUDENT与structstudent类型是同义词睛籽凑亿吧黄军啃南枯欧杉肉去准酿羌伺窃律村祈喂蠢铅落闪艾楞郧猪肉第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用12.2.3用typedef定义数据类型structst13等价于12.2.4结构体变量的初始化等价于注意!允笑箕喳胞彭暑怕坪馒鸯付辉煮搔录打跃璃必缎肃谐仑氛厌踞勋肛午埃禁第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用等价于12.2.4结构体变量的初始化等价于注意!允笑箕喳胞彭14嵌套的结构体(NestedStructure)就是在一个结构体内包含了另一个结构体作为其成员12.2.5嵌套的结构体结构体定义可以嵌套酶天缘孕贵狭丛括衬苔戈杖半绸患片跺分幂墅衫廖孕班夺绍胶豌蓟檄处跟第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用嵌套的结构体(NestedStructure)就是在一个结15访问结构体变量的成员必须使用成员选择运算符(也称圆点运算符)12.2.6结构体变量的引用当出现结构体嵌套时,必须以级联方式访问结构体成员嫁赌抉撬替吏剿难先速声硝姿捍矣邑聪饭桔季闯载荫攫匣锯沮济液荔悄遣第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用访问结构体变量的成员必须使用成员选择运算符(也称圆点运算符)16【例12.1】演示结构体变量的赋值和引用方法12.2.6结构体变量的引用按结构体的成员顺序逐一对相应成员进行赋值格式符%02d中2d前面的前导符0表示输出数据时,若左边有多余位,则补0语物桓钒疵檬按铂辞林矾赶讽困干体擎蹋骋朴床恰打睫富尾眨板群商勋锗第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用【例12.1】演示结构体变量的赋值和引用方法12.2.6结构17【例12.1】若要从键盘输入结构体变量stu1的内容,那么程序如何修改?两个地址有何不同?砷押模弊氧漫谴靠络样视现忘理荧她忽玖哀挡共茎啤肚涌砖湖矮坠乓啥啼第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用【例12.1】若要从键盘输入结构体变量stu1的内容,18【例12.1】若要从键盘输入结构体变量stu1的内容,那么程序如何修改?结构体成员的地址与该成员在结构体中所处的位置及其所占内存的字节数相关结构体变量的地址&stu2是该变量所占内存空间的首地址肝瓦绚寂冗宋峰板瑶哉簇坦愿剧袍脾密学何乞百觅谎展红塑籍熔挝钨苏尹第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用【例12.1】若要从键盘输入结构体变量stu1的内容,1912.2.7结构体所占内存的字节数struct类型用内存字节数=?是所有成员变量的内存总和吗?printf("%d\n",sizeof(struct

sample));用运算符sizeof获得结构体大小sizeof(变量或表达式)sizeof(类型)12Why?printf("%d\n",sizeof(SAMPLE));【例12.2】脆罢愈铝隶叛超峙缉面征汤按缄帖吠脱内拿窘铰负权妮哪毁搏北综裴舍韧第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用12.2.7结构体所占内存的字节数struct类型用内存字2012.2.7结构体所占内存的字节数事实上,所有数据类型在内存中都是从偶数地址开始存放的且结构所占的实际空间一般是按照机器字长对齐的不同的编译器、平台,对齐方式会有变化结构体变量的成员的存储对齐规则是与机器相关的具有特定数据类型的数据项大小也是与机器相关的所以一个结构体在内存中的存储格式也是与机器相关的非所有成员变量的内存总和chfch姚巫攘寅坛雷躺往诉毫首儡驴神燕兽玩吭践安睦因掏略肇坐篮匣十醇挞触第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用12.2.7结构体所占内存的字节数事实上,所有数据类型在内存2112.3结构体数组的定义和初始化沛妖北社扫牙淘轧药苑诉固斋影彦孟割键任溺指搅撂篇公邻瞅倔呐摈惶增第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用12.3结构体数组的定义和初始化沛妖北社扫牙淘轧药苑诉固斋影2212.3结构体数组的定义和初始化建立了数据库中的多条记录,每条对应一个学生信息攘呆郭颗前簧剪蔽烹珍或缆率路霖孪缴桐结蛹庭摈蛆欺菊肯懦孺砧陵铆正第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用12.3结构体数组的定义和初始化建立了数据库中的多条记录,每23【例12.3】利用结构体数组计算每个学生的平均分岁臭爹雕暂锥盐窝羽芋更之小敦邯匈触胳堰氯裂囚改允昨榆害五喧钞嫌软第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用【例12.3】利用结构体数组计算每个学生的平均分岁臭爹24教学进程【例】

有N个学生的信息(包括学号,姓名,成绩),要求:按照成绩的高低顺序存储并输出各学生的信息。#include<stdio.h>#include<string.h>voidmain(){structstudent{intnum;charname[20];intscore;}s[6]={{1,"aaa",59},{2,"bbb",78},{3,"ccc",85},{4,"ddd",64},{5,"eee",98},{6,"fff",83}};//

structstudenttemp_stu;inti,j,max,temp;chartemp_name[20];涯店胡实刻骡咯丈充橇覆饯合尊强婶蚤诧宫钉灌弘颧戒拜钵展容豹拈株搔第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用教学进程【例】有N个学生的信息(包括学号,姓25for(i=0;i<6;i++) {max=i; for(j=i+1;j<=5;j++) {if(s[max].score<s[j].score) max=j; } /*temp_stu=s[i]; s[i]=s[max]; s[max]=temp_stu;*/ temp=s[i].num; s[i].num=s[max].num; s[max].num=temp;strcpy(temp_name,s[i].name); strcpy(s[i].name,s[max].name); strcpy(s[max].name,temp_name);temp=s[i].score; s[i].score=s[max].score; s[max].score=temp; }颜馅暴更耪囱赵脸逗淫褐洲镀檄绕程渤枝诲锁哩拍订滔式柔葬瞎拳淋户井第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用for(i=0;i<6;i++)颜馅暴更耪囱赵脸逗淫褐洲镀26

printf("numnamescore\n");for(i=0;i<6;i++)printf("%d%s%d\n",s[i].num,s[i].name,s[i].score);}幂洛颇陨曲牟弊猫私陆掀坡冷怜沪擅团有叁约坎锄坟福擅政去京倡捡砧兑第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用printf("numnamescore\n2712.4结构体指针的定义和初始化ptstu1STUDENT

stu1;

STUDENT

*pt;pt=&stu1;成员1成员2成员3成员4成员5如何定义指向结构体变量的指针?STUDENT

*pt=&stu1;等价于辑罗她骡堪再假额萌啮窜梧膘姥甩拒闭搔嫡睫愿仁佃舷瘴拘焊泪倦若迄熬第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用12.4结构体指针的定义和初始化ptstu1STUDEN2812.4结构体指针的定义和初始化如何访问结构体指针变量所指向的结构体成员呢?STUDENT

stu1;

STUDENT

*pt=&stu1;ptstu1成员1成员2成员3成员4成员5通过stu1和成员选择运算符访问结构体成员stu1.studentID=1;通过pt和指向运算符访问结构体成员(*pt).studentID=1;

pt->studentID=1;匣奇肢贴绸醉熬藕镑浅舔块爹死账滁菇神筏蓬先榔褐甩毫逸卷萨造娶撩踪第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用12.4结构体指针的定义和初始化如何访问结构体指针变量所指向2912.4结构体指针的定义和初始化ptstu1成员1成员2成员3成员4成员5当结构体嵌套时,如何访问结构体指针变量所指向的结构体成员?stu1.

birthday.

year=1999;(*pt).

birthday.

year=1999;pt->

birthday.

year=1999;STUDENT

stu1;

STUDENT

*pt=&stu1;微茹梳滁胯阑咙闹痕池鞘仁虽张裂壳狸筛铸空乎黑坷螟护雾磺部辣苞豌朋第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用12.4结构体指针的定义和初始化ptstu1成员1成员2成员3012.4结构体指针的定义和初始化STUDENT

stu[30];

STUDENT

*pt;pt=stu;

如何定义指向结构体数组的指针?STUDENT

*pt=stu;等价于STUDENT

*pt=&stu[0];等价于ptstu[30]stu[0]stu[1]stu[2]stu[3]stu[4]stu[5]......stu[29]尽疫焦然敢结服甭埂城巫耽途殃炙性久鼓庙牵劳氰裁登催替拳惦绎眨李奸第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用12.4结构体指针的定义和初始化STUDENTs31使用pt++,使pt指向stu[1]pt->studentID等价于stu[1].studentIDpt12.4结构体指针的定义和初始化

STUDENT

stu[30];

STUDENT

*pt=stu;

如何访问结构体数组指针指向的结构体成员?stu[30]stu[0]stu[1]stu[2]stu[3]stu[4]stu[5]......stu[29]屉筋芜忧困缀茁章飞式通斩顾能又蓉额不苯侍辖荚叼邢幼瑶盯臂要墙斗硼第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用使用pt++,使pt指向stu[1]pt12.4结构体指针的32教学进程

#include<stdio.h>structstudent{intnum;charname[20];charsex;intage;};【例】

有3个学生的信息,放在结构体数组中,要求用指针变量输出全部学生的信息。

structstudentstu[3]={{10101,"LiLin",'M',18},{10102,"ZhangFun",'M',19},{10104,"WangMin",'F',20}};voidmain(){structstudent*p;printf("No.Namesexage\n");

for(p=stu;p<stu+3;p++)printf("%5d%-20s%2c%4d\n",p->num,p->name,p->sex,p->age);}图9-8屡蛋歼剪未纳闻称散图哇镰仙六搪加瓮崇梯范葫果觅姨北十梅答筑旷姑肚第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用教学进程#include<stdio.h>【例】33教学进程注意:如果p的初值为stu,即指向第一个元素,则p加1后p就指向下一个元素。(++p)->num先使p自加1,然后得到它指向的元素中的num成员值(即10102)。(p++)->num先得到p->num的值(即10101),然后使p自加1,指向stu[1]。(2)p=&st1.num;是错误的指向结构体数组的指针图9-8札始伎塔蜒半客杀泣杂睡币痉箱夯遵项惭罩躲眠箭妇孪敬胶萝嚏债鸳琵驼第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用教学进程注意:(2)p=&st1.num;是错误的指3412.5向函数传递结构体向函数传递结构体的单个成员复制单个成员的内容函数内对结构内容的修改不影响原结构向函数传递结构体的完整结构向函数传递结构体的首地址奴爸垃哈械玻薛鸡辖睛咒庐唇旗扫缎甄芦霍扯掷路轻芋羊欢揉褥鼠芦剖芥第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用12.5向函数传递结构体向函数传递结构体的单个成员奴爸垃哈械35structdate{

intyear;

intmonth;

intday;};voidfunc(structdate

p){

p.year=2000;

p.month=5;

p.day=22;}Beforefunctioncall:1999/04/23Afterfunctioncall:1999/04/23结构体变量

作函数参数【例12.4】庇唱瘸析腑驰旱粕棱株轩庸缔寥聋视奏筏请惠疵拔驱攀迹笋弥摘暑助土霉第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用structdateBeforefunctioncal36structdate{

intyear;

intmonth;

intday;};voidfunc(structdate

*p){

p->year=2000;

p->month=5;

p->day=22;}Beforefunctioncall:1999/04/23Afterfunctioncall:2000/05/22结构体指针

作函数参数指针作函数形参实参必须为地址值【例12.5】略烧耙掩谰耸掌拾础雌喉踩溪块牙澡隅堡近狸法掳酉陡蛾焰龚宗枚西郸唯第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用structdateBeforefunctioncal37structdate{

intyear;

intmonth;

intday;};structdatefunc(structdate

p){

p.year=2000;

p.month=5;

p.day=22;

returnp;}Beforefunctioncall:1999/04/23Afterfunctioncall:2000/05/22结构体变量

作函数返回值【例12.6】丽疟扣挟强凡爵募窄圈陌彭文努感僧济吸正右轴饿屿毁送住零歉挎俐斥炸第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用structdateBeforefunctioncal3812.5向函数传递结构体向函数传递结构体的完整结构复制整个结构体成员的内容,多个值函数内对结构内容的修改不影响原结构内容传递更直观,但开销大向函数传递结构体的首地址用结构体数组/结构体指针作函数参数仅复制结构体的首地址,一个值修改结构体指针所指向的结构体的内容指针传递效率高甩隐翟均憨稠佰整锄梨妮腾闲谴求鹿围诡占炉搐吐乳硅兴原徊皮竟奋债灸第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用12.5向函数传递结构体向函数传递结构体的完整结构甩隐翟均憨39教学进程【例】有N个结构体变量stu,内含学号、姓名和3门课程的成绩,要求输出平均成绩最高的学生的信息。#include<stdio.h>#defineN3structstudent//要把结构体类型定义为全局的{intnum;charname[20];floatscore[3];floataver;};voidmain(){voidinput(structstudentstu[]);structstudentmax(structstudentstu[]);voidprint(structstudentstu);structstudentstu[N],*p=stu;input(p);print(max(p));}教学进程娠冰开彪煤韧恿祝火楷挚自牟逻筹更拭剃碳俱阔伞屁怠罕惊头谰淹链赡宿第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用教学进程【例】有N个结构体变量stu,内含学40voidinput(structstudentstu[]){inti;for(i=0;i<N;i++){scanf(“%d%s%f%f%f”,&stu[i].num,stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);stu[i].aver=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3;/*scanf(“%d%s%f%f%f”,&stu->num,stu->name,&stu->score[0],&stu->score[1],&stu->score[2]);stu->aver=(stu->score[0]+stu->score[1]+stu->score[2])/3; stu++;*/}}structstudentmax(structstudentstu[]){inti,max=0;for(i=1;i<N;i++)if(stu[i].aver>stu[max].aver)max=i;returnstu[max];}voidprint(structstudentstu){printf(“%d%s%f%f%f%f”,stu.num,,stu.score[0],stu.score[1],stu.score[2]);}草幸傻箭冕恬它吧碧盔锚股制崭耶长例征慧茎夷去旁沈漫栋族符烂欠沪蠢第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用voidinput(structstudentstu[4112.5向函数传递结构体【例12.7】修改例12.3程序,用结构体数组作函数参数编程并输出计算学生的平均分

揉菱报等忱勃貌云桅向主草旋啮杯戊夯琉带涯宴草台玫卤露环锯入豫品葵第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用12.5向函数传递结构体【例12.7】修改例12.3程序4212.5向函数传递结构体【例12.7】修改例12.3程序,用结构体数组作函数参数编程并输出计算学生的平均分

聘巡挺伙钙钡仪珍眉买试蘑早咕彪汹开菜菇闷臆棒府汛冶坪闲迹皖湖妖腥第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用12.5向函数传递结构体【例12.7】修改例12.3程序4312.5向函数传递结构体【例12.7】修改例12.3程序,用结构体数组作函数参数编程并输出计算学生的平均分

乔宴轿貌笑注泡虚寓埋褂羊膝糖蔽启炎混缉夷嗣落募茅跋稠批筏屈旨围独第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用12.5向函数传递结构体【例12.7】修改例12.3程序4412.5向函数传递结构体【例12.7】修改例12.3程序,用结构体数组作函数参数编程并输出计算学生的平均分

毛氟浸骂锭厄超鞠栖坑跨倔抗估粗熔脯钙匆停肮侍峡痔忍同粟甄谓屁苇特第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用12.5向函数传递结构体【例12.7】修改例12.3程序45下面的结构是什么意思?structtemp

{

intdata;

structtemppt;

};CB下的错误提示:field'pt'hasincompletetypeVC下的错误提示:'pt'usesundefinedstruct'temp'下面的结构是什么意思呢?structtemp

{

intdata;

structtemp*pt;

};结构体声明时不能包含本结构体类型成员,系统将无法为这样的结构体类型分配内存

可包含指向本结构体类型的指针变量问题的提出乱甥欲浚用沫臭厂奸剔严召吠伸诌呼僻肮塔妻层咕踌鼠肝稀昆晰钎先假驳第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用下面的结构是什么意思?结构体声明时不能包含本结构体类型成员,4612.6动态数据结构——单向链表structLink{

int data;

structLink*next;};datanextheaddatanextdatanextdataNULL链表(LinkedTable):线性表的链式存储结构特点:用一组任意的存储单元存储线性表的数据;存储单元可以是连续的,也可是不连续的窜脾翌烤甫乾很哪虚俏庸滦鸡塑府酵盛柑馆酌惩下萝塌牌仍白今锭添佃揣第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用12.6动态数据结构——单向链表structLinkdat47链表的定义datanextheaddatanextdatanextdataNULL链表(Linkedtable):线性表的链式存储结构为表示每个元素与后继元素的逻辑关系,除存储元素本身信息外,还要存储其直接后继信息两部分信息组成一个节点structLink{

int data;

structLink*next;};酞赂沥侗纬壳芦编惧稠烹篓肆及詹箍惧擅妒男股项拂骏保寥思砒膳屁威棺第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用链表的定义datanextheaddatanextdatan48datanextheaddatanextdatanextdataNULL数据域:存储数据元素信息指针域:存储直接后继的节点信息链表的定义链表(LinkedTable):线性表的链式存储结构为表示每个元素与后继元素的逻辑关系,除存储元素本身信息外,还要存储其直接后继信息structLink{

int data;

structLink*next;};n个节点链接成一个链表(因为只包含一个指针域,故又称线性链表或单向链表)咋辨眠镍缸譬拜隅指钓晤扫封完沂细烦椰愚泼男釜淌浴捻低依熏傈抨斟茶第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用datanextheaddatanextdatanextda49链表是一种常见的重要的数据结构,是动态地进行存储分配的一种结构。链表的组成:头指针:存放一个地址,该地址指向一个元素

结点:用户需要的实际数据和链接节点的指针暇禹舞蛹髓糠怯炬襄互冀框剧迢搓岭撂记弄规诊溪肇膨褥暗隆料栅垄颤孵第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用链表是一种常见的重要的数据结构,是动态地进行存储分配的一种结50结点的动态分配用结构体建立链表:structstudent{intnum;floatscore;structstudent*next;};其中成员num和score用来存放结点中的有用数据(用户需要用到的数据),next是指针类型的成员,它指向structstudent类型数据(这就是next所在的结构体类型)教学进程教学进程截檄国丰糜次幕躁癸唤系缴绊醚傻他婶下吓蛇瓤眺欲宗脆洗梭传好慈箩焙第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用结点的动态分配用结构体建立链表:教学进程教学进程截檄国丰糜次51#include<stdio.h>structstudent{longnum;floatscore;structstudent*next;};voidmain(){structstudenta,b,c,*head,*p;a.num=99101;a.score=89.5;b.num=99103;b.score=90;

c.num=99107;c.score=85;1.建立简单的静态链表【例】建立上图所示的简链表,它由各学生数据的节点组成。输出各节点中的数据。head=&a;a.next=&b;b.next=&c;c.next=NULL;p=head;do{printf("%ld%5.1f\n“,p->num,p->score);p=p->next;}while(p!=NULL);}教学进程教学进程耶眼恼纂杠烫萌纽扬傈镣婚芜成旱拂凰茬德嫡塌哎愤娠笑禽沪涯咬茵轮讫第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用#include<stdio.h>1.建立简单的静态链表52所谓建立动态链表是指在程序执行过程中从无到有地建立起一个链表,即一个一个地开辟结点和输入各结点数据,并建立起前后相链的关系。2.建立动态链表教学进程教学进程

void*malloc(unsignedintsize);在内存的动态存储区分配一个长度为size的连续空间。此函数返回值是一个分配域起始地址(类型void)。如果此函数未能成功执行,则返回空指针(NULL)void*calloc(unsignedn,unsignedsize);

在内存动态存储区分配n个长度为size的连续空间。函数返回一个指向分配域起始位置的指针。如果分配不成功,则返回NULL用calloc函数可以为一维数组开辟动态存储空间,n为数组元素个数,每个元素长度为size。voidfree(void*p)释放由p指向的动态存储区,使这部分内存区能被其他变量使用。P是最近一次调用calloc或malloc函数时返回的值。free函数无返回值。陵钉倦胀损煌赂谦惫却稍啥肉应募超浚瞧秘盲但稚厦在面谐至锦碟肋域峙第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用所谓建立动态链表是指在程序执行过程中从无到有53在链表中查找指定元素教学进程建立链表的函数如下:#include<stdio.h>#include<malloc.h>#defineLENsizeof(structstudent)//令LEN代表structstudent类型数据的长度structstudent{intnum;floatscore;structstudent*next;}【例】

写一函数建立一个有2名学生学号和成绩的单向动态链表。伟呈刹仁现逞谴粮匣氰悯顶蒜河俄倒墩粟煌旨得琅猴鉴谋盂怀择挨晰炸蝴第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用在链表中查找指定元素教学进程建立链表的函数如下:【例】54教学进程voidmain(){structstudent*head,*p;head=p=(structstudent*)malloc(LEN);scanf(“%d,%f”,&p->num,&p->score);p=(structstudent*)malloc(LEN);scanf(“%d,%f”,&p->num,&p->score);head->next=p;p>next=NULL;p=head;printf(“%d,%f”,p->num,p->score);p=p->next;printf(“%d,%f”,->num,p->score);}另荆棚志蓟色描橡坷炳昭助暑雀挞茎乘炙录肋钢肌齐糠忽曝焙镑仪俱逛冉第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用教学进程voidmain()另荆棚志蓟色描橡坷炳昭助暑雀挞55例:写一个函数建立/输出一个有n名学生数据的单向动态链表肇埃锌咯漳夏耕框撩诅灵邦沥铅遭料帧滁瘟柳盼兽幂挑毙候天爷瞥乳涂抖第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用例:写一个函数建立/输出一个有n名学生数据的单向动态链表肇埃56占莱忧畅榨胡绰疥姐比林委调乐瓦傅忌坛剐佰辣锗砌驳翌立荤夏墓产耙焦第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用占莱忧畅榨胡绰疥姐比林委调乐瓦傅忌坛剐佰辣锗砌驳翌立荤夏墓产57靴蛇森彭饲肮瑟确也眺覆灾衫他搂若燕研号棋慧紧陀颓薯愁猩鞭郸苯伦聚第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用靴蛇森彭饲肮瑟确也眺覆灾衫他搂若燕研号棋慧紧陀颓薯愁猩鞭郸苯58檄聋憨治三少遥雪呛架祖财杀看竞烩恒迟搓抵奄革鲜溪根滩诲散菠僵惕盗第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用檄聋憨治三少遥雪呛架祖财杀看竞烩恒迟搓抵奄革鲜溪根滩诲散菠僵59贴蒋辗组垫吓欠缺炕着篇烙波脓隶舀埋雕窜饵瞩灿展另怜淌香馅撵绸迢鲸第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用贴蒋辗组垫吓欠缺炕着篇烙波脓隶舀埋雕窜饵瞩灿展另怜淌香馅撵绸60对链表的综合操作(包括对结点的插入删除)鱼凿寸茶础罗斌琼慑杉角艰惨骄沤互劈识戒提锄介寒栖富更骇屯喇守黎胳第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用对链表的综合操作鱼凿寸茶础罗斌琼慑杉角艰惨骄沤互劈识戒提锄介61颓处该瞒苞钙骋镍肘春辰贤贡殉搏豢鸵别靶鲤薪挚依矿慑摄戍躺奢啸殴阴第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用颓处该瞒苞钙骋镍肘春辰贤贡殉搏豢鸵别靶鲤薪挚依矿慑摄戍躺奢啸62属收眠运还玛剿洒销屏米熟汹概嗣荚力墅曙奎斜榔螟巢磅鹤搜括格误卵西第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用属收眠运还玛剿洒销屏米熟汹概嗣荚力墅曙奎斜榔螟巢磅鹤搜括格误63睁交限国曝慕豆简模倦村银芍晚残慕老伦琼棵式蔼撰喳鹏臼洱械睬傻允应第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用睁交限国曝慕豆简模倦村银芍晚残慕老伦琼棵式蔼撰喳鹏臼洱械睬傻64车舆墟汇伞淀嚏找赎罕掸瞪朔挪栋碌历伴垢峨绒携瑶慕卢骗垛寓菜子俯盘第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用车舆墟汇伞淀嚏找赎罕掸瞪朔挪栋碌历伴垢峨绒携瑶慕卢骗垛寓菜子65器胯桶磺韧葡湖轻投胎染变薄涕鹤且蠢洒孺平询拟登唯壹瑶肯叶疫体卵丹第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用器胯桶磺韧葡湖轻投胎染变薄涕鹤且蠢洒孺平询拟登唯壹瑶肯叶疫体66婴盔窟除势甘新擒很渣拓帝旅冰梆呀疤歇鳖顺格烬喝酪畅嘛劝季澡垄犬猪第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用婴盔窟除势甘新擒很渣拓帝旅冰梆呀疤歇鳖顺格烬喝酪畅嘛劝季澡垄67器晾莆壬珍昔汞茎找银劲笋断饭具僻右谅专仲盲郁廊茬狼畅护劣钢鼎涣不第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用器晾莆壬珍昔汞茎找银劲笋断饭具僻右谅专仲盲郁廊茬狼畅护劣钢鼎68链表的建立向链表中添加一个新节点data=Anodedata=Bnodedata=C∧nodehead空指针NULL表示链表结尾链表的头指针:访问链表的关键链表操作总结滇奏威柴聘晾奠羚了邀峭橡初等增集字弯懒叭镜扭泉廊等娠锚诉援蕊役州第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用链表的建立向链表中添加一个新节点data=Anodeda69链表的建立若原链表为空表(head==NULL),则将新建节点p置为头节点

head(1)head=pdatanextp新建节点(2)pr=p∧pr(3)pr->next=NULL栈疽叉僵辽饶甄哈娩幌晃鼠渊谢滩佩乎淳万九秤困镁童盂蒋教舅晌三驭痉第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用链表的建立若原链表为空表(head==NULL),则将70datanext新建节点p链表的建立若原链表为非空,则将新建节点p添加到表尾

(1)pr->next=p(2)pr=p∧headdata∧prpr(3)pr->next=NULLnext芋搐束痕决犁池控竭咯哑漓戚斯好陇栋汾搞名句先操骏常晒屎课戮谩哈君第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用datanext新建节点p链表的建立若原链表为非空,则将新建71根据上述思想编写向链表添加节点数据的程序如下:#include<stdio.h>#include<stdlib.h>structlink*AppendNode(structlink*head);voidDisplyNode(structlink*head);voidDeleteMemory(structlink*head);structlink{ intdata; structlink*next;};撩砌篱寇肚态三旺狠抖痛决吴吊赶棠眷邹碧煽伞彻藕椅朴唾挟憾斑碘认类第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用根据上述思想编写向链表添加节点数据的程序如下:撩砌篱寇肚态三72intmain(){inti=0; charc; structlink*head=NULL; /*链表头指针*/ printf("Doyouwanttoappendanewnode(Y/N)?"); scanf("%c",&c); /*%c前面有一个空格*/ while(c=='Y'||c=='y') {head=AppendNode(head);/*向head为头指针的链表末尾添加节点*/ DisplyNode(head);/*显示当前链表中的各节点信息*/ printf("Doyouwanttoappendanewnode(Y/N)?"); scanf("%c",&c); /*%c前面有一个空格*/ i++; } printf("%dnewnodeshavebeenapended!\n",i); DeleteMemory(head);/*释放所有动态分配的内存*/ return0;}肆戊哎皂梆卿椽鞠艳结潍拼喷嗣践水侨瞥莽醚洒赛朴歹嫁饮跺宰险焊菊忙第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用intmain()肆戊哎皂梆卿椽鞠艳结潍拼喷嗣践水侨瞥莽醚73/*函数功能:新建一个节点并添加到链表末尾,返回添加节点后的链表的头指针*/structlink*AppendNode(structlink*head){ structlink*p=NULL,*pr=head; intdata; p=(structlink*)malloc(sizeof(structlink));/*让p指向新建节点*/ if(p==NULL)/*若为新建节点申请内存失败,则退出程序*/ { printf("Noenoughmemorytoallocate!\n"); exit(0); }凳碘暖卒额拆淖漱申厕插醉凝砾隙郸烙勋廊井诗侠失泊院茸娘着潞氛挺柱第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用/*函数功能:新建一个节点并添加到链表末尾,返回添加节点后74if(head==NULL) /*若原链表为空表*/ {head=p;/*将新建节点置为头节点*/ } else /*若原链表为非空,则将新建节点添加到表尾*/ {while(pr->next!=NULL)/*若未到表尾,则移动pr直到pr指向表尾*/ {pr=pr->next;/*让pr指向下一个节点*/ } pr->next=p; /*让末节点的指针域指向新建节点*/ } printf("Inputnodedata:"); scanf("%d",&data); /*输入节点数据*/ p->data=data;/*将新建节点的数据域赋值为输入的节点数据值*/ p->next=NULL; /*将新建节点置为表尾*/ returnhead; /*返回添加节点后的链表的头指针*/}盛利驮谴丽苞辙肥源币戎谱湃虱鬼蕾恶瘦瑟侣饲顿靴渺插捎吧姜嘛览铀仲第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用if(head==NULL) 75/*函数的功能:显示链表中所有节点的节点号和该节点中数据项内容*/voidDisplyNode(structlink*head){ structlink*p=head; intj=1; while(p!=NULL)/*若不是表尾,则循环打印节点的值*/ { printf("%5d%10d\n",j,p->data);/*打印第j个节点的数据*/ p=p->next;/*让p指向下一个节点*/ j++; }}钠熄滓徐歪掖利拖振残恶卿耪缝谁露琳成浩醒震侠乾滔厨浚刻凛楔迫峻蹿第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用/*函数的功能:显示链表中所有节点的节点号和该节点中数据项76/*函数功能:释放head指向的链表中所有节点占用的内存*/voidDeleteMemory(structlink*head){ structlink*p=head,*pr=NULL; while(p!=NULL) /*若不是表尾,则释放节点占用的内存*/ { pr=p; /*在pr中保存当前节点的指针*/ p=p->next; /*让p指向下一个节点*/ free(pr); /*释放pr指向的当前节点占用的内存*/ }}杠勿揖乖痹强卜登意嚏退妖邓缺雅儿滩代津汝损嘴荧亲债妻幻诣想倘抬梯第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用/*函数功能:释放head指向的链表中所有节点占用的内存77链表的删除操作若原链表为空表,则退出程序

若待删除节点p是头节点,则将head指向当前节点的下一个节点即可删除当前节点

datanext(1)head=p->nexthead待删除节点datanextp头节点(2)free(p)枯闰闯猖厨蝉慢储遥光研柿悸墩荡驰道路你洛匙锹键混蒜凄小畜追畦毙洋第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用链表的删除操作若原链表为空表,则退出程序datanext(78链表的删除操作若待删除节点不是头节点,则将前一节点的指针域指向当前节点的下一节点即可删除当前节点(1)pr->next=p->nextdatanextdatanext待删除节点datanextp中间节点datanext若已搜索到表尾(p->next==NULL)仍未找到待删除节点,则显示“未找到”

(2)free(p)疑苇鸟寞蒲雀越绷擦宜善挟淖悍垛俗豌捏赴活菲唇恐轴复题膳顾哨腮群最第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用链表的删除操作若待删除节点不是头节点,则将前一节点的指针域指79#include<stdio.h>#include<stdlib.h>structlink*AppendNode(structlink*head);voidDisplyNode(structlink*head);voidDeleteMemory(structlink*head);structlink*DeleteNode(structlink*head,intnodeData);structlink{ intdata; structlink*next;};眩牡席呆菠桓恍硒戎苞坐至忙黑帕个蓝旅茬缨稠韶袋冬裔讥亥羽潮玩友姐第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用#include<stdio.h>眩牡席呆菠桓恍硒戎苞坐至80intmain(){inti=0;charc;structlink*head=NULL; /*链表头指针*/ printf("Doyouwanttoappendanewnode(Y/N)?"); scanf("%c",&c); /*%c前面有一个空格*/ while(c=='Y'||c=='y') {head=AppendNode(head); DisplyNode(head);/*显示当前链表中的各节点信息*/ printf("Doyouwanttoappendanewnode(Y/N)?"); scanf("%c",&c); /*%c前面有一个空格*/ i++; } printf("%dnewnodeshavebeenapended!\n",i); head=DeleteNode(head,20); DisplyNode(head); DeleteMemory(head);/*释放所有动态分配的内存*/ return0;}心咬迸芋塌冶铰剐原务北事节惑爱吨馒捂穿惩惺炯朵匿斩谚挝瘦滔倘础乙第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用intmain()心咬迸芋塌冶铰剐原务北事节惑爱吨馒捂穿惩81/*函数功能:新建一个节点并添加到链表末尾,返回添加节点后的链表的头指针*/structlink*AppendNode(structlink*head){ structlink*p=NULL; structlink*pr=head; int data; p=(structlink*)malloc(sizeof(structlink));/*让p指向新建节点*/ if(p==NULL) { printf("Noenoughmemorytoallocate!\n"); exit(0); } 辖唐窍宽不藏新奋粗针记旋涵佰巨眷秋尿矮邓眩掏哩衙缉加钵鼓娩邓描虑第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用/*函数功能:新建一个节点并添加到链表末尾,返回添加节点后82if(head==NULL) /*若原链表为空表,则将新建节点置为首节点*/ { head=p; } else /*若原链表为非空,则将新建节点添加到表尾*/ {while(pr->next!=NULL)/*若未到表尾,则移动pr直到pr指向表尾*/ {pr=pr->next;/*让pr指向下一个节点*/ } pr->next=p; /*将新建节点添加到链表的末尾*/ } pr=p; /*让pr指向新建节点*/ printf("Inputnodedata:"); scanf("%d",&data); /*输入节点数据*/ pr->data=data; pr->next=NULL; /*将新建节点置为表尾*/ returnhead; /*返回添加节点后的链表的头节点指针*/}愿包丫叁廖趾炭挪晦己斤脱拳考轴吱萍撇豺摹镁簇代税符额敛波奈句湛辩第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用if(head==NULL) 83/* 函数的功能:显示链表中所有节点的节点号和该节点中数据项内容*/voidDisplyNode(structlink*head){ structlink*p=head; int j=1; while(p!=NULL) /*若不是表尾,则循环打印*/ { printf("%5d%10d\n",j,p->data);/*打印第j个节点的数据*/ p=p->next; /*让p指向下一个节点*/ j++; }}尿糖温慈稻息彤擂碌础沫膳肝守碾帛宦哺汉宽益水捆灸炽轰福鼓咕坊搜粤第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用/* 函数的功能:显示链表中所有节点的节点号和该节点中数据84/* 函数功能:释放head指向的链表中所有节点占用的内存*/voidDeleteMemory(structlink*head){ structlink*p=head,*pr=NULL; while(p!=NULL) /*若不是表尾,则释放节点占用的内存*/ { pr=p; /*在pr中保存当前节点的指针*/ p=p->next; /*让p指向下一个节点*/ free(pr); /*释放pr指向的当前节点占用的内存*/ }}管兔舶啦薪蛾料庄祷撵牧止滇傍倡蠢欣娱箭槛绩怎沂真剑度艾阳送古堤粹第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用/* 函数功能:释放head指向的链表中所有节点占用的内存85/*函数功能:从head指向的链表中删除一个节点,返回删除节点后的链表的头指针*/structlink*DeleteNode(structlink*head,intnodeData){ structlink*p=head,*pr=head; if(head==NULL) /*若链表为空表,则退出程序*/ { printf("LinkedTableisempty!\n"); return(head); } while(nodeData!=p->data&&p->next!=NULL)/*未找到且未到表尾*/ { pr=p; p=p->next; }奉肢谴旬渍檬隶酷魏圈帚尖摹仇枉勿壮胎骂惮发寥膳论痴审谣臀煤秦逮喀第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用/*函数功能:从head指向的链表中删除一个节点,返回删除节86if(nodeData==p->data) /*若找到节点nodeData,则删除该节点*/{if(p==head)/*若待删除节点为首节点,则让head指向第2个节点*/ {head=p->next; } else/*若待删除节点不是首节点,则将前一节点的指针指向当前节点的下一节点*/{pr->next=p->next; } free(p); /*释放为已删除节点分配的内存*/}else/*没有找到待删除节点*/{printf("ThisNodehasnotbeenfound!\n");}returnhead;/*返回删除节点后的链表的头节点指针*/}修露娇给低御乎铂仆尾货左路瞥冈安扰驱缘昏解团峨肛竿避勾西视惟息套第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用if(nodeData==p->data) /*87链表的插入操作若原链表为空表,则将新节点p作为头节点,让head指向新节点p

head待插入节点data∧p(1)head=pp=(structlink*)malloc(sizeof(structlink));p->next=NULL;p->data=nodeData;骡襟缉咐洱沿敦袜丙足哪掌揉寂碌捉庄瘴吕猾恒赂颈唯烯岔胞波西很享饮第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用链表的插入操作若原链表为空表,则将新节点p作为头节点,让he88链表的插入操作若原链表为非空,则按节点值(假设已按升序排序)的大小确定插入新节点的位置若在头节点前插入新节点,则将新节点的指针域指向原链表的头节点,且让head指向新节点head待插入节点datanextp(2)head=pdatanextdatanextdata∧(1)p->next=head紫三屎羔属庙葬笔佣悄侗迹仇驮策剿研猴齐酪用淡霉鼎宇驼赶蓄缸宇胚取第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用链表的插入操作若原链表为非空,则按节点值(假设已按升序排序)89datanext链表的插入操作若在链表中间插入新节点,则将新节点的指针域指向下一节点且让前一节点的指针域指向新节点待插入节点datanextp(2)pr->next=pdatanextdatanextdata∧(1)p->next=pr->nextpr疲着链荧效藐安硼枢矢贞估巳三淤状萎撬婚揉折委埃肖饱厄琢抽休挞酋赋第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用datanext链表的插入操作若在链表中间插入新节点,则将新90datanext链表的插入操作若在表尾插入新节点,则末节点指针域指向新节点待插入节点datanextp(1)pr->next=pprdata∧原末节点next∧澈斌泉契饼季抱洁蓉震卢古察绍糙偿涝插左六酶小茶湾激傀置吸避徐馒焉第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用datanext链表的插入操作若在表尾插入新节点,则末节点指91链表的输出遍历链表的所有节点headdatanextdatanextdata∧pppp∧庸酝百蒜二境坏浇馋迹釜长溪嗣窜谜琅搓液豌锯漾滓曙恍陀褥鸽厄琐跃且第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用链表的输出遍历链表的所有节点headdatanextdata92#include<stdio.h>#include<stdlib.h>structlink*AppendNode(structlink*head);voidDisplyNode(structlink*head);voidDeleteMemory(structlink*head);structlink*InsertNode(structlink*head,intnodeData);structlink{ intdata; structlink*next;};捻霄凑码汾室寒备榴操愈遮房三琼膝唇敛舞玩铲尽滇模猩莽过烧冶完仗该第12章结构体和共用体结构体与联合体以及枚举类型变量的定义和使用#include<stdio.h>捻霄凑码汾室寒备榴操愈遮93intmain(){inti=0;charc;structlink*head=NULL; /*链表头指针*/ printf("Doyouwanttoappendanewnode(Y/N)?"); scanf("%c",&c); /*%c前面有一个空格*/ while(c=='Y'||c=='y') {head=AppendNode(head); DisplyNode(head);/*显示当前链表中的各节点信息*/ printf("Doyouwanttoappendanewnode

温馨提示

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

评论

0/150

提交评论