



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第十三讲 指向结构体的指针与链表 本讲首先介绍了C语言中指向结构体变量和结构体数组的指针变量的使用,接着介绍了结构体数据作为函数参数的使用,最后介绍了链表的概念和基本操作。要求大家掌握指向结构体变量的指针变量和指向结构体数组及数组元素的指针变量的定义和引用,理解指向结构体变量的指针变量、结构体变量及其成员作为函数参数的使用方法,掌握链表中结点的描述方式,了解链表的建立、输出、插入和删除操作。 知识要点 指向结构体变量的指针变量1. 指向结构体变量的指针变量的定义2. 利用指向结构体变量的指针变量对结构体变量成员的引用 指向结构体数组的指针变量1. 指向结构体数组的指针变量的使用 结构体数据作函数参数1. 结构体变量的成员作函数参数2. 结构体变量作函数参数3. 指向结构体的指针作函数参数 链表的概念1. 链表的组成2. 结点用结构体类型描述3. 动态申请和释放内存单元的函数 链表的操作1. 建立链表2. 在链表中插入结点3. 删除链表中的结点 13.1 指向结构体变量的指针变量 指向结构体变量的指针变量的定义形式与一般指针变量的定义形式相同,只是将其指向类型定义为结构体类型即可。例如: struct person char name20; char sex; int age; float height; ; struct person *p;则指针变量p,它可以指向struct person类型的结构体变量。 将一个指针变量指向一个结构体变量后,可以利用指向该结构体的的指针变量引用成员,如: (* 指针变量名)成员名以上形式也常写成: 指针变量名成员名其中,为指向运算符,它是由符号“”和“”两部分构成的。指向运算符的优先级和成员运算符相同,也是最高一级。13.2 指向结构体数组的指针变量 指针变量可以指向整型、字符型、浮点型等基本类型数组。同样,指针变量也可以指向结构体类型的数组。 程序L13_2.C功能:使用指向结构体数组的指针变量。 #include void main() struct person char name20;char sex;int age;float height;per3= Li Ping, M ,20,175,Wang Ling, F ,19,162.5,Zhao Hui, M ,20,178;struct person *p;for (p=per;pname, psex, page, pheight); 13.3 结构体数据作函数参数 不仅结构体变量的成员可以作函数参数,结构体变量以及指向结构体变量的指针都可以作函数参数。 一、结构体变量的成员作函数参数 结构体变量的成员作实参与简单变量、数组元素等作实参是一样的。 二、结构体变量作函数参数 C允许将整个结构体变量作为函数参数传递。传递的是结构体变量全部成员的值,将实参中成员的值赋给对应的形参成员。 用结构体变量作实参时,由于要为形参结构体变量分配存储空间,还要一一对应传递各成员的值,这样会增加处理的时间同时也浪费了内存空间,从而影响程序的运行效率。 三、指向结构体的指针作函数参数 使用指向结构体的指针作函数实参,形参也必须是一个指向相同结构体类型的指针变量,其它使用方法不变。13.4 链表的概念 链表是动态数据结构中最基本的形式,它的规模大小可以根据需要进行动态变化,达到合理地使用存储空间。 链表有一个“头指针”变量,用来指向链表的第一个元素。链表中的每个元素都称为“结点”,结点包含两部分内容:一是实际的数据信息;二是下一结点的指针,。链表的最后一个元素置为“NULL”(空地址),标志链表结束。 一个结点可以用一个结构体类型来描述。结构体中包含若干成员,用来表示结点的数据信息。此外必须有一个成员是与结点类型一致的指针,用来指向后续结点。例如,一个链表的结点可以定义为以下的结构体类型: struct node int data1; float data2; struct node *next; ;其中,成员next是指向结点的指针变量,它指向next所在的struct node结构体类型数据。C系统的库函数中提供了动态申请和释放内存存储单元的函数。 (1)malloc函数 malloc函数的原型为: void *malloc(unsigned int size) 函数的功能是:在动态存储区域中分配一个size字节的连续空间。函数的返回值为指针,它的值是所分配的存储区域的起始地址。如没有足够的存储空间分配,则返回0(记为NULL)值。 (2)calloc函数 calloc函数的原型为: void *calloc(unsigned int n, unsigned int size) 函数的功能是:在动态存储区域中分配n个为size字节的连续空间,并将该存储空间自动置初值0。函数的返回值为指针,它的值是所分配的存储区域的起始地址。如分配不成功,则返回0值。 (3)free函数 free函数的原型为: void free(void *ptr) 函数的功能是:释放由ptr所指向的存储空间。ptr的值必须是malloc或calloc函数返回的地址。此函数无返回值。13.5 链表的操作 一、建立链表 建立链表就是从无到有逐渐增加链表结点的过程,即输入结点数据,并建立前后链接的关系。 下面是建立链表的函数creat() : struct node *create( ) struct node *head, *tail, *p;int x;head=tail=NULL;printf(n请输入一个整数:);scanf(%d,&x);while(x!=0) p=(struct node *)malloc(sizeof(struct node);pdata=x;pnext=NULL;if (head= = NULL)head=tail=p;else tailnext=p;tail=p;printf(请输入一个整数:);scanf(%d,&x);return (head);二、在链表中插入结点 插入结点的操作有以下几种情况: (1)链表是空链表,插入的结点作为链表的第一个结点。(2)链表非空,结点插入到链表的第一个结点前,使插入的结点成为链表第一个结点。(3)链表非空,结点插入到链表的末尾,使插入的结点成为链表最后一个结点。(4)链表非空,结点插入到链表中间某个结点之后。 下面函数insert (struct node *head, int value)的作用是在已知头结点head链表中按照从小到大的顺序插入数据value。 struct node *insert(struct node *head, int value )struct node *new, *p, *q;new=(struct node *)malloc(sizeof(struct node);newdata=value;p=head;if(head= =NULL) /*链表是空链表*/ head=new;newnext=NULL;else while(pnext !=NULL) &(pdatanext; if(pdata=value) if(head= =p) /*链表非空,插入到第一个结点前*/ newnext=head;head=new;else /*链表非空,插入到链表中间*/ qnext=new;newnext=p;else /*链表非空,插入到链表末尾*/ pnext=new;newnext=NULL;return(head); 三、删除链表中的结点 从链表中删除结点,是指把该结点从链表中分离出来,即改变链表的链接关系。从链表中删除的结点有两种处理情况:一是调用函数free()来释放该结点所占的存储空间,将它从内存中删除;二是将该结点插入到其它链表中等待处理。 下面函数delete(struct node *head, int value)的作用是在已知头结点head链表中查找一个数据value,并从链表中删除。 struct node *delete(struct node *head, int value ) struct node *p, *q;p=head;if(head= =NULL) /*链表是空链表*/ printf(这是一个空链表!n); return(head); while(pnext !=NULL) &(pdata!=value) /*寻找删除结点位置*/ q=p; p=pnext; if(value= = pdata) if(head= =p) head=pnext; /*删除链表第一个结点*/else qnext=pnext; /*删除链表结点*/free(p);elseprintf(此链表没有数据%d!n,value); /*链表中无此结点*/return(head); 学以致用 1. 在例13.5的基础上,增加一个求链表中所有结点数据之和的函数add(),在主函数中输出结果。 2. 修改例13.5,使得建立的链表是一个由浮点数据组成的无序链表,然后将链表中所有结点数据按照从小到大的顺序生成一个新的链表,最后输出显示。 3. 已知一个链表中存储了若干名学生的信息,每名学生的信息包括:学号、英语成绩、数学成绩、计算机成绩。现编写一个函数search(),要求根据输入的学生学号,输出他的各科成绩。 4. 使用链表存储同学的通讯录,内容包含姓名、地址、邮政编码和电话,然后利用函数delete(),根据输入的同学姓名,删除该同学
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 儿童玩偶租赁合同样本
- 信息买卖合同样本
- 2025中学实习教师合同
- 个人房屋 涂料合同样本
- 传媒公司交易合同样本
- 公司房子抵押合同样本
- 二手车 合同样本
- 供货渠道合同样本
- 代理经营店铺合同样本
- 保险信息服务合同标准文本
- 2025-2030全球智能低氧训练系统行业调研及趋势分析报告
- 2025年山东省鲁信投资控股集团招聘笔试参考题库含答案解析
- 2025年安徽国控资本有限公司招聘笔试参考题库含答案解析
- 厦门房地产经纪机构备案表-厦门房地产中介行业协会
- 如何利用+Agent+解决企业数据分析与洞察的经验探索-数势科技+李飞
- 2024商场能源管理及节能改造项目合同范本3篇
- 广东中考英语2020-2024年5年真题汇编-学生版-专题07 阅读理解之说明文
- 智能悬架系统集成开发关键技术与实践-2024-12-技术资料
- 全国第三届职业技能大赛(无人机驾驶(植保)项目)选拔赛理论考试题库(含答案)
- 2024年度微生物菌剂产品试用与反馈协议3篇
- 成人肥胖食养指南(2024年版)
评论
0/150
提交评论