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

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

前言


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


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


获得元素操作


对于线性表的顺序存储结构来说,如果我们要实现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)。这就说明,它比较适合元素个数不太变化,而更多是存取数据的应用。 当然,它的优缺点还不只这些....


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


优点

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

可以快速地存取表中任

一位置的元素

缺点

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

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

造成存储空间的“碎片"



相关文章
|
17天前
|
存储 搜索推荐 算法
【数据结构】树型结构详解 + 堆的实现(c语言)(附源码)
本文介绍了树和二叉树的基本概念及结构,重点讲解了堆这一重要的数据结构。堆是一种特殊的完全二叉树,常用于实现优先队列和高效的排序算法(如堆排序)。文章详细描述了堆的性质、存储方式及其实现方法,包括插入、删除和取堆顶数据等操作的具体实现。通过这些内容,读者可以全面了解堆的原理和应用。
59 16
|
1月前
|
存储 安全 数据库
除了 HashMap,还有哪些数据结构可以实现键值对存储?
【10月更文挑战第11天】 除了`HashMap`,其他常见支持键值对存储的数据结构包括:`TreeMap`(基于红黑树,键有序)、`LinkedHashMap`(保留插入顺序)、`HashTable`(线程安全)、`B-Tree`和`B+Tree`(高效存储大量数据)、`SkipList`(通过跳跃指针提高查找效率)及`UnorderedMap`(类似`HashMap`)。选择合适的数据结构需根据排序、并发、存储和查找性能等需求。
|
2月前
|
存储 Java
java数据结构,线性表链式存储(单链表)的实现
文章讲解了单链表的基本概念和Java实现,包括头指针、尾节点和节点结构。提供了实现代码,包括数据结构、接口定义和具体实现类。通过测试代码演示了单链表的基本操作,如添加、删除、更新和查找元素,并总结了操作的时间复杂度。
java数据结构,线性表链式存储(单链表)的实现
|
1月前
|
存储 Java
数据结构第二篇【关于java线性表(顺序表)的基本操作】
数据结构第二篇【关于java线性表(顺序表)的基本操作】
30 6
|
21天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之王道第2.3章节之线性表精题汇总二(5)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
IKU达人之数据结构与算法系列学习×单双链表精题详解、数据结构、C++、排序算法、java 、动态规划 你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
1月前
|
存储
【数据结构】线性表和顺序表
【数据结构】线性表和顺序表
22 1
|
1月前
|
存储 编译器 C++
【初阶数据结构】掌握二叉树遍历技巧与信息求解:深入解析四种遍历方法及树的结构与统计分析
【初阶数据结构】掌握二叉树遍历技巧与信息求解:深入解析四种遍历方法及树的结构与统计分析
|
1月前
探索顺序结构:栈的实现方式
探索顺序结构:栈的实现方式
|
1月前
01(数据结构考研)线性表相关操作代码
01(数据结构考研)线性表相关操作代码
63 0
|
1月前
|
存储 算法
【数据结构】二叉树——顺序结构——堆及其实现
【数据结构】二叉树——顺序结构——堆及其实现