单链表.ppt.pptVIP

  1. 1、本文档共25页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
单链表.ppt

* 2.3 线性表的链式存储结构 2.3.1 单链表的概念 2.3.2 单链表的基本操作 2.求表长 3.查找操作 4.插入操作 5.删除操作 作者: 王 榛   由于顺序表的存贮特点是用物理上的相邻实现了逻辑上的相邻,它要求用连续的存储单元顺序存储线性表中各元素,因此,对顺序表插入、删除时,需要通过移动数据元素来实现,影响了运行效率。 本节介绍线性表链式存储结构,它不需要用地址连续的存储单元来实现, 它是通过“链”建立起数据元素之间的逻辑关系,因此对链表的插入、删除不再需要移动数据元素了。 2.3 线性表的链式存储和运算实现 结点的结构如右图所示 存放数据元素信息的部分称为数据域,存放其后继地址的部分称为指针域。 因此,n个元素的线性表通过每个结点的指针域拉成了一个“链子”,称之为链表。因为每个结点中只有一个指向后继的指针,所以称其为单链表。 2.3.1 单链表 data next 链表:通过一组位置任意的存储单元,来存储线性表中的数据元素。 怎样表示出数据元素之间的线性关系呢? 对每个数据元素ai,除了存放数据元素的自身的信息 ai 之外,还需要和ai一起存放其后继 ai+1 所在的存贮单元的地址,这两部分信息组成一个“结点”。 链表是由一个个结点构成的,结点定义如下: typedef struct node { datatype data; struct node *next; } LNode,*LinkList; 定义头指针变量: LinkList H; LinkList L; a1 an ∧ H … a2 P p-data p-next H 160 链表示意图 申请一个结点 图2.7 链式存储结构 需要进一步指出的是:上面定义的LNode是结点的类型,LinkList是指向Lnode类型结点的指针类型。 通常将标识一个链表的头指针说明为LinkList类型的变量,如 LinkList L ; 当L有定义时,值要么为NULL,表示一个空表;要么为第一个结点的地址。 若将操作中用到指向某结点的指针变量说明为LNode *类型,如 LNode *p; 则语句:p=malloc(sizeof(LNode));则完成了申请一块 Lnode 类型的存储单元的操作,并将其地址赋值给变量p。 该结点的数据域为 (*p).data 或p-data,指针域为 (*p).next 或 p-next。free(p)则表示释放 p 所指的结点。 2.3.2 单链表上基本运算的实现 1. 建立单链表 (1)在链表的头部插入结点建立单链表 链表与顺序表不同,它是一种动态管理的存储结构,链表中的每个结点占用的存储空间不是预先分配,而是运行时系统根据需求而生成的,因此建立单链表从空表开始,每读入一个数据元素则申请一个结点,然后插在链表的头部,如图2.10 展现了线性表:(25,45,18,76,29)之链表的建立过程,因为是在链表的头部插入,读入数据的顺序和线性表中的逻辑顺序是相反的。 ∧ 25 ∧ 4525 18 76 29 76 18 25 ∧ 4525 18 25 ∧ 4525 25 ∧ 25 ∧ 4525 图2.10 在头部插入建立单链表 L 算法如下: LinkList Creat_LinkList1( ) { LinkList L=NULL;/*空表*/ Lnode *s; int x; /*设数据元素的类型为int*/ scanf("%d",x); while (x!=flag) { s=malloc(sizeof(LNode)); s-data=x; s-next=L; L=s; Scanf ("%d",x); } return L; } 用头插入法建立单链表简单,但读入的数据元素的顺序与生成的链表中元素的顺序是相反的,若希望次序一致,则用尾插入的方法。因为每次是将新结点插入到链表的尾部,所以需加入一个指针 r 用来始终指向链表中的尾结点,以便能够将新结点插入到链表的尾部,如图2.11展现了在链表的尾部插入结点建立链表的过程 。 (2)在单链表的尾部插入结点建立单链表 29 76 12 365 89 ∧ L 29 L 76 29 L 18 76 29 L 25 ∧ 4525 18 76 29 L 4525 ∧ 18 76 29 L 图2.11 在单链表的尾部插入结点建立单链表 ∧ ∧ ∧ 29 76 12 365 89 ∧ L 算法思路:

文档评论(0)

170****0571 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档