线性表的顺序存储结构
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
顺序映像的 C 语言描述 #define LIST_INIT_SIZE
100 //线性表存储空间的初始分配量 线性表存储空间的初始分配量
#define LISTINCREMENT 10 //线性表存储空间的分配增量 线性表存储空间的分配增量
typedef struct { ElemType *elem; int int // 存储空间基址
length; // 当前长度 listsize; // 当前分配的存储容量
// (以sizeof(ElemType)为单位)
} SqList; // 俗称 顺序表
Status InitList_Sq( SqList& L, int maxsize ) { // 构造一个最大容量为 maxsize 的顺序表 L.elem = new ElemType[maxsize];
// 为顺序表分配大小为 maxsize 的数组空间
if (!L.elem) exit(OVERFLOW); L.length = 0; L.listsize = maxsize; return OK; 算法时间复杂度 O(1) 时间复杂度: 时间复杂度 } // InitList_Sq
(4)线性表的插入和删除运算 ) 序号 数据元素 1 2 3 4 5 6 7 8 12 13 21 24 28 30 42 77 (a) 序号 数据元素 1 2 3 4 5 6 7 8 9 12 13 21 24 25 28 30 42 77 (b) 序号 数据元素 1 2 3 4 5 6 7 8 12 13 21 24 28 30 42 77 (a) 序号 数据元素 1 2 3 4 5 6 7 12 13 21 28 30 42 77
E is =
∑
n +1 i =1
p i ( n i + 1)
1 不失一般性,若在线性表的任何位置插入元素都是等概率的,即 p i = 不失一般性,若在线性表的任何位置插入元素都是等概率的, , n + 1 上式可化简为: 上式可化简为: 1 n+1 n
Eis =
∑(n i +1) = 2 n +1
(6)顺序表的合并算法 ) 算法2.5如下 如下: 算法 如下: void MergeList_Sq (SqList La, SqList Lb, SqList &Lc){ //已知顺序线性表 和Lb中的数据元素按值非递减排列. 已知顺序线性表La和 中的数据元素按值非递减排列 中的数据元素按值非递减排列. 已知顺序线性表 //归并 和Lb得到新的顺序线性表 ,Lc的数据元素也按值非递减排列. 归并La和 得到新的顺序线性表 得到新的顺序线性表Lc, 的数据元素也按值非递减排列 的数据元素也按值非递减排列. 归并 pa = La.elem; pb = Lb.elem; Lc.listsize = Lc.length = La.length + Lb.length; pc = Lc.elem = (ElemType*)malloc(Lc.listsize*sizeof(ElemType)); if (!Lc.elem) exit (OVERFLOW); //存储分配失败 存储分配失败 pa_last = La.elem + La.length – 1; pb_last = Lb.elem + Lb.length – 1; while (pa <= pa_last && pb <= pb_last) { //归并 归并 if (*pa <= *pb) *pc++ = *pa++; else *pc++ = *pb++; } while (pa <= pa_last) *pc++ = *pa++; //插入 的剩余元素 插入La的剩余元素 插入 while (pb <= pb_last) *pc++ = *pb++; //插入 的剩余元素 插入Lb的剩余元素 插入 } //MergeList_Sq
i =1
对于删除过程,假设 是删除第 个元素的概率,则在长度为n的线性表中删除一 是删除第i个元素的概率 对于删除过程,假设qi是删除第 个元素的概率,则在长度为 的线性表中删除一 个元素时所需移动元素次数的期望值为: 个元素时所需移动元素次数的期望值为: n E dl = ∑ q i ( n i ) i =1 1 qi = 同样假设是等概率的情况, 则有: 同样假设是等概率的情况,即 n ,则有: n 1 n 1 E dl = ∑ ( n i ) = n i =1 2 结论:由此可见,在顺序存储结构的线性表中插入或删除一个数据元素, 结论:由此可见,在顺序存储结构的线性表中插入或删除一个数据元素,平均 约移动表中一半元素.若表长为n,则算法ListInsert_Sq和ListDelete_Sq的时间复杂 约移动表中一半元素.若表长为 ,则算法 和 的时间复杂 度为O(n). 度为 .
特点: 特点:以元素在 计算机内" 计算机内"物理 位置相邻" 位置相邻"来表 示线性表中数据 元素之间的逻辑 关系
线性表的这种机内表示称做线性表的顺序存储结构或顺序映像(sequential mapping). 线性表的这种机内表示称做线性表的顺序存储结构或顺序映像 . 通常称这种存储结构的线性表为顺序表. 通常称这种存储结构的线性表为顺序表.
i = 1; // i 的初值为第 1 元素的位序 p = L.elem; // p 的初值为第 1 元素的存储位置 while (i <= L.length && !(*compare)(*p++, e) ++i; (*compare)(*p++, e)) if (i <= L.length) return i; //找到满足条件的元素 else return 0; // 没有找到满足条件的元素 算法的时间复杂度 时间复杂度为 算法的时间复杂度为: } // LocateElem_Sq O( ListLength(L) )
LOC (ai +1 ) = LOC (ai ) + l
线性表的第i个数据元素 的存储位置为 线性表的第 个数据元素ai的存储位置为: 个数据元素 的存储位置为:
LOC (ai ) = LOC (a1 ) + (i 1) × l
的存储位置, 式中LOC(a1 )是线性表的第一个数据元素 a 1的存储位置,通常称做线性表的起始位置 或基地址. 或基地址. 只要确定了存储线性表的起始位置,线性表中任一数据元素都可随机存取. 只要确定了存储线性表的起始位置,线性表中任一数据元素都可随机存取.线性 表的顺序存储结构是一种随机存取的存储结构. 表的顺序存储结构是一种随机存取的存储结构.
插入 25
删除 24
(b)
图2.2 线性表插入前后的情况 (a)插入前 =8 插入前n= 插入前 (b)插入后 =9 插入后n= 插入后
图2.3 线性表删除前后的情况 (a)删除前 =8 删除前n= 删除前 (b)删除后 =7 删除后n= 删除后
算法2.3如下 如下: 插入运算 算法 如下: Status ListInsert_Sq (SqList &L, int i, ElemType e) { //在顺序线性表 中第 个位置之前插入新的元素 , 在顺序线性表L中第 个位置之前插入新的元素e, 在顺序线性表 中第i个位置之前插入新的元素 //i的合法值为 的合法值为1≤i≤ListLength_Sq(L)+1 的合法值为 if (i<1|| i>L.length+1) return ERROR; //i值不合法 值不合法 if (L.length>=L.listsize) { //当前存储空间已满,增加分配 当前存储空间已满, 当前存储空间已满 newbase = (ElemType *) realloc (L.elem, (L.listsize+LISTINCREMENT)*sizeof(ElemType)); if (!newbase) exit(OVERFLOW); //存储分配失败 存储分配失败 L.elem = newbase; //新基址 新基址 L.listsize += LISTINCREMENT; //增加存储容量 增加存储容量 } q = & (L.elem[i-1]); //q为插入位置 - 为插入位置 for (p = & (L.elem[L.length-1]); p>=q; ――p) - * (p+1) = *p; //插入位置及之后的元素右移 插入位置及之后的元素右移 * q = e; //插入 插入e 插入 ++L.length; //表长增 表长增1 表长增 return OK; } //ListInsert_Sq
(2)求址公式 ) 假设线性表的每个元素需占用l个存储单元 个存储单元, 假设线性表的每个元素需占用 个存储单元,并以所占的第一个单元的存储地址 作为数据元素的存储位置. 作为数据元素的存储位置. 线性表中第i+ 个数据元素的存储位置 和第i个数据元素的存储位置 线性表中第 +1个数据元素的存储位置 LOC ( ai +1 ) 和第 个数据元素的存储位置 LOC (ai )之间满足下列关系: 之间满足下列关系:
int LocateElem_Sq(SqList L, ElemType e, Status (*compare)(ElemType, ElemType)) {
// 在顺序表中查询第一个满足判定条件的数据元素, 在顺序表中查询第一个满足判定条件的数据元素, // 若存在,则返回它的位序,否则返回 0 若存在,则返回它的位序,
删除运算 算法2.4如下: 算法 如下: 如下 Status ListDelete_Sq (SqList &L, int i, ElemType &e) { //在顺序线性表 中删除第 个元素,并用 返回其值 在顺序线性表L中删除第 个元素, 在顺序线性表 中删除第i个元素 并用e返回其值 //i的合法值为 的合法值为1≤i≤ListLength_Sq(L) 的合法值为 if (i<1|| i>L.length) return ERROR; //i值不合法 值不合法 p = & (L.elem[i-1]); //p为被删除元素的位置 - 为被删除元素的位置 e = *p; //被删除元素的值赋给 被删除元素的值赋给e 被删除元素的值赋给 q = L.elem + L.length-1; //表尾元素的位置 - 表尾元素的位置 for (++p; p<=q; ++p) * (p-1) = *p; (p- //被删除元素之后的元素 //被删除元素之后的元素 左移 ――L.length; return OK; } //ListDelete_Sq //表长减 表长减1 表长减
第二章 线性表
2.1 线性表的类型定义 2.2 线性表的顺序表示和实现
2.3 线性表的链式表示和实现
2.4 一元多项式的表示及相加
2.2 线性表的顺序表示和实现 线性表的顺序表示指的 是用一组地址连续的存储单Biblioteka Baidu元依次存储线性表的数据元 素.
£2.2 线性表的顺序存储结构
(1)线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性 ) 表的数据元素.如下图2.1所示 所示: 表的数据元素.如下图 所示: 存储地址 b b+l … b+(i-1)l … b+(n-1)l b+nl … b+(maxlen-1)l 内存状态 a1 a2 … ai … an 空闲 数据元素在线性表中的位序 1 2 … i … n
(5)时间复杂度 ) 从上述算法可见, 从上述算法可见,当在顺序存储结构的线性表中某个位置上插入或删除一个数据 元素时,其时间主要耗费在移动元素上, 元素时,其时间主要耗费在移动元素上,而移动元素的个数取决于插入或删除元素的位 置. 假设pi是在第 个元素之前插入一个元素的概率,则在长度为n的线性表中插入一 是在第i个元素之前插入一个元素的概率 假设 是在第 个元素之前插入一个元素的概率,则在长度为 的线性表中插入一 个元素时所需移动元素次数的期望值为: 个元素时所需移动元素次数的期望值为: