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

结点定义 * * 湖南理工学院信息与通信工程学院 数据结构 第二章 线性表 线性表的定义 线性表的顺序存储结构 线性表的链式存储结构 线性表的应用 2.3 线性表的链式存储结构 思考: 顺序存储结构有哪些优缺点? 逻辑上相连的内容物理上也相连 查找速度快 插入删除元素存在元素的移动,耗时,速度慢 有空间限制,当存取的元素个数多于顺序表的元素个数时,会发生溢出 线性链表与相关操作实现 链表(linked list)是一种由结点组成的数据结构每个结点都包含数据元素信息和指向链表中另一个结点的指针。 ZHAO QIAN SUN LI ZHOU WU ZHENG WANG ^ H 例 线性表 (ZHAO,QIAN,SUN,LI,ZHOU,WU,ZHENG,WANG) 43 13 1 NULL 37 7 19 25 数据域 指针域 LI QIAN SUN WANG WU ZHAO ZHENG ZHOU 存储地址 1 7 13 19 25 31 37 43 31 H 头指针 思考:如何表示 一个空表? 头指针为空, 即H = NULL 线性表链式存储结构的特点 用一组任意的存储单元存储线性表的数据元素 利用指针实现了用不相邻的存储单元存放逻辑上相 邻的元素 每个数据元素ai,除存储本身信息外,还需存储其直 接后继的信息 结点 数据域:元素本身信息 指针域:指示直接后继的存储位置 单链表 当一个链表中只含有指向它的后继结点的链接时,就称该链表为单链表。 struct Node { data; *next; }; ElemType struct Node typedef struct Node LNode; typedef struct Node *LinkedList; LNode *h,*p; data next p 结点(*p) 生成一个新结点: p=(LinkList) malloc ( sizeof ( LNode )); 系统回收p结点:free(p) 单链表的基本操作 单链表初始化就是建立一个空的链表。 /*不带头结点的单链表初始化*/ void LinkedListInit1(LinkedList L) { L = NULL; } 1.初始化 带附加表头结点的单链表 head 31 59 27 40 表头 表尾 ? 附加头 结点 /*带头结点的单链表初始化*/ LinkedList LinkedListInit2(LinkedList L) { L = (LNode *)malloc(sizeof(LNode)); if(L == NULL) { printf(申请空间失败!\n); exit(0); } L-next = NULL; printf(带头结点的线性链表初始化成功!\n); return L; } 单链表的基本操作 单链表求表长操作需要设定当前指针p和一个计数器j,初始时p指向链表中的第一个结点,当p每向下移动一个结点时,j就加1,直到p链表的尾部。 /*带头结点的单链表求表长*/ int LinkedListLength(LinkedList L) { LinkedList p; p = L-next; int j = 0; while(p != NULL) { j++; p = p-next; } return j; } 2.求表长操作 时间复杂度为O(n) 单链表的基本操作 单链表的插入操作就是在结点p之前插入一个新的结点q,该结点的数据域为e。 对于不带头结点的单链表,p的位置有所不同,插入操作有下面两种情况。 在链表的表头插入 在表头插入新的结点时,需要执行下面3个步骤。 (1) 创建了一个新的结点q。 (2) 将此新结点的数据域赋值为e,并将它的next指针指向第一个结点,即L。 (3) 将L修改为指向新的结点q。 在链表的中间插入 在链表的中间插入时,需要执行下面4个步骤。 (1) 创建了一个新的结点q。 (2) 将此新结点的数据域赋值为e,并将它的next指针指向p。 (3) 查找到p的前驱结点pre。 (4) 将pre的next指针指向新创建的结点q。 3.插入操作 LinkedList LinkedListInsert(LinkedList L,LinkedList p,ElemType e) { LNode *q = (LNode *)malloc(sizeof(L

文档评论(0)

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

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

1亿VIP精品文档

相关文档