【大话数据结构】——-线性表之顺序存储
2017-03-16 20:56
260 查看
一、什么是线性表?
线性表嘛,肯定是一种线性结构,由N(N>=0)个数据元素(结点)组成的有穷序列。
简单点说,就是元素组成的序列。
当n=0,则为空表
当n>0,线性表可以表示为(a1....an)a1为起始结点an为终端结点。
对于任意一对相邻节点a1ai+1 ,a1为ai+1的直接前驱,ai+1为a1的直接后继。
线性表的基本特性:
1)线性表中结点的关系是一对一的
2)线性表中的起始结点(第一个元素)无前驱,终端结点(最后一个元素)没有后继,其他元素有且仅有一个前驱(前件)和后继(后件)。
3)既然是有穷序列,那么线性表肯定是有长度的,长度就是元素的个数,当然元素个数也是有限的,也就是说,线性表的长度是有限的。
在Java中的List接口,就是线性表。ArrayList 是顺序线性表,LinkedList 是链表线性表。
有时面试官会问:ArrayList 与LinkedList 有什么区别呀? 你就可以直接告诉他:ArrayList 是顺序线性表,LinkedList 是链表线性表。
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/laugh.gif)
再深问细化就是CRUD(增查改删)的性能比较啦。
详寻:ArrayList和LinkedList区别
二、线性表的顺序存储
线性表的顺序存储其实就是用顺序存储实现的线性表,我们称之为顺序表,一般我们用数组来表示线性表。
线性表顺序存储的方法:将表中的结点依次存放在计算机内存中一组连续的存储单元中,数据元素在线性表中的邻接关系决定它们在存储空间中的存储位置,就是逻辑结构中相邻的结点存储位置也相邻。
线性表的运算在顺序表上的实现:增删查。
1.插入(增)
说明:
插入的主要步骤:首先将结点an,an-1,...,ai依次向后移动一个元素的位置,空出i元素的位置,然后将X置入这个空位,最后表长加1。
加个图也许看的更直观一些:
![](https://img-blog.csdn.net/20170316203109987?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2luZ2l0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
分析:
顺序表的存储特点说明,元素的移动只能按的次序从右向左进行,
具体代码如下:
//insert opration
void insert(SqlList
L,DataType x,int i)
{
if(L.length==MaxSize ||i<1 || i>L.length+1) --表满或者位置错的判断
return ERROR;
for(j=L.length;j>=i;j--)
{ --这对括号可以省略
lL.data[j]=L.data[j-1];
L.data[i-1]=x;
L.length++;
}
}
。2.删除(减)
说明:删除是将长度为n的线性表变为长度为n-1的线性表。就不上图了。
和增加类似,删除也要移动结点,逻辑上还是有变化的,n个元素依次向左移动一个位置,为的是填补删除留下的空缺,当i=n时,直接将长度减1就可以了。
以下为代码:
// Delete opration
int delete(struct sequencelist *list,int index)
{
int length = list->length;
if(length ==0 || index < 0 || index > length-1 )
return ERROR;
for(int i = index;i<length-1;i++)
{
list->data[i] = list->data[i+1];
}
list->data[length-1] = '\0';//delete the last element.
list->length--;
return OK;
}
3.查找(定位)
说明:查找一般为从左向右按照下表来查找。
以下是代码:
//get list elements
//make sure elemet is NOT NULL when calling.
int getElement(struct sequencelist list,int index,int *element)
{
printf("\ngetElement\n");
int length = list.length;
printf("length is %d\n",length);
if(length ==0 || index < 0 || index >= length)
return ERROR;
*element = list.data[index];
return OK;
}
小结:顺序表实现算法的分析
从算法实现可以看出,线性表基本操作中,使用最频繁的是元素的比较和移动,所以我们关心的应是在实现中元素比较和移动的次数。当然元素移动的次数肯定与表的长度和插入的位置有关。
这里提一下最坏的情况下,实现算法的复杂度为O(n),一般情况下元素比较和移动的次数为n-i+1次。平均移动次数约为(n-1)/2。
对于查找操作,平均时间复杂度为O(n)。
PS:线性表的链式存储下次再说吧,本来打算写在一篇文章里的,但是后来发现如果作一篇说明的话肯定只会大体的说一下,所以另写一篇吧。
线性表嘛,肯定是一种线性结构,由N(N>=0)个数据元素(结点)组成的有穷序列。
简单点说,就是元素组成的序列。
当n=0,则为空表
当n>0,线性表可以表示为(a1....an)a1为起始结点an为终端结点。
对于任意一对相邻节点a1ai+1 ,a1为ai+1的直接前驱,ai+1为a1的直接后继。
线性表的基本特性:
1)线性表中结点的关系是一对一的
2)线性表中的起始结点(第一个元素)无前驱,终端结点(最后一个元素)没有后继,其他元素有且仅有一个前驱(前件)和后继(后件)。
3)既然是有穷序列,那么线性表肯定是有长度的,长度就是元素的个数,当然元素个数也是有限的,也就是说,线性表的长度是有限的。
在Java中的List接口,就是线性表。ArrayList 是顺序线性表,LinkedList 是链表线性表。
有时面试官会问:ArrayList 与LinkedList 有什么区别呀? 你就可以直接告诉他:ArrayList 是顺序线性表,LinkedList 是链表线性表。
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/laugh.gif)
再深问细化就是CRUD(增查改删)的性能比较啦。
详寻:ArrayList和LinkedList区别
二、线性表的顺序存储
线性表的顺序存储其实就是用顺序存储实现的线性表,我们称之为顺序表,一般我们用数组来表示线性表。
线性表顺序存储的方法:将表中的结点依次存放在计算机内存中一组连续的存储单元中,数据元素在线性表中的邻接关系决定它们在存储空间中的存储位置,就是逻辑结构中相邻的结点存储位置也相邻。
线性表的运算在顺序表上的实现:增删查。
1.插入(增)
说明:
插入的主要步骤:首先将结点an,an-1,...,ai依次向后移动一个元素的位置,空出i元素的位置,然后将X置入这个空位,最后表长加1。
加个图也许看的更直观一些:
分析:
顺序表的存储特点说明,元素的移动只能按的次序从右向左进行,
具体代码如下:
//insert opration
void insert(SqlList
L,DataType x,int i)
{
if(L.length==MaxSize ||i<1 || i>L.length+1) --表满或者位置错的判断
return ERROR;
for(j=L.length;j>=i;j--)
{ --这对括号可以省略
lL.data[j]=L.data[j-1];
L.data[i-1]=x;
L.length++;
}
}
。2.删除(减)
说明:删除是将长度为n的线性表变为长度为n-1的线性表。就不上图了。
和增加类似,删除也要移动结点,逻辑上还是有变化的,n个元素依次向左移动一个位置,为的是填补删除留下的空缺,当i=n时,直接将长度减1就可以了。
以下为代码:
// Delete opration
int delete(struct sequencelist *list,int index)
{
int length = list->length;
if(length ==0 || index < 0 || index > length-1 )
return ERROR;
for(int i = index;i<length-1;i++)
{
list->data[i] = list->data[i+1];
}
list->data[length-1] = '\0';//delete the last element.
list->length--;
return OK;
}
3.查找(定位)
说明:查找一般为从左向右按照下表来查找。
以下是代码:
//get list elements
//make sure elemet is NOT NULL when calling.
int getElement(struct sequencelist list,int index,int *element)
{
printf("\ngetElement\n");
int length = list.length;
printf("length is %d\n",length);
if(length ==0 || index < 0 || index >= length)
return ERROR;
*element = list.data[index];
return OK;
}
小结:顺序表实现算法的分析
从算法实现可以看出,线性表基本操作中,使用最频繁的是元素的比较和移动,所以我们关心的应是在实现中元素比较和移动的次数。当然元素移动的次数肯定与表的长度和插入的位置有关。
这里提一下最坏的情况下,实现算法的复杂度为O(n),一般情况下元素比较和移动的次数为n-i+1次。平均移动次数约为(n-1)/2。
对于查找操作,平均时间复杂度为O(n)。
PS:线性表的链式存储下次再说吧,本来打算写在一篇文章里的,但是后来发现如果作一篇说明的话肯定只会大体的说一下,所以另写一篇吧。
相关文章推荐
- 大话数据结构 code 第3章 01线性表顺序存储_List
- 数据结构之线性表代码实现顺序存储,链式存储,静态链表(选自大话数据结构)
- 第3章 线性表的顺序存储c#实现---《大话数据结构》读书笔记
- 数据结构之线性表代码实现顺序存储,链式存储,静态链表(选自大话数据结构)
- [读书笔记]-大话数据结构-3-线性表(一)-线性表的顺序存储
- 数据结构——线性表的伪链表存储(顺序存储链式遍历)
- 线性表的顺序存储
- 线性表的顺序存储
- 数据结构入门学习系列-3(线性表的顺序存储)
- #1:数据结构:线性表 - 顺序存储类型;
- (2) JAVA:线性表的顺序存储与链式存储
- C/C++ 数据结构---线性顺序存储数据:查询快,增删慢
- 线性表的顺序存储
- 线性表的顺序存储
- 线性表的顺序存储
- 线性表中顺序存储和链式存储
- 数据结构-----线性表的顺序存储
- 2008秋季-计算机软件基础- 线性表顺序存储 - 菜单
- 线性表顺序存储的实现
- C _数据结构 _线性表的顺序存储