ds02_线性表03_单链表.pptVIP

  • 4
  • 0
  • 约1.06万字
  • 约 41页
  • 2017-03-26 发布于贵州
  • 举报
ds02_线性表03_单链表ds02_线性表03_单链表

第2章 线性表 2.3 线性表的链式表示和实现 List Overview Linked lists Abstract data type (ADT) Basic operations of linked lists GetElem, Insert, Delete, Create,Merge,Print, etc. Variations of linked lists Circular linked lists Doubly linked lists 2.3 线性表的链式表示和实现 顺序表的特点是用物理位置上的邻接关系来表示结点间的逻辑关系,这一特点使我们可以随机存取表中的任一结点,但它也使得插入和删除操作会移动大量的结点。 为避免插入和删除的线性开销,我们需要允许表结点可以不连续的存储。下面介绍线性表的另一种存储方式,即链式存储结构,简称为链表(Linked List)。 单链表(Single Linked List) 循环链表 双链表 2.3.1 线性链表 存储思想:用一组任意的存储单元存放线性表的元素。任意指的是这组存储单元可以: 连续 不连续 单链表的存储 单链表的画法 通常,将链表画成一个有序的结点串,用箭头表示链域中的指针。 LinkList由若干结点构成 每个结点包括 data:数据域, 存储数据元素 next:指针域, 存储指向后继结点的指针, 也称链域 单链表的画法 单链表存储结构 显然,单链表可以由表头唯一确定,因此单链表可以用头指针的名字来表示。 C语言描述的单链表存储结构如下(记忆) typedef struct LNode{ ElemType data; struct LNode *next; }LNode,*LinkList; 假设L是LinkList型的变量,则L为单链表的头指针,它指向表中第一个结点。 LinkList L; 头结点 我们一般会在第一个结点之前附设一个类型相同的结点,称之为头结点。 其数据域可以不存储任何信息,也可存储如线性表长度等附加信息 注意:与首(元)结点的概念不同 头结点的作用----统一操作 单链表的基本操作 GetElem_L, ListInsert_L, ListDelete_L, CreateList_L MergeList_L 单链表的按位查找 单链表的按位查找 单链表不能象顺序表中那样直接按序号i访问结点,而只能从链表的头指针出发,顺链域next逐个结点往下搜索,直到搜索到第i个结点为止。 设单链表的长度为n,要查找表中第i个结点,仅当1≤i≤n时,i的值是合法的。我们将头结点看做是第0个结点,其算法如下: 单链表的按位查找--算法伪码 1. i合法性检查 2. 位置指针p指向第一个结点; 计数器j初始化为1; 3. 循环直到p为空或p指向第i个结点 3.1位置指针p后移; 3.2计数器j加1; 4. 若p为空,则第i个元素不存在,抛出查找位置异常;否则查找成功,结点p的数据元素赋值给e。 单链表的按位查找---算法 Status GetElem(LinkList L, int i, ElemType e) // 算法2.8 P29 { // L为带头结点的单链表的头指针。 // 当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR if (i1) return ERROR; // i合法性检查 LNode* p = L-next; // p指向第一个结点 int j = 1; // j为计数器, 与p始终保持一致,故初值为1 while (p ji) // 顺指针向后查找,直到p指向第i个元素或p为空 { p = p-next; // p指向下一个结点 ++j; } if (!p) return ERROR; // i表长 e = p-data; // 取第i个元素 return OK; } 单链表的按位查找---复杂度分析 基本操作:指针后移和自增运算 频度: 若1=i=n, 频度为i-1 否则,频度为n O(n) 单链表的插入 单链表的插入 单链表的插入---伪码 1. 位置指针p初始化;计数器j清零; 2. 查找第i-1个结点并使位置指针p指向该结点; 3. 若查找不成功,说明插入位置不合理,抛出插入位置异常;否则, 3.1 生成一个元素值为e的新结点s; 3.2 将新结点s插入到结点p之后。 另一种伪码 Locate i-1’th element Allocate memory for the new node Point the new node

文档评论(0)

1亿VIP精品文档

相关文档