网站大量收购独家精品文档,联系QQ:2885784924
  1. 1、本文档共32页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
chap9 链表

动态数据结构 本章简介 链表的作用 动态空间管理的方法 链表的建立 链表的操作 9.1链表的概念 链表是动态地进行存储分配的一种数据结构,它的特点是用一组任意的存储单元存放数据元素。 9.1链表的概念 在C语言中,一个简单的结点设计如下: struct Node /*结点的结构体类型定义*/ { int data; /*结点的数据成员*/ struct Node *next; /*结点的指针成员,类型为struct Node,存放下一个结点的地址*/ }; 可用该结点类型定义一个结点a: typedef struct Node NODE; NODE a; /*定义a结点*/ a.data=80; /*给数据域赋值*/ a.next=NULL; /*给指针域赋值,此处赋空值,也可写成a.next=\0;*/ 9.1链表的概念 【例9-1】一个简单的单向链表。实现图9-1中链表的建立和输出。 9.2动态内存分配 1、malloc函数 其函数原型为 void *malloc(unsigned int size); malloc()函数用来动态分配内存,所分配的空间长度为size,函数的返回值为指向该区域起始地址的指针(基类型为void);若分配不成功则返回NULL。 malloc()函数常用的调用形式为: (数据类型*)malloc(size); 其中的(数据类型*)表示把返回值强制转换为该数据类型的指针。 比如在例9-1中已经有关于结构体NODE的声明,则语句: NODE *p; p=(NODE*)malloc(sizeof(NODE)); 表示分配一块存储空间,其大小为NODE结构类型的长度,由于malloc函数返回的类型是void的,因此又将其强制转换为NODE类型的指针,且把该指针赋予同类型的指针变量p。 9.2动态内存分配 2、calloc函数 其函数原型为 void *calloc(unsigned n,unsigned size); calloc()函数用于动态分配内存,一次可分配n个长度为size的连续空间,函数的返回值为指向该区域起始地址的指针(基类型为void);若分配不成功则返回NULL。 用calloc()函数可以为一维数组开辟动态存储空间,n为数组元素的个数,每个元素长度为size。 9.2动态内存分配 3、free函数 其函数原型为 void free(void *p); 其作用是释放由p指向的内存区,使这部分内存区能被其他变量使用。p是调用malloc或calloc函数时的返回值。free()函数无返回值。 9.2动态内存分配 9.3.1单链表的建立 创建一个链表一般需要以下几个步骤: (1)定义链表的数据结构。 (2)读取数据。 (3)若读入的是有效数据,则生成一个新结点,即利用malloc()函数向系统申请分配一个结点。 例如: struct node *head; head=(struct node*)malloc(sizeof(struct node)); 从系统中获得一块用以存储node的内存空间,经过强制类型转换后将地址赋予指针head。 (4)将数据存入结点的成员变量中。 (5)将新结点插入到链表中。 (6)判断是否有后续结点要接入链表,若有转到(3),否则结束。 9.3.1单链表的建立 【例9-3】 建立一个有若干个学生信息的单向链表。学生信息包括学号、姓名、一门课程成绩。以学号0作为结束标记。 9.3.1单链表的建立 9.3.1单链表的建立 9.3.1单链表的建立 9.3.2单链表的访问 将链表中各结点数据依次输出的步骤主要如下: (1)找到链表的头指针。 (2)若链表非空,则输出结点的成员值,否则退出。 (3)寻找下一个结点的地址。 (4)转到(2)。 9.3.2单链表的访问 【例9-4】 编写函数print,顺序输出存放学生信息的单向链表各结点数据域中的内容。 9.3.2单链表的访问 9.3.2单链表的访问 9.3.2单链表的访问 9.3.3单链表的插入 要在链表中包含值x的结点之前插入一个包含值y的结点。其插入过程如下: (1)首先需要申请新结点s,并对其数据域赋值。 (2)在链表中寻找插入位置,将包含x的结点的地址设为p2,将x前面的那个结点的地址设为p1。如图9-5(a)。 (2)将结点s插入到结点p2的前面。为了实现这一步,需要改变以下两个结点的指针域内容: ①使结点s的指针域的内容指向结点p2: s-next=p2; ②使结点p1的指针域的内容改为指向结点s: p1-next=s; 这两个步骤的顺序不能交换。 9.3.3单链表的插入 【例9-5】 编写函数insert,在单向链表中插入一个结点

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档