线性表

简介: 线性表

线性表的定义


定义 线性表是具有相同的数据类型的n(n >= 0)个数据元素的有限序列,当n=0时线性表为一个空表 用L表示线性表则 L = (a1,a2,a3,…,an a1为表头元素,an为表尾元素 a1无直接前驱,an无直接后继 特点 表中元素个数有限 表中元素具有逻辑上的顺序,表中元素有先后次序 表中元素都是数据元素 表中元素的数据类型都相同,每个元素占的空间大小一致 要点 数据项、数据元素、线性表的关系

线性表由若干个数据元素组成,而数据元素又由若干个数据项组成,数据项是数据的不可分割的最小单位。

其中姓名,学号等就是数据项

线性表的顺序表示 顺序表的定义 顺序表是指用一组地址连续的存储单元依次存储信息表中的数据元素,从而使得逻辑相邻的两个元素在物理位置上也相邻

预先定义(为了代码可以运行)

#defineTrue1#defineFalse0#defineOK1#defineERROR0#defineINFEASIBLE-1#defineOVERFLOW-2typedefintStatus;

1 2 3 4 5 6 7 第n个元素的内存地址表示为

LOC(A) + (n-1)*sizeof(ElemType) 1 假定线性表的元素类型为ElemType,则线性表的顺序存储类型描述为

typedefintElemType  ; #defineMaxSize50typedefstruct{ ElemTypedata[MaxSize]; intlength; }

SqList; 1 2 3 4 5 6 一维数组可以是静态分配的,也可以是动态分配的。静态分配后大小和空间都固定了,下面使用动态分配的形式

typedefintElemType  ; #defineInitSize100//表长度的初始大小定义 #define ListIncreasement 10 //线性表存储空间的分配增量 typedef struct { ElemType *data; int MaxSize,length; }SeqList;

1 2 3 4 5 6 7 8 顺序表的初始化 顺序表的初始化,&是C++的引用,可以使用指针代替

StatusInitList(SeqList&L){ L.data= (ElemType*) malloc(InitSize*sizeof(ElemType)); if(!L.data) exit(OVERFLOW);//存储分配失败 L.length = 0; L.MaxSize = InitSize; return OK; }

1 2 3 4 5 6 7 顺序表的插入 在顺序表L的第i(1<= i <= L.length +1)个位置插入新元素 e,需要将第 n 个至第 i (共 n-i+1)个元素向后移动一个位置 【最后一个到倒数第n-i+i个元素向后移动一位】。

StatusListInsert(SeqList&L,inti , ElemTypee){ ElemType*newbase; if(i<1||i>L.length+1)//判断i是否合法 return ERROR; if(L.length >= L.MaxSize){ //当前存储空间已满,可直接返回false newbase = (ElemType *)realloc(L.data,(L.MaxSize+ListIncreasement)*sizeof(ElemType)); if(!newbase){//存储分配失败 exit(OVERFLOW); } L.data = newbase; //新基址 L.MaxSize += ListIncreasement; } //移动元素 for(int j = L.length; j>=i ;j--){ L.data[j] = L.data[j-1]; } L.data[i-1] = e;//插入e L.length++;//增加长度 return OK; }

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 最好情况:在表尾插入,时间复杂度为O(1)

最坏情况:在表头插入,时间复杂度为O(n)

平均情况:假设Pi(Pi=1/(n+1))是在第i个位置上插入一个节点的概率,则平均移动次数为

i=1n+1pi ( ni+1 ) =i=1n+11n+1 ( ni+1 ) =1n+1n ( n+1 ) 2=n2\sum_{i=1}^{n+1}p_i(n-i+1)=\sum_{i=1}^{n+1}\frac{1}{n+1}(n-i+1)=\frac{1}{n+1}\frac{n(n+1)}{2}=\frac{n}{2} i=1n+1pi (n−i+1)=i=1n+1n+11 (n−i+1)=n+11
相关文章
|
算法 vr&ar
线性表的详解与深入
线性表的详解与深入
|
存储
线性表的链式存储结构
线性表的链式存储结构
|
存储 缓存
线性表
从以上就很容易看出,在缓存利用率方面,顺序表由于内存是连续的,而链表是一个个单个的节点连起来的,顺序表的命中率绝对要比链表高不少,但是链表又要比顺序表要灵活不少,到这里我相信你就能理解为什么说所以这两种结构是优势互补的关系了,具体使用哪种结构,当然还是要根据具体场景去抉择了,好了这篇博客到这里就结束了,多多点赞支持哦!!
线性表
|
存储 算法 C++
线性表和链表
线性表和链表
120 0
|
存储 人工智能 DataX
线性表的顺序存储实现
线性表的顺序存储实现
|
存储 C++
线性表的顺序存储——顺序表
线性表的顺序存储——顺序表
177 2
线性表的顺序存储——顺序表
|
存储 机器学习/深度学习 人工智能
浅谈线性表
数据结构线性表、栈与队列的区别0
107 0
浅谈线性表
|
存储
线性表之顺序表
线性表之顺序表
108 0
线性表之顺序表
|
存储 C++
C++实现线性表 - 02 单向链表
今天我们来动手实现一下链表结构,链表在我们后续的数据结构中用的十分频繁,可以说就是实现后续很多数据结构一个的基本工具,也是最容易的数据结构之一,我们先从最基础的单向链表讲起,小白刚开始学习肯定会被折磨的头疼,我也是这样的,但只要啃下这块硬骨头就已经前进一大步了!
181 0
C++实现线性表 - 02 单向链表