线性表的链式存储结构

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2.2 线性表的顺序存储结构 (3)
假设每个数据元素占用k个存储单元,b为第一个元素的存 储地址,则线性表中任意相邻的两个数据元素ai-1与ai的存储 地址之间满足下面的关系: LOC(ai) = LOC(ai-1) + k 线性表中的任意一个元素ai的存储地址与第一个元素的存储地 址之间满足: LOC(ai) =b+(i-1)k
第 2 章 线性表
2.1 线性表的定义及运算 2.2 线性表的顺序存储结构
2.3 线性表的链式存储结构
2.4 顺序表与链表的比较
2.5 典型题例
2.6 实训例题
2.1 线性表的定义及运算 (1)
2.1.1 线性表的定义 线性表(linear list)是一种最简单且最常用的数据结构。 一个线性表是n(n>=0)个具有相同类型的数据元素构成的有 限序列(a1,a2,…,an)。其中元素的个数n定义为线性表的长 度,当n=0时称为空表,空表中没有任何数据元素。 由26个英文字母构成的表(a,b,c,…,z)是一个线性表; 由全体职工的基本工资构成的表 (1236.60,1669.80,900.00,890.00,…,1842.00)是线性表。
a1 存储首址 b a2 b+k … … ai-1 b+(i-2)k ai b+(i-1)k … … an b+(n-1)k
图2.1 线性表的顺序存储
2.2 线性表的顺序存储结构 (2)
假设每个数据元素占用k个存储单元,b为第一个元素的存 储地址,则线性表中任意相邻的两个数据元素ai-1与ai的存储 地址之间满足下面的关系: LOC(ai) = LOC(ai-1) + k 线性表中的任意一个元素ai的存储地址与第一个元素的存储地 址之间满足: LOC(ai) =b+(i-1)k 顺序存储结构可以借助于高级程序设计语言中的数组来 表示,一维数组的下标(从0开始)与元素在线性表中的序 号(从1开始)一一对应。其类型描述如下。
2.2 线性表的顺序存储结构 (6)
下面分析算法的时间复杂度(查找成功时)。算法中的基本 操作是i++,它出现在 while 循环中,该操作的执行次数取 决于要查找的元素在线性表中的位序,设Pi为查找第i个元素 的概率,并假设对任何位置上元素的查找都是等概率的,即 Pi =1/n,i=0,1, …,n-1。设Eloc为在长度n的表中查找一元 素时i++操作的平均执行次数,则: Eloc=
1 n 1 n 1 Pi * i i n i 0 2 i 0
n 1
所以算法的平均时间复杂度为:O(n)。
2.2 线性表的顺序存储结构 (7)
2.插入运算
插入之前 移动元素 插入之后
a1

ai-1
ai

an
a1

ai-1
e
ai

an
图2.2 在第i个元素前源自文库入e
2.2 线性表的顺序存储结构 (8)
2.2 线性表的顺序存储结构 (1)
2.2.1 顺序表
顺序表是线性表的顺序存储表示的简称,它指的是,用一 组地址连续的存储单元依次存放线性表中的数据元素,即以存 储位置的相邻表示位序相继的两个数据元素之间的前驱和后继 (线性)的关系(逻辑关系),并以表中第一个元素的存储位 置作为线性表的起始地址,称作线性表的基地址。其特点是逻 辑上相邻的数据元素,其物理(存储)位置也是相邻的。
2.1 线性表的定义及运算 (2)
表2.1所示的电话号码表也是一个线性表,其数据元素是由 姓名、职务、所在部门、联系电话四个数据项构成,是复杂的 结构类型。 表2.1 电话号码表 姓名 彭燕 刘文 辉 职务 系主任 系书记 系主任 系书记 所在部门 机械系 机械系 经济系 经济系 联系电话 65620177 65620189 65623008 65623009
void InsList(SeqList *l, int i, ElemType e) /*在顺序表l中第i(i应视作数组的下标)个数据元素之前插入 元素e*/ { if((i<0) || (i>l-> listlength)) /*判断插入位置是否合法*/ printf(“Error”); if(l-> listlength >= MaxSize-1) /*判断表是否已满*/ { printf(“Overflow”); return; } for(k=l-> listlength-1; k>=i; k--) /*将元素elem[listlength-1..i]依次向后移动一个单元*/ l->elem[k+1]=l->elem[k]; l->elem[i]=e; l-> listlength++; } /*InsList*/
赵庚 利
宋四 全 …
2.1 线性表的定义及运算 (4)
2.1.2 线性表的基本运算 (1) InitList(l),初始化线性表l。 (2) EmptyList(l), 判断线性表l是否为空表,如果l为空表则返回1,否则返回0。
(3) ListLength(l),求线性表l的长度。
(4) Locate(l,e),求线性表l中元素e的位置。 (5) GetData(l,i),返回线性表l中第i个元素的值。 (6) InsList(l,i,e),在l中第i个元素(位置)之前插入数据元素e。 (7) DelList(l,i),删除l中的第i个数据元素。
2.2 线性表的顺序存储结构 (4)
顺序存储结构可以借助于高级程序设计语言中的数组来 表示,一维数组的下标(从0开始)与元素在线性表中的序 号(从1开始)一一对应。其类型描述如下。 #define MaxSize 线性表可能达到的最大长度 typedef struct { ElementType elem[MaxSize]; /* 线性表占用的数组空间 */ int listlength; /* 线性表的实际长度*/ }SeqList;
2.2 线性表的顺序存储结构 (5)
2.2.2 顺序表上基本运算的实现 1. 查找运算 int Locate(SeqList l,ElemType e) /*在顺序表l中查找元素e,若 l.elem[i]=e,则找到该元素,并 返回i,若找不到,返回-1*/ { i=0 ; while ((i<=l.listlength-1)&&(l.elem[i]!=e) ) /*顺序扫描表,直到找到值为e元素, 或扫到表尾而没找到*/ i++; if (i<= l.listlength-1) return(i); else return(-1); } /* Locate */
相关文档
最新文档