- 1、本文档共108页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
(第3章 链表
第3章 链表 3.1 线性表的链式存储结构表示 3.2 单链表的基本操作 3.3 单链表应用举例 3.4 循环链表 3.5 双向链表 3.6 各种链式存储结构的比较 3.7 顺序表与链表的结构和应用比较 3.8 链表应用举例 3.9 小结 习题3 3.1 线性表的链式存储结构表示 图3-1所示为结点结构表示。 从链表的整体结构上看,链表可以是空链,也可以由一个或多个结点组成。每条链有一个入口的头结点,该结点仅指示链中第一个结点的地址。如是空链,则可表示为“0”或“∧”,它类似于一个常量。每条链的最后一个结点的链指针为“0”,也可用“∧”作为链的结束标志。图3-2给出了链表的示意形式。图3-2(a)中有一个头结点和具有A、B、C、D数据元素的链,图3-2(b)所示为线性链表的一般表示,结点与结点之间用箭头链接。 在链表的实际应用中,每个结点可以包含一个或若干个数据域或若干个指针域。多链结点的一般结构如图3-3(a)所示;图3-3(b)所示为某工资管理程序中每个职工为一个结点的多数据项及链指针指向另一个职工结点的链地址项。 从图3-4中可以看出,链表中数据元素A、B、C、D的逻辑顺序是依靠结点的链指针确定的。线性表的第一个元素A必定在存储区域的第一个单元,而链表就不一定,其入口可根据实际需要而定,如图3-4(b)中的链的入口Head为2008,最末一个结点2002的指针域为“∧”,表示链结束。 在链表的实际应用中,往往用数组的形式表示链表的存储空间,图3-5给出上例中5个数据元素的存储和指针表示,该结构可以在各种高级语言中实现。在图3-5(a)中链的入口Head为6,DATA(6)表示6号结点的数据为A,LINK(6)为1,表示6号结点的后续结点为1,LINK(8)为0,表示该链结束。图3-5(b)所示是以该数组的存储方式为基础画出的链的一般表示,它更具有实用性和直观性。对于涉及链结构的程序设计,可根据要求画出示意图,这将有助于程序设计的实现。 3.2 单链表的基本操作 3.2.1 单链表的建立 在用C语言编写程序时,若线性链表中的结点有一个数据和一个链指针,且数据的类型为字符,则可以做以下类型说明: type def struct node { char data; struct node * next; }node; 其中,next为指针变量;node为记录。 若用函数建立有n个结点的链表,数据值在A(n)中,n≥1,那么,在链表的建立过程中,首先要把第一个结点作为链的入口,最末一个结点的指针设置结束标志。算法如下: struct node { int data; struct node * next; } GREATE(a,head) /* 建立一条有n个结点(n≥1)的链表,入口为head */ { p=malloc(size);head=p;w=p; /* 在系统空间中,取一个结点地址为p的空结点,并形成链的入口head */ p-data=a[1]; for(i=2;i=n;i++) { p=malloc(size); w-next= p; /* 前次结点与本次结点链接 */ p-data=a[i]; w= p; } /* 逐个建立链中的结点 */ p-next=NULL; /* 建立链的结束标志 */ } 第二种建立链表的方法是用数组的形式,如图3-6给出的数组的链表示意,其中链表入口为Head,AV是空间表的入口,链表有5个元素,顺序表示为A、B、C、D、E。从图中还可以看出,空间表还有4个可利用结点。图3-7所示的是线性链表和空间表的逻辑状态示意图。 图3-7所示的是线性链表和空间表的逻辑状态示意图。 ? 用数组形式建立链表时,只要按设计的数据域和指针域的数值,建立数组DATA(i)和LINK(i),并建立链表和空间表的入口即可。建立链表的算法如下: GREATE(data[ ], link[ ], head , av) /* 以data[n]和link[n]数组建立链表,链表入口为head,空间表入口是av */ { for(i=1;i=n;i++) scanf(%d %d,data[i],link[i]); /* 在数据域和指针域读入数据 */ head = j; /* 建立链表的入口 */ av = k; /* 建立空间表的入口 */ } /* head是链表入口 */ 3.2.2 单链表元素定位操作 图3-8所示的是线性链表查找算法的框图。 根据框图可得出线
文档评论(0)