《C语言程序设计》课件 10 结构体_第1页
《C语言程序设计》课件 10 结构体_第2页
《C语言程序设计》课件 10 结构体_第3页
《C语言程序设计》课件 10 结构体_第4页
《C语言程序设计》课件 10 结构体_第5页
已阅读5页,还剩67页未读 继续免费阅读

下载本文档

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

文档简介

程序设计基础——C语言程序设计

2023翻转课堂实用教程第10章

结构体结构体10.1结构体数组10.2

结构体指针10.3

链表10.410.1结构体引入结构体前面章节中学到的数组,用于存储相同类型的数据,如每位应届生的薪资。若保存每位应届生的个人信息,比如姓名、性别、年龄、毕业学校、毕业时间等,可以定义不同的变量,但体现不了他们同属一个人的信息的内在联系。结构体可用来存放一组不同类型的、具有内在联系的数据。姓名性别年龄毕业学校毕业时间123结构体类型的定义结构体变量的定义结构体变量的初始化和使用知识点结构体案例案例分析结构体相关练习题练习题10.1.1结构体知识点程序员自定义的构造数据类型,“模板”,包含多个属性,用变量来表示,每个变量称为结构体成员。struct,定义结构体类型的关键字,不可省略1、结构体类型的定义形式如下:struct结构体名{

数据类型名

变量1;//又称为结构体成员1

数据类型名

变量2;//又称为结构体成员2…};//此处的分号不可以省略结构体类型名为:struct结构体名举例1:定义一张桌子的结构体类型,桌子包括长、宽、高、价格、材质这5个属性。structdesk{ doublelength,width,height;//同类型的结构体成员可用逗号,隔开一起定义 doubleprice; charmaterial[6];//用字符串来保存材质,如木、铁等。};代表着实际应用中的桌子模板,5个结构体成员,分别表示长、宽、高、价格、材质这5个属性。1、结构体类型的定义形式如下:10.1.1结构体知识点举例2:定义一个表示三维坐标点的结构体类型,坐标点包含x,y,z三个坐标值。structpoint{intx,y,z;};typedefstructpointPoint;//给structpoint起个短一些的别名Point虽然x,y,z都是整形,可以用数组来存储,但用结构体来表示,更能体现x,y,z为同一个点的三个坐标,反应三者的内在联系1、结构体类型的定义形式如下:

10.1.1结构体知识点举例3:结构体类型的嵌套定义structsize{ doublelength; doublewidth; doubleheight;};typedefstructsizeSize;//为structsize起的别名Size,后面用Size代替structsizestructdesk{ SizemySize;//成员变量也为一个结构体类型 doubleprice; charmaterial[6];};1、结构体类型的定义形式如下:10.1.1结构体知识点10.1.1结构体知识点2、结构体变量的定义

:结构体类型是一种构造数据类型,定义好数据类型后,就可以定义该数据类型的变量了。三种结构体变量的定义方式:(1)分开定义(2)同时定义(3)无类型定义

10.1.1结构体知识点2、结构体变量的定义

:(1)分开定义指先定义结构体类型,再定义这种结构体类型的变量,一般形式如下:struct结构体名{ 数据类型名变量1;//又称为结构体成员1 数据类型名变量2;//又称为结构体成员2…};struct结构体名结构体变量名表;

10.1.1结构体知识点2、结构体变量的定义

:(1)分开定义例如:structdesk{doublelength,width,height;doubleprice;charmaterial[6];};

structdeskdesk1,desk2;

10.1.1结构体知识点2、结构体变量的定义

:(2)同时定义指在结构体类型的定义最后定义变量,一般形式如下:struct结构体名{ 数据类型名变量1;//又称为结构体成员1 数据类型名变量2;//又称为结构体成员2…}结构体变量名表;//多个变量名之间用逗号,隔开

10.1.1结构体知识点2、结构体变量的定义

:(2)同时定义例如:structdesk{doublelength,width,height;doubleprice;charmaterial[6];}desk1,desk2;

10.1.1结构体知识点2、结构体变量的定义

:(3)无类型定义是指采用同时定义的方式时,省略结构体类型名。struct{ 数据类型名变量1;//又称为结构体成员1 数据类型名变量2;//又称为结构体成员2…}结构体变量名表;//多个变量名之间用逗号,隔开

10.1.1结构体知识点2、结构体变量的定义

:(3)无类型定义例如:struct{doublelength,width,height;doubleprice;charmaterial[6];}desk1,desk2;

无类型名定义方式只适合于后续不再需要用该结构体类型定义新变量的情况。10.1.1结构体知识点2、结构体变量的定义

:结构体类型与结构体变量的区别:

DeskSizepricemateriallengthwidthheight10.61.20.6150塑料2表头/结构体类型条目/结构体变量系统不会为结构体类型分配存储空间,会为结构体变量分配内存空间。10.1.1结构体知识点2、结构体变量的定义

:举例:结构体变量占用内存大小#include<stdio.h>structdesk{ doublelength;//8个字节 doublewidth;//8个字节 doubleheight;//8个字节 doubleprice;//8个字节 charmaterial[6];//6个字节};intmain(){ structdeskdesk1; printf("sizeofdesk1is%d",sizeof(structdesk)); return0;}运行结果:在64位机器下运行:sizeofdesk1is40为了提高存取效率,编译器会自动进行内存对齐,在64位机器中,默认以8字节对齐。某个变量不足8个字节,同样分配8个字节。10.1.1结构体知识点3、结构体变量的初始化和使用

:(1)在定义结构体变量时整体赋值(2)在定义结构体变量后,逐个对单个成员进行赋值。10.1.1结构体知识点(1)定义时赋值struct结构体名结构体变量名={成员值表};或者struct结构体名结构体变量名=同类型结构体变量;举例:structdeskdesk1={2,0.75,0.75,1000,"木质"};structdeskdesk2=desk1;

3、结构体变量的初始化和使用

:10.1.1结构体知识点(2)定义后,结构体成员单独赋值获取结构体成员的一般形式: 结构体变量.成员名举例:structdeskdesk1;desk1.length=2.0;desk1.width=0.75;desk1.height=0.75;desk1.price=1000;strcpy(desk1.material,"木质");

3、结构体变量的初始化和使用

:.成员运算符10.1.2结构体案例分析#include<stdio.h>intmain(){ inti;

structcomplex{ doublereal;//复数实部 doubleimag;//复数虚部 }num; printf("请输入复数的实部和虚部,用空格隔开:\n"); scanf("%lf%lf",&num.real,&num.imag); printf("thecomplexnumis(%.2f+%.2fi)",num.real,num.imag); return0;}

案例10.1.1定义一个表示复数的结构体,输入一个复数,并将该复数输出出来。请输入复数的实部和虚部,用空格隔开:3.25.1↙thecomplexnumis(3.20+5.10i)运行结果10.1.2结构体案例分析要求:输入整数n,随后输入n个候选人信息,候选人信息包括:姓名、学号、班级、得票数,并输出得票数最多的学生会主席候选人信息。//姓名、学号、班级、得票数structcandidate{ charname[10];//姓名 intno;//学号 chargrade[20];//班级 intvotes;//得票数};typedefstructcandidateCandidata;

案例10.1.2学生会主席候选人信息统计,以及最高票候选人信息输出。

#include<stdio.h>//姓名、学号、班级、得票数structcandidate{ charname[10];//姓名 intno;//学号 chargrade[20];//班级 intvotes;//得票数};typedefstructcandidateCandidata;

intmain(){ Candidatamax,stu; inti,n;案例10.1.2程序代码

printf("请输入候选人的人数:\n"); scanf("%d",&n); printf("请输入候选人的信息:姓名、学号、班级和票数:\n"); for(i=0;i<n;i++){ if(i==0){ scanf("%s%d%s%d",,&stu.no,stu.grade,&stu.votes); max=stu;//先假设第一个学生的投票数最多 }else{ scanf("%s%d%s%d",,&stu.no,stu.grade,&stu.votes); if(stu.votes>max.votes)max=stu; } } printf("得票最多的候选人:\n"); printf("%s%d%s%d",,max.no,max.grade,max.votes); return0;}10.1.2结构体案例分析请输入候选人的人数:3↙请输入候选人的信息:姓名、学号、班级和票数:Emily2023100023软件工程28↙Peter2022103422信息安全30↙Eric2022202922会计42↙得票最多的候选人:Eric2022202922会计42运行结果10.1.3结构体课堂练习题课堂练习题10.1.1:写出执行下面程序后的输出结果。#include<stdio.h>typedefstructdesk{ doublelength,width,height,price; charmaterial[6];}Desk;intmain(){ Deskdesk1={2,0.75,0.75,1000,"木质"},desk2=desk1; desk2.price=1250; strcpy(desk2.material,"铁质"); printf("theinfomationofdesk1is%.2f,%.2f,%.2f,%.2f,%s\n", desk1.length,desk1.width,desk1.height,desk1.price,desk1.material); printf("theinfomationofdesk2is%.2f,%.2f,%.2f,%.2f,%s\n", desk2.length,desk2.width,desk2.height,desk2.price,desk2.material); return0;}

10.1.3结构体课堂练习题课堂练习题10.1.2:在案例10.1.1的基础上,输入两个复数,并输出这两个复数的和与积。课堂练习题10.1.3:给定若干个二维坐标中的点,计算并输出这些点离原点的距离。10.2结构体数组123结构体数组的定义结构体数组的使用知识点结构体数组案例分析案例分析结构体数组相关练习题练习题结构体数组,是指数组中每一个元素的类型都是结构体类型。结构体数组通常用来表示一组相同类型的实体,比如一个班级的学生。10.2.1结构体数组知识点学号姓名C语言成绩1、结构体数组的定义形式如下:与定义结构体变量的方式类似,有三种方式:分开定义、同时定义、无类型定义,只是在定义变量的位置替换成定义数组。10.2.1结构体数组知识点

例如:结构体数组也可以在定义的同时初始化。

structcandidate{ charname[10]; intno; chargrade[20]; intvotes; }stu[4]={//如果对数组中全部元素赋初值,也可以省略数组个数4 {"Emily",20231000,"23软件工程",35}, {"Peter",20221022,"22网络工程",12}, {"Eric",20221030,"22信息安全",49}, {"Paul",20211040,"21金融学",26} };namenogradevotesstu[0]Emily2023100023软件工程35stu[1]Peter2022102222网络工程12stu[2]Eric2022103022信息安全49stu[3]Paul2021104021金融学262、结构体数组的使用

:结构体数组名[下标].结构体成员名10.2.1结构体数组知识点获取上例中Eric这个候选人的得票数:namenogradevotesstu[0]Emily2023100023软件工程35stu[1]Peter2022102222网络工程12stu[2]Eric2022103022信息安全49stu[3]Paul2021104021金融学26stu[2].votes先获取下标为2的候选人Eric的结构体获取候选人Eric的结构体成员votes的值如何修改Emily的得票数为38stu[0].votes=38;Emily2023100023软件工程35↙Peter2022102222网络工程12↙Eric2022103022信息安全49↙Paul2021104021金融学26↙依次输出所有候选人的信息:Emily2023100023软件工程35Peter2022102222网络工程12Eric2022103022信息安全49Paul2021104021金融学2610.2.2结构体数组案例分析要求:编写程序输入所有候选人的信息,包括姓名、学号、年级和得票数。并按照输入的顺序输出所有候候选人的信息。案例10.2.1统计所有学生会主席候选人的信息#include<stdio.h>#defineMAX4intmain(){ inti; structcandidate{ charname[10]; intno; chargrade[20]; intvotes; }stu[MAX]; for(i=0;i<MAX;i++){//输入所有候选人的信息 scanf("%s%d%s%d",stu[i].name,&stu[i].no,stu[i].grade,&stu[i].votes); } printf("依次输出所有候选人的信息:\n"); for(i=0;i<MAX;i++){ printf("%s%d%s%d\n",stu[i].name,stu[i].no,stu[i].grade,stu[i].votes); } return0;}运行结果10.2.2结构体数组案例分析要求:候选人的信息包括姓名、学号、班级和得票数。编写程序按照得票数从高到低的顺序输出候选人的信息,只需要输出候选人姓名:得票数,案例10.2.2从高到底输出各学生会主席侯选人的得票数#include<stdio.h>#defineMAX4intmain(){ inti,j; structcandidate{ charname[10]; intno; chargrade[20]; intvotes; }stu[MAX]={ {"Emily",20231000,"23软件工程",35}, {"Peter",20221022,"22网络工程",12}, {"Eric",20221030,"22信息安全",49}, {"Paul",20211040,"21金融学",26} };

10.2.2结构体数组案例分析案例10.2.2从高到底输出各学生会主席侯选人的得票数 for(i=0;i<MAX-1;i++){//冒泡排序法进行排序,从高到底 for(j=0;j<MAX-1-i;j++){ if(stu[j].votes<stu[j+1].votes){ structcandidatetmp=stu[j]; stu[j]=stu[j+1]; stu[j+1]=tmp; } } } for(i=0;i<MAX;i++){ printf("%s:%d",stu[i].name,stu[i].votes); } return0;}运行结果Eric:49Emily:35Paul:26Peter:1210.2.3结构体数组课堂练习题课堂练习题10.2.1:定义包含10个毕业生信息的结构体数组,每个毕业生的信息包括编号、姓名、毕业院校、入职公司、薪资,计算这10个人的平均薪资。

课堂练习题10.2.2:在课堂练习题10.2.1基础上,计算大于平均薪资的毕业生的信息。课堂练习题10.2.3:在课堂练习题10.1.3基础上做扩展,给定若干个二维坐标中的点,按照每个点距离原点的距离,从近到远的顺序输出每个点。10.3结构体指针123结构体指针的定义结构体指针成员的访问结构体指针作为函数参数知识点结构体指针案例分析案例分析结构体指针相关练习题练习题结构体指针是保存了一个结构体变量地址的变量,即结构体指针指向一个结构体变量。1、结构体指针定义方式如下:struct结构体类型名*结构体指针名;10.3.1结构体指针知识点#include<stdio.h>intmain(){ structcandidate{ charname[10]; intno; chargrade[20]; intvotes;

}stu={"Eric",20221030,"22信息安全",49};

structcandidate*p=&stu; printf("%#X%#X\n",p,&()); return0;}运行结果:0X62FDF00X62FDF0stustu.namestu.nostu.gradestu.votesp&stuEric2022103022信息安全49数组名:指针常量结构体变量:代表了所有成员的一个集合,不是一个指针。&stu是地址。stustu.namestu.nostu.gradestu.votespEric&stu2022103022信息安全49当一个结构体指针指向一个具体的结构体变量时,通过结构体指针也可以获取结构体成员。(1)用(*p)访问结构体成员(*p).no=20221031;

不可以写成*p.no,’.’优先级高于‘*’,*p.no等价于*(p.no),p是一个指针变量,没有‘.’的运算,这样意义就不对了。(2)用指向运算符“->”访问指针指向的结构体变量的成员p->no=20221031;10.3.1结构体指针知识点2、结构体指针成员的获取:3、结构体指针作为函数参数:

结构体变量作为函数的实参传递到函数中时,传递的是所有成员变量的集合,当成员变量比较多时,传递的时间和消耗的内存空间较大,会影响程序的执行效率。此时实参改为只传递结构体指针,从实参传给形参的只是一个地址,就可以大大提高函数调用的效率。10.3.1结构体指针知识点10.3.2结构体指针案例分析案例10.3.1编写程序输入一名候选人的信息,并用指针的方式将其信息输出。#include<stdio.h>typedefstructcandidate{ charname[10]; intno; chargrade[20]; intvotes;}Candidate;intmain(){ intn,i,no,votes; Candidatestu,*pStu; printf("请输入候选人的信息:姓名、学号、班级和票数:\n"); scanf("%s%d%s%d",,&stu.no,stu.grade,&stu.votes); pStu=&stu; printf("输出候选人信息如下:\n"); printf("%s%d%s%d",pStu->name,pStu->no,(*pStu).grade,(*pStu).votes); return0;}请输入候选人的信息:姓名、学号、班级和票数:David2022102922会计37↙输出候选人信息如下:David2022102922会计37运行结果10.3.2结构体指针案例分析案例10.3.2调用函数,根据学号,修改指定候选人的票数。#include<stdio.h>#defineMAX10structcandidate{ charname[10]; intno; chargrade[20]; intvotes;};typedefstructcandidateCandidate;intmodify(Candidate*stu,intn,intno,intvotes);intmain(){ intn,i,no,votes;intindex=-1;charname[20]={'\0'}; Candidatestu[MAX]; scanf("%d",&n); for(i=0;i<n;i++){ printf("请输入候选人的信息:姓名、学号、班级和票数:\n"); scanf("%s%d%s%d",stu[i].name,&stu[i].no,stu[i].grade,&stu[i].votes); } printf("请输入拟修改候选人的信息:学号及票数:");

scanf("%d%d",&no,&votes); index=modify(stu,n,no,votes); if(index==-1){ printf("这个候选人不存在!");

}else{//index中保存的是需要修改候选人的下标

printf("修改后的候选人信息如下:\n"); printf("%s%d%s%d",stu[index].name,stu[index].no, stu[index].grade,stu[index].votes); } return0;}intmodify(Candidate*candi,intn,intno,intvotes){ inti,index=-1;//标记找到的那个候选人的下标

Candidate*p; for(p=candi,i=0;i<n;i++,p++){ if(p->no==no){ index=i; p->votes=votes; break; } } returnindex;}4↙请输入候选人的信息:姓名、学号、班级和票数:Emily2023100023软件工程35↙请输入候选人的信息:姓名、学号、班级和票数:Peter2022102222网络工程12↙请输入候选人的信息:姓名、学号、班级和票数:Eric2022103022信息安全49↙请输入候选人的信息:姓名、学号、班级和票数:Paul2021104021金融学26↙请输入拟修改候选人的信息:学号及票数:2023100050↙修改后的候选人信息如下:Emily2023100023软件工程50运行结果10.3.3结构体指针课堂练习题课堂练习题10.3.1:查找下面程序中的3处错误。编写程序使用结构体指针来操作结构体变量中的成员。#include<stdio.h>intmain(){ structcandidate{ charname[10]; intno; chargrade[20]; intvotes; }stu={"Eric",20221030,"22信息安全",49}; structcandidate*p=&stu; p->no=20221033; *p.votes=46; strcpy(stu.grade,"23信息安全"); printf("theinfomationofstuis%s,%d,%s,%d", ,(*p).no,stu->grade,p->votes); return0;}10.3.3结构体指针课堂练习题课堂练习题10.3.2编写函数来计算两个复数的和与积,将指向复数和与积的指针作为函数的参数。课堂练习题10.3.3:调用函数,修改指定应届毕业生的薪资信息。输入n个应届毕业生的信息,包括姓名、编号、毕业院校、入职公司、薪资,再输入一个应届毕业生的编号,编写函数根据编号修改其薪资和入职公司。【微视频】学生成绩查询与插入10.4链表123链表的链式存储链表的节点链表的组织形式链表的基本操作知识点链表案例分析案例分析链表相关练习题练习题前面章节中,学生会候选人、应届毕业生的信息采用什么方式存储?若进行删除、插入的操作,会涉及到非常多移动的操作,降低了程序执行的效率。C语言提供了一种采用动态存储分配的构造数据类型——链表,大大提高了程序解决此类问题的时间效率。10.4.1链表知识点结构体数组的存储方式优点:便于对信息进行查询、修改、输出操作。如何更好解决删除、插入的问题?链条示意图10.4.1链表知识点先看下链条:由多个金属环串联在一起的前一个金属环扣住下一个金属环。链表就是一种链式存储的结构,由多个相同结构体类型的节点串联一起节点之间相互关联链表分为单向链表和双向链表,本节只讲解单向链表。10.4.1链表知识点每个节点都是一个结构体类型的变量,两部分组成:①

节点本身的数据部分,称为数据域;②

指向下一个节点的指针,称为指针域。以保存29478490这4个数据为例。链表的组织形式——节点10.4.1链表知识点例如:定义structnode结构体类型作为链表节点的类型名,定义如下:typedefstructnode{ intdata;//数据域的值 structnode*next;//指针域的值,next指向下一个链表节点}Node;typedef用法?next指针的类型?链表的组织形式——节点datanext10.4.1链表知识点(1)头指针,链表一般使用头指针head来表示,方便后续对链表的访问和操作。(2)节点,节点分为第一个节点和其他节点。无头节点的单向链表:带头节点的单向链表:涉及的概念:第一个节点,为头结点。存储第一个实际数据的节点,为首元节点。最后一个节点称为尾节点,尾节点后续没有节点,其指针域的值为NULL。链表包括头指针和节点10.4.1链表知识点(1)malloc和free函数链表中的节点,逻辑上:连续的,

物理上:是随机存放的。每个节点的内存空间,通过动态存储分配的。使用stdlib.h头文件中函数。malloc:动态分配内存空间free:释放用malloc动态分配的内存空间链表的基本操作10.4.1链表知识点(1)malloc和free函数malloc函数原型如下: void*malloc(unsignedintsize);在动态存储区分配一个大小为size字节的连续空间。成功:返回分配好的存储空间的首地址;失败:返回值NULL 链表的基本操作举例:double*pd=(double*)malloc(sizeof(double));1、增加程序可移植性2、强制转化为需要的类型10.4.1链表知识点(1)malloc和free函数free函数原型如下: voidfree(void*p);释放掉指针p指向的内容空间。free函数要和malloc函数成对使用。

链表的基本操作举例:structnode*curNode=(structnode*)malloc(sizeof(structnode));…free(curNode);maloc函数申请的空间,不会自动释放。必须由free函数来释放。10.4.1链表知识点(2)单向链表的新建

链表的基本操作创建单链表,保存29478490这4个数据。头结点headrear29首元结点curNoderear->next47rear->next10.4.1链表知识点//生成含头节点的单向链表for(i=0;i<N;i++){//创建新节点curNode,为其动态分配存储空间Node*curNode=(Node*)malloc(sizeof(structnode));curNode->data=array[i];//此时rear指向当前链表的尾节点rear->next=curNode;//将新节点curNode加入到链表中//curNode成为了新的尾节点,更新rear指向curNoderear=curNode;}rear->next=NULL;returnhead;//将头指针返回}typedefstructnode{ intdata;//存储数据域的值 structnode*next;//存储指针域的值,next指向下一个链表节点}Node;#defineN4Node*initLink(){inti=0;intarray[N]={29,47,84,90};//创建头结点Node*head=(Node*)malloc(sizeof(structnode));//声明一个rear指针,指向链表的尾节点 Node*rear=head;(2)单向链表的新建,代码段

10.4.1链表知识点(3)判断单向链表是否为空带头结点单向链表只有头节点,没有后续节点时,被认为单向链表为空

intemptyLink(Node*head){ return(head->next==NULL);}链表的基本操作NULLheaddatanext头结点10.4.1链表知识点(4)单项链表的插入两个节点A和B间插入一个新节点C时,让C与A和B分别建立逻辑联系。

步骤如下:将C节点的next指针指向B节点将A节点的next指针指向C节点链表的基本操作head8429A结点9047头结点B结点35C结点第一步第二步节点间是如何建立逻辑联系?通过前节点next指针指向下一个节点,建立逻辑联系NULL10.4.1链表知识点//在第position个位置处插入数据newData,position从1开始计数Node*insertLink(Node*head,intnewData,intposition){ //因为插入数据时,需要知道插入位置的前一个节点,定义p为前一个节点指针

Node*p=head,*newNode; inti=1; //先找到插入位置的前一个节点

while(i<position){ p=p->next;if(p==NULL){printf("插入位置无效\n");returnhead;}i++; } //找到插入位置,此时p为插入位置的前一个节点

newNode=(Node*)malloc(sizeof(structnode)); newNode->data=newData; newNode->next=p->next; p->next=newNode; returnhead;}(4)单向链表的插入,代码段

头节点的存在,不管新插入的节点,是在首元节点前、还是中间的位置,还是在尾节点后,操作步骤都是一样的。10.4.1链表知识点(5)单项链表的遍历从链表头开始,依次访问单向链表中的每个节点,并将节点的数据值输出,直到链表尾。链表的基本操作head84299047NULLp

voiddisplayLink(Node*head){ Node*p=head->next;//p指向首元节点

while(p!=NULL){//当p不为空,则没有到达链表尾

printf("%d",p->data); p=p->next; }

printf("\n");}10.4.1链表知识点(6)单项链表的删除假设其前驱节点为A节点,则对C节点的删除,需要三步操作步骤:①遍历单向链表,找到需要删除的节点C,并记录前驱节点A。②A节点的next指针指向C节点的next指针③删除C节点链表的基本操作head8429A结点9047头结点35C结点第一步第二步NULL第②、③步能颠倒吗?第三步不能!10.4.1链表知识点//删除链表中数据值为delData的节点。voiddelNode(Node*head,intdelData){ Node*p=head,*curNode=head->next;//curNode指向首元节点

while(curNode!=NULL){ if(delData==curNode->data){//此时p指向A节点,curNode指向C节点 p->next=curNode->next; free(curNode); curNode=p->next; }else{ p=curNode; curNode=p->next; } }}(6)单向链表的删除,代码段

10.4.1链表知识点(7)单向链表的查找遍历单向链表的过程中,比较某个节点的值是否和被查找数据一致,直到找到或者遍历到链表尾(某个节点NULL)结束。链表的基本操作//在链表中查找数据值为needData的节点,找到了则返回该节点的地址,否则返回NULLNode*searchNode(Node*head,intneedData){ Node*p=head,*curNode=head->next;//p指向首元节点

while(curNode!=NULL){ if(needData==curNode->data){ returncurNode; } p=curNode; curNode=p->next; } returnNULL;}10.4.1链表知识点(8)单向链表的修改链表的基本操作/*在链表中查找数据值为oldData的节点,找到后修改成newData,找到了则返回该节点的地址,否则返回NULL*/Node*modifyNode(Node*head,intoldData,intnewData){ Node*p=head,*curNode=head->next; while(curNode!=NULL){ if(oldData==curNode->data){ curNode->data=newData; returncurNode; } p=curNode; curNode=p->next; } returnNULL;}10.4.1链表知识点

为了确保开发的程序不会存在内存泄露,需用free释放每个节点的空间。需要2步操作步骤:①从首元节点curNode开始往后逐个删除。②头节点指针域置为NULL。(此处不删除头结点,等链表不再使用时删除头结点)链表的基本操作head8429首元结点curNode9047头结点35B结点第一步NULL(9)单向链表的整个删除q第二步10.4.1链表知识点//删除整个链表的代码voiddelList(Node*head){ Node*q,*curNode=head->next; while(curNode){ q=curNode->next; free(curNode); curNode=q; }head->next=NULL;}(9)单向链表的整个删除,代码段

10.4.1链表案例分析案例10.4.1用链表结构来存储候选人信息,根据学号查看某个候选人的信息,再修改指定候选人的票数。要求:输入候选人的信息,包括学号、姓名、班级、得票数,直到输入一个-1结束输入。再输入一个候选人学号,编写函数,查询该候选人的信息,发现该候选人的票数不对,再根据这个候选人的学号修改其得票数。#include<stdio.h>#include<stdlib.h>structcandidate{ charname[10]; intno; chargrade[20]; intvotes; structcandidate*next;};typedefstructcandidateCandidate;Candidate*createLink();voiddisplayLink(Candidate*head);Candidate*modifyNode(Candidate*head,intno,intvotes);Candidate*searchNode(Candidate*head,intno);voiddeleteLink(Candidate*head);intmain(){ intno,votes; Candidate*p=NULL; Candidate*head=createLink(); displayLink(head); printf("请输入要查询的候选人的学号"); scanf("%d",&no); p=searchNode(head,no);//根据学号查询候选人信息 if(p==NULL){ printf("这个候选人不存在!"); }else{//p中保存的是被修改的候选人的地址 printf("查询到的候选人信息如下:\n"); printf("%d%s%s%d\n",p->no,p->name,p->grade,p->votes); } printf("请输入拟修改候选人的信息:学号及票数:"); scanf("%d%d",&no,&votes); p=modifyNode(head,no,votes);//根据学号修改票数,并返回被修改的节点的地址 if(p==NULL){ printf("这个候选人不存在!"); }else{//p中保存的是被修改的候选人的地址 printf("修改后的候选人信息如下:\n"); printf("%d%s%s%d\n",p->no,p->name,p->grade,p->votes); } displayLink(head); deleteLink(head); free(head); return0;}10.4.1链表案例分析10.4.1链表案例分析Candidate*modifyNode(Candidate*head,intno,intvotes){ Candidate*p=NULL;//p先指向首元节点 Candidate*curNode=head->next; while(curNode!=NULL){ //判断当前节点的学号是否为要查找的学号 if(curN

温馨提示

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

评论

0/150

提交评论