线性表:由零个或多个数据元素组成的有限序列

线性表有两种物理存储结构:顺序存储结构和链式存储结构

一、顺序存储结构

顺序存储结构是存储结构类型中的一种,该结构是把逻辑上相邻的结点存储在物理位置上相邻的存储单元中,结点之间的逻辑关系由存储单元的邻接关系来体现。

插入算法的思路:

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

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

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

4、将要插入元素填入位置i处

5、线性表长+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-1; k >= i-1;k--){L->data[k+1] = L->data[k];}L->data[i-1] = e;  // 将新元素插入L->length++;return OK;}
}

删除算法的思路

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

2、取出删除元素

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

4、表长-1

下面是实现代码

Status ListDelete(SqList *L, int i, ElemType *e)
{int k;if(L->length == 0)  // 判断表长是否为空{return ERROR;}if(i<1 || i>L->length)  // 当i不在范围内时{return ERROR;}*e = L->data[i-1]; // 用e返回删除的值if(i < L->length) {/* 将删除位置后面的元素全部向前移动 */for(K=i; k < L->length;k++){L->data[k-1] = L->data[k];}L->length--;return OK;}
}

线性表的顺序存储结构,在存、读数据时,不管是哪个位置,时间复杂度都是O(1)。而在插入或删除时,时间复杂度都是O(n)。

二、链式存储结构

链式存储结构,又叫链接存储结构。在计算机中用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的).它不要求逻辑上相邻的元素在物理位置上也相邻

单链表存储结构

下面用结构指针来描述单链表

typedef struct Node
{ElemType data;      // 数据域struct Node* Next   // 指针域
} Node;
typedef struct Node* LinkList;

获得链表第i个数据的算法思路

1、声明一个结点p指向链表第一个结点,初始化j从1开始

2、当j<i时,就遍历链表,让p的指针向后移动,不断指向下一个结点,j+1

3、若到链表末尾p为空,则说明第i个元素不存在

4、否则查找成功,返回结点p的数据

下面是实现代码

Status GetElem(linkList L, int i, ElemType *e)
{int j;LinkList p;p = L->next;j = 1;while(p && j<i){p = p->next;++j;}if(!p || j>i){return ERROR;}*e = p->data;return OK;
}

单链表第i个数据插入结点的算法思路

1、声明一个结点p指向链表头结点,初始化j从1开始

2、当j<i时,就遍历链表,让p的指针向后移动,不断指向下一个结点,j累加1

3、若到链表末尾p为空,则说明第i个元素不存在

4、否则查找成功,在系统中生成一个空结点s

5、将数据元素e赋值给s->data

6、执行这两个语句 s->next = p->next ; p->next = s;

下面是实现代码

Status ListInsert(LinkList *L, int i, ElemType e)
{int j;LinkList p,s;p = *L;j = 1;while(p && j<i)  // 用于寻找第i个结点{p = p->next;j++;}if(!p || j>i){return ERROR;}s = (LinkList)malloc(sizeof(Node)); // 申请一个结点长度空间s->data = e;s->next = p->next;  // 将原始指向的指针域赋给插入结点的指针域p->next = s;   // 插入结点赋给P的指针域return OK;
}

单链表第i个数据删除结点的算法思路

1、声明一个结点p指向第一个结点,初始化j=1

2、当j<i时,就遍历链表,让p的指针向后移动,不断指向下一个结点,j累加1

3、若到链表末尾p为空,则说明第i个元素不存在

5、否则查找成功,将欲删除结点p->next赋值给q

6、执行这个语句 p->next = q->next ;

7、将q结点中的数据赋值给e,作为返回

下面是实现代码

Status ListDelete(LinkList *L, int i, ElemType *e)
{int j;LinkList p,q;p = *L;j = 1;while(p->next && j<i)  // 用于寻找第i个结点{p = p->next;j++;}if(!(p->next) || j>i){return ERROR;}q = p->next;   // 删除的结点赋给qp->next = q->next;  // 将欲删除的下一个结点指向p的指针域*e = q->data;   // 作为返回欲删除的数据free(q); // 释放删除的结点return OK;
}

三、单链表结构和顺序存储结构的优缺点

存储分配方式:

​ 顺序存储结构用一般连续单元依次存储线性表的数据元素

​ 单链表采用链式存储结构,用一组任意的存储单元存放线性表的元素

时间性能:

查找

​ 顺序存储结构O(1)

​ 单链表O(n)

插入和删除

​ 顺序存储结构需要平均移动表长一半的元素,时间为O(n)

​ 单链表在计算出位置的指针后,插入和删除时间仅为O(1)

空间性能:

​ 顺序存储结构需要预分配存储空间,分大了,容易造成空间浪费,分小了,容易发生溢出。

​ 单链表不需要分配存储空间,只要有就可以分配,元素个数也不受限制

☆ 若线性表需要频繁查找,很少进行插入和删除操作时,宜采用顺序存储结构

☆ 若需要频繁插入和删除时,宜采用单链表结构

线性表之顺序存储和链式存储结构相关推荐

  1. 数据结构之线性表——(二、链式存储结构)[c语言]

    数据结构之线性表--(二.链式存储结构-单链表) 链式存储结构以及基本运算的实现 背景:由于线性表的存储特点是用物理上的相邻实现逻辑上的相邻,他要求用连续的存储单元顺序存储线性表中的各个元素,所以,对 ...

  2. 数据结构(二)----线性表(List)链式存储结构(1)

    线性表List---链式存储结构 相关概念 链式存储结构/链式表 定义 链式存储特点 单链表 单链表读取 单链表插入 单链表删除 时间复杂度 单链表整表创建 单链表整表删除 顺序存储与链式存储差异 P ...

  3. 数据结构与算法2:线性表的顺序存储与链式存储

    文章目录 线性表 定义 线性表的抽象数据类型(Abstract Data Type) 线性表的顺序存储结构 线性表的链式存储结构 单链表(single linked list) 静态链表 (stati ...

  4. 线性表的顺序、链式存储结构基本操作

    线性表的抽象数据类型 operation InitList(&L):初始化操作,建立一个空的线性表L ListEmpty(L):若线性表为空,返回true,否则返回false ClearLis ...

  5. 什么是线性表?线性表的特点,线性表的顺序存储和链式存储

    线性表的表示 线性表的特点 ai的数据类型相同 位置序列从1开始 除去表头和表位,所有元素有且仅有唯一的直接前驱和后继 线性表的存储结构 顺序存储 可以随机的读取数据,读取方法 loc(a1)是基地址 ...

  6. 数据结构-线性表的顺序、链式存储结构

  7. 线性链表java实现_线性表的Java实现--链式存储(双向链表)

    线性表的Java实现--链式存储(双向链表) 有了单向链表的基础,双向链表的实现就容易多了. ? 双向链表的一般情况: ? ? class="decoded" alt=" ...

  8. 链表list(链式存储结构实现)_数据结构知否知否系列之 — 线性表的顺序与链式存储篇(8000 多字长文)...

    从不浪费时间的人,没有工夫抱怨时间不够. -- 杰弗逊 线性表是由 n 个数据元素组成的有限序列,也是最基本.最简单.最常用的一种数据结构. 作者简介:五月君,Nodejs Developer,热爱技 ...

  9. 线性表的Java实现--链式存储(双向链表)

    有了单向链表的基础,双向链表的实现就容易多了. 双向链表的一般情况: 增加节点: 删除节点: 双向链表的Java实现: package com.liuhao.algorithm; public cla ...

最新文章

  1. C#编码简单性之语义篇(如何编写简短的C#代码,随时更新)
  2. 普华永道:2018 AI预测报告 将回答关于数据的重大问题
  3. 虚拟机无法访问主机mysql_解决虚拟机linux端mysql数据库无法远程访问
  4. 干货|为什么Kafka不支持读写分离
  5. 29.怎样扩展现有类功能?
  6. vimb java_vim 中更好的編輯 java 文件.
  7. 在Java中避免NullPointerException
  8. 后宫宛如传服务器维护,后宫宛如传完整版
  9. 有哪些能识别英文的语音助手?
  10. 基于CentOS7配置ArcGIS enterprise
  11. curl基于URL的文件传输工具
  12. jdk TreeMap源码解析
  13. 20172304 2017-2018-2 《程序设计与数据结构》第五周学习总结
  14. 服务器系统2008 64,服务器主机server 2008 R2 操作系统漏洞
  15. 2021年CFA全套资料无偿分享|备考经验|备考计划
  16. 可见的轮廓线用虚线绘制_机械制图国家标准规定,可见的轮廓线用虚线绘制。...
  17. 枚举类中的valueOf用法
  18. 汽车电子电气TARA分析从入门到放弃
  19. 使用vscode开发,使用插件记录
  20. @value 读取yml没有读到

热门文章

  1. 管理学(罗宾斯,第11版) 第13章 团队管理
  2. python高校学生田径会信息管理系统
  3. 029-Web前端-JS-对象和函数
  4. 走进JavaWeb技术世界16:极简配置的SpringBoot
  5. 李雅普诺夫优化-漂移加罚函数
  6. 华为认证HCIA、HCIP、HCIE这三者之间有什么不同?
  7. 从AWE上冰箱洗衣机新亮色,看三星的创新力和产品力
  8. 本周AI热点回顾:无人车的眼睛、UP主的生产力工具,都藏在百度CVPR的这十个冠军里;IJCAI 2021心电全景图及其生成网络...
  9. 公网SSH远程Ubuntu:安装cpolar内网穿透映射22端口 2/3
  10. python通过ssh连接linux,执行命令