我爱啃书--线性表的顺序存储结构(大话数据结构)

简介: 我爱啃书--线性表的顺序存储结构(大话数据结构)

前言


废话不多,数据结构必须学! 每天更新一章,一篇写不完的话会分成两篇来写~


顺序存储结构的插入与删除


获得元素操作


对于线性表的顺序存储结构来说,如果我们要实现GetElem 操作,即将线性表L中的第i个位置元素值返回,其实是非常简单的。就程序而言,只要i的数值在数组下标范围内,就是把数组第i-1下标的值返回即可。来看代码:

Status是函数的类型,其值是函数结果状态代码,如OK等

初始条件:顺序线性表L已存在,1≤i≤ListLength(L)

操作结果:用e返回L中第i个数据元素的值

#define OK 1
 #define ERROR 0
 #define TRUE 1
 #define FALSE 0
 typedef int Status;
 Status GetElem (SqList L,int i,ElemType *e)
 {
     if (L.1ength==01I 1<1 11 i>L.length)
         return ERROR;
     *e=L.data[i-1] ;
     return OK;
 }

注意这里返回值类型Status 是-一个整型,返回OK代表1, ERROR代表0。之后代码中出现就不再详述。


插入操作


刚才我们也谈到,这里的时间复杂度为0(1)。 我们现在来考虑,如果我们要实现ListInsert (*L,e),即在线性表L中的第i个位置插入新元素e,应该如何操作?

image.png

插入算法的思路:

如果插入位置不合理,抛出异常;

如果线性表长度大于等于数组长度,则抛出异常或动态增加容量;

从最后一个元素开始向前遍历到第i个位置,分别将它们都向后移动一个位置;

将要插入元素填入位置i处;

表长加1。

初始条件:顺序线性表L已存在,1≤i≤ListLength(L)

操作结果:在L中第i个位置之前插入新的数据元素e, L的长度加1

Status ListInsert (SqList *L,int i, ElemType e)
 {
     int k;
     if (L->length==MAXSIZE)     /*顺序线性表已经满*/
         return ERROR;
     if(i<1 || i>L->length+1)    /*当i不在范围内时*/
         return ERROR;
     if (i<=L->length)   /*若插入数据位置不在表尾*/
     {
         for (k=L->length-l;k>=i-1;k--)/*将要插入位置后数据元素向后移动一位*/
             L->data[k+1]-L->data[k];
     }
     L->data[i-1]=e;     /*将新元素插入*/
     L-> length++;
     return OK;
 }

删除操作



书上讲的例子很有意思,哈哈哈哈!!!

image.png

删除算法的思路:

如果删除位置不合理,抛出异常;

取出删除元素;

从删除元素 位置开始遍历到最后-一个元素 位置,分别将它们都向前移动一个位置;

表长减1

初始条件:顺序线性表L已存在,1≤i≤ListLength(L)

操作结果:删除在L中第i个数据元素,并用e返回其值, L的长度减1

Status ListDelete(SqList *L,int i, ElemType *e)
 {
     int k;
     if (L->length==0)   /*顺序线性表已经满*/
         return ERROR;
     if(i<1  || i>L->length+1)   /*当i不在范围内时*/
         return ERROR;
     if (i<=L->length)   /*若数据位置不在表尾*/
     {
         for (k = i;k < L->length;k++)/*将要插入位置后数据元素向后移动一位*/
             L->data[k+1]-L->data[k];
     }
     L->data[i-1]=e;     /*将新元素插入*/
     L-> length++;
     return OK;
 }

下面讨论下时间复杂度

当要插入或删除的元素在最后一个位置,那么时间复杂度为O(1),因为不需要移动元素

最坏的情况当然是插入或删除第一个元素,此时所有的元素都要向后移,时间复杂度为O(n)

以上平均下来,为(n-1)/2

通过前面讨论过时间复杂度的推导,可以得出,平均时间复杂度还是0[n)。这说明什么?线性表的顺序存储结构,在存、读数据时,不管是哪个位置,时间复杂度都是0(1);而插入或删除时,时间复杂度都是0[n)。这就说明,它比较适合元素个数不太变化,而更多是存取数据的应用。 当然,它的优缺点还不只这些....


线性表顺序存储结构的优缺点


优点

无须为表示表中元素之间的逻辑关系而增加额外的存储空间

可以快速地存取表中任

一位置的元素

缺点

插入和删除操作需要移动大量元素

当线性表长度变化较大时,难以确定存储空间的容量

造成存储空间的“碎片"



