您的位置:首页 > 理论基础 > 数据结构算法

【大话数据结构】——-线性表之顺序存储

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 是链表线性表。


再深问细化就是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:线性表的链式存储下次再说吧,本来打算写在一篇文章里的,但是后来发现如果作一篇说明的话肯定只会大体的说一下,所以另写一篇吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: