- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
常州信息职业技术学院 C语言程序设计 常州信息职业技术学院 C语言程序设计 5.7 链表 2、掌握链表的建立、插入和删除算法 3、能利用链表编写应用程序 4、能够独立思考编写代码,并基本熟练 在VC6.0环境下进行程序的调试和测试 知识/能力目标 1、了解动态存储分配和链表的基本概念 (一)动态存储分配 我们把由程序员控制存储分配方法,根据需要临时分配存储单元用以存放有用的数据,当数据不用时又可以随时释放存储单元的过程称为动态存储分配。 一、动态存储分配及链表的概念 数组的特点 2.向数组中插入或删除一个元素时,该元素后的所有元素都要向后或向前移动,增加了对内存的访问量;且当数据无用时,不能及时释放存储空间为其他变量所用; 1.系统为数组分配一片连续的存储空间 ;对数组元素的访问非常方便,只要指定其下标就可以; 3.用数组存放数据时,必须事先定义固定的长度,在某些情况下可能会出现比较严重的内存浪费现象。 一、动态存储分配及链表的概念 (二)链表 链表 能够弥补数组存在的上述缺陷。 0012FF20H 03101 李晗 …… 0012FF32H 03102 王丽丽 …… 0012FF5CH 03108 吴婷 …… NULL head 0012FF20H 0012FF32H 0012FF5CH 头指针,存放开始结点的地址 开始结点(头结点) 尾结点,指针域为空 数据区,存放本结点的数据 指针区,指向下一结点 结点 图5-16 一个简单的单向链表 typedef struct node { char num[10]; char name[20]; … struct student *next; }NODE; (一)分配内存空间malloc()函数 二、用于动态存储分配的函数 调用形式 (类型说明符*) malloc (size) 作 用 在内存的动态存储区开辟一块长度为size个字节的连续区域。若成功分配,则函数的返回值为该区域的首地址,否则返回空指针。 示 例 long *p; p=(long *)malloc(8); 把开辟的8个字节的存储空间转换为long型,并把该空间的起始地址赋给指针变量p,使p指向该空间。 (二)realloc()函数 二、用于动态存储分配的函数 调用形式 (类型说明符*) realloc (指针变量ptr, size) 作 用 将指针变量ptr指向的存储空间(用malloc()分配的)的大小改为size个字节。 说 明 当用函数malloc()分配的存储空间的大小需要改变时,使用该函数。 (三)calloc()函数 二、用于动态存储分配的函数 调用形式 (类型说明符*) calloc (n, size) 作 用 在内存的动态存储区开辟n个大小为size个字节的连续区域。若成功分配,则函数的返回值为该区域的首地址,否则返回空指针。 示 例 struct student *stu[30]; stu[0]=(struct student *)calloc(30,sizeof(struct student)); 把申请的30*sizeof(struct student)个字节的存储空 间转换为struct student结构体类型并赋给结构体指 针数组元素stu[0],使stu[0]指向开辟的存储空间 的首地址。 (四)free()函数 二、用于动态存储分配的函数 调用形式 free (指针变量ptr) 作 用 释放指针变量ptr指向的存储空间。 示 例 struct student *p; p=(struct student *)malloc(sizeof(struct student)); … … … free(p); ANSI C标准要求在使用动态存储分配函数时,要在程序的前面使用编译预处理命令#include stdlib.h,还有许多编译系统是使用命令#include alloc.h。 (一)链表的建立 1.头插法建不带头结点的单链表 三、链表的建立、插入和删除 s a head (1)将头指针置为NULL (2) 生成一个新结点S (3)将结点的值写入数据域 (4)将head的值写入结点的指针域 (5)将新结点的地址s赋给head (6)重复(2)-(5),建立多个结点 ^ 说明:头插法建立的单链表结点的次序与数据输入的次序相反,即最先输入的是链表的尾结点,最后输入的是链表的开始结点。 s c head a ^ b LinkList CreatListF(void) {//返回单链表的头指针
文档评论(0)