相关文章
|
10月前
|
存储 算法 C++
【C++数据结构——图】图的邻接矩阵和邻接表的存储(头歌实践教学平台习题)【合集】
本任务要求编写程序实现图的邻接矩阵和邻接表的存储。需掌握带权有向图、图的邻接矩阵及邻接表的概念。邻接矩阵用于表示顶点间的连接关系,邻接表则通过链表结构存储图信息。测试输入为图的顶点数、边数及邻接矩阵,预期输出为Prim算法求解结果。通关代码提供了完整的C++实现,包括输入、构建和打印邻接矩阵与邻接表的功能。
387 10
|
10月前
|
存储 算法 测试技术
【C++数据结构——线性表】求集合的并、交和差运算(头歌实践教学平台习题)【合集】
本任务要求编写程序求两个集合的并集、交集和差集。主要内容包括: 1. **单链表表示集合**:使用单链表存储集合元素,确保元素唯一且无序。 2. **求并集**:遍历两个集合,将所有不同元素加入新链表。 3. **求交集**:遍历集合A,检查元素是否在集合B中存在,若存在则加入结果链表。 4. **求差集**:遍历集合A,检查元素是否不在集合B中,若满足条件则加入结果链表。 通过C++代码实现上述操作,并提供测试用例验证结果。测试输入为两个集合的元素,输出为有序集合A、B,以及它们的并集、交集和差集。 示例测试输入: ``` a c e f a b d e h i ``` 预期输出:
286 7
|
10月前
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】单链表的基本运算(头歌实践教学平台习题)【合集】
本内容介绍了单链表的基本运算任务,涵盖线性表的基本概念、初始化、销毁、判定是否为空表、求长度、输出、求元素值、按元素值查找、插入和删除数据元素等操作。通过C++代码示例详细解释了顺序表和链表的实现方法,并提供了测试说明、通 - **任务描述**:实现单链表的基本运算。 - **相关知识**:包括线性表的概念、初始化、销毁、判断空表、求长度、输出、求元素值、查找、插入和删除等操作。 - **测试说明**:平台会对你编写的代码进行测试,提供测试输入和预期输出。 - **通关代码**:给出了完整的C++代码实现。 - **测试结果**:展示了测试通过后的预期输出结果。 开始你的任务吧,祝你成功!
483 5
|
10月前
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】顺序表的基本运算(头歌实践教学平台习题)【合集】
本文档介绍了线性表的基本运算任务,涵盖顺序表和链表的初始化、销毁、判定是否为空、求长度、输出、查找元素、插入和删除元素等内容。通过C++代码示例详细展示了每一步骤的具体实现方法,并提供了测试说明和通关代码。 主要内容包括: - **任务描述**:实现顺序表的基本运算。 - **相关知识**:介绍线性表的基本概念及操作,如初始化、销毁、判定是否为空表等。 - **具体操作**:详述顺序表和链表的初始化、求长度、输出、查找、插入和删除元素的方法,并附有代码示例。 - **测试说明**:提供测试输入和预期输出,确保代码正确性。 - **通关代码**:给出完整的C++代码实现,帮助完成任务。 文档
310 5
|
存储 搜索推荐 算法
【数据结构】树型结构详解 + 堆的实现(c语言)(附源码)
本文介绍了树和二叉树的基本概念及结构,重点讲解了堆这一重要的数据结构。堆是一种特殊的完全二叉树,常用于实现优先队列和高效的排序算法(如堆排序)。文章详细描述了堆的性质、存储方式及其实现方法,包括插入、删除和取堆顶数据等操作的具体实现。通过这些内容,读者可以全面了解堆的原理和应用。
551 16
|
存储 Java
数据结构第二篇【关于java线性表(顺序表)的基本操作】
数据结构第二篇【关于java线性表(顺序表)的基本操作】
158 6
|
存储 安全 数据库
除了 HashMap,还有哪些数据结构可以实现键值对存储?
【10月更文挑战第11天】 除了`HashMap`,其他常见支持键值对存储的数据结构包括:`TreeMap`(基于红黑树,键有序)、`LinkedHashMap`(保留插入顺序)、`HashTable`(线程安全)、`B-Tree`和`B+Tree`(高效存储大量数据)、`SkipList`(通过跳跃指针提高查找效率)及`UnorderedMap`(类似`HashMap`)。选择合适的数据结构需根据排序、并发、存储和查找性能等需求。
|
存储
【数据结构】线性表和顺序表
【数据结构】线性表和顺序表
118 1
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之王道第2.3章节之线性表精题汇总二(5)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
IKU达人之数据结构与算法系列学习×单双链表精题详解、数据结构、C++、排序算法、java 、动态规划 你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
探索顺序结构:栈的实现方式
探索顺序结构:栈的实现方式
169 0

热门文章

最新文章