数据结构(二)----线性表(List)顺序存储结构

4 篇文章 0 订阅
3 篇文章 0 订阅

A.相关概念

  1. 定义:零个或多个数据元素的有限序列
  2. 特性:
    序列(有顺序,除了第一个元素无前驱,最后一个元素无后继,其他元素有前驱和后继);
    有限个数;
    线性表元素的个数n(n>=0)定义为线性表的长度,n=0时称空表。
  3. 抽象数据类型定义(平常创建结构的模版,函数名可换):
ADT 线性表(List)
Data 每个元素的类型都是DataType,元素之间关系是一对一
Operation
	InitList(*L):初始化 空的线性表L
	ListEmpty(L):若线性表为空,返回true,否则返回false
	ClearList(*L):将线性表清空
	GetElement(L, i, *e):将线性表L中的第i个位置的元素返回给e
	LocateElement(L, e):在线性表中查找与给定值e相等的元素,如果查找成功,返回该元素的位置;否则返回0标识失败(此时未考虑找的位置就是0的情况)
	ListInsert(*L, i, e):在线性表L中的第i个位置插入新元素e
	ListDelete(*L, i, *e):删除线性表L中的第i个位置元素,e记录被删除的元素
	ListLength(L):返回线性表L的元素个数
endADT

B.顺序存储结构/顺序表

B.a.定义

线性表的顺序存储结构,指的是用一段地址连续的存储单元一次存储线性表的数据元素(内存中有一段连号的存储地址)

#define MAXSIZE 20 //存储空间初始分配量
typedef int ElementType //数据类型看实际情况,此处设为int
typedef struct{
	ElementType data[MAXSIZE] //数组存储数据元素,最大值为MAXSIZE
	int length //线性表的当前长度
} 

必要属性如下:

  1. 存储空间的起始位置:数组data的存储位置
  2. 线性表的最大存储容量:最大值为MAXSIZE
  3. 线性表的当前长度:length

数组长度与线性表长度的区别
数组长度=存放线性表的存储空间的长度;
线性表长度=线性表元素个数;
线性表长度会随着表插入元素、删除元素,会变化;
任意时刻:线性表长度 <= 数组长度

B.b.增删改查

B.b.a 增(ListInsert):在L中第i个位置之前插入新的数据元素,L的长度+1

  • 如果插入位置不合理(即i <= length),抛出异常;
  • 如果线性表L的length>=MAXSIZE,抛出异常或动态增加容量;
  • 从最后一个元素开始向前遍历倒第i个位置,分别将它们向后移动一个位置;
  • 将要插入的数据元素填入位置i;
  • 表长+1。

B.b.b 删(ListDelete):删除L的第i个数据元素,并返回该删除的元素,L的长度-1

  • 如果删除位置不合理,抛出异常;
  • 取出删除的元素;
  • 从删除元素位置开始遍历到最后一个元素位置,分别将它们都向前移动一个位置;
  • 表长-1。

B.b.c 改(ListUpdate):修改L的第i个数据元素

  • 如果修改位置不合理,抛出异常;
  • 找到位置进行修改。

B.b.d 查(GetItem):要线性表L中的第i个位置元素,返回下标i-1的元素

B.c.时间复杂度

  • 最好的情况:删除最后一个元素 或 在尾部新增一个元素 的情况,由于没有涉及到移动元素,所以时间复杂度O(1)
  • 最坏的情况:删除首个元素 或 在头部新增元素,此时涉及到移动n个元素,所以时间复杂度O(n)
  • 平均情况:在第i个位置对元素进行删除或新增,移动n-i个元素,平均移动次数==中间元素的移动次数,
    时间复杂度O((n-1)/ 2)

    综上,时间复杂度为O(n)
    tips! 读、改数据的时间复杂度为O(1)【因为有下标直接可以找到】,插入、删除数据时间复杂度为O(n)

B.d.优缺点

优点缺点
1.无须为表示表中的元素的逻辑关系增加额外的存储空间;1.插入和删除需要移动数据元素
2. 可以快速的存、读表中的某一位置的元素2.当顺序表的数据数组长度变化大时,不好把握存储空间的容量

C.Python代码链接

本章节python相关代码链接
其中sequence_list.py 为顺序结构线性表
其他的文件可以看README.md里面有详解

D.Java代码链接

本章节python相关代码链接
其中SequenceList.java 为顺序结构线性表
其他的文件可以看README.md里面有详解

如果文章或者代码有问题,欢迎帮我指出,感激不尽,互勉~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值