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

一、什么是线性表?

线性表嘛,肯定是一种线性结构,由N(N>=0)个数据元素(结点)组成的有穷序列

简单点说,就是元素组成的序列。

当n=0,则为空表

当n>0,线性表可以表示为(a1....ana1为起始结点an为终端结点。

对于任意一对相邻节点a1ai+1 ,a1ai+1的直接前驱,ai+1a1的直接后继。

线性表的基本特性:

1)线性表中结点的关系是一对一的

2)线性表中的起始结点(第一个元素)无前驱,终端结点(最后一个元素)没有后继,其他元素有且仅有一个前驱(前件)和后继(后件)。

3)既然是有穷序列,那么线性表肯定是有长度的,长度就是元素的个数,当然元素个数也是有限的,也就是说,线性表的长度是有限的。

在Java中的List接口,就是线性表。ArrayList 是顺序线性表,LinkedList 是链表线性表。

有时面试官会问:ArrayList 与LinkedList 有什么区别呀? 你就可以直接告诉他:ArrayList 是顺序线性表,LinkedList 是链表线性表。大笑

再深问细化就是CRUD(增查改删)的性能比较啦。

详寻:ArrayList和LinkedList区别

二、线性表的顺序存储

线性表的顺序存储其实就是用顺序存储实现的线性表,我们称之为顺序表,一般我们用数组来表示线性表。

线性表顺序存储的方法:将表中的结点依次存放在计算机内存中一组连续的存储单元中,数据元素在线性表中的邻接关系决定它们在存储空间中的存储位置,就是逻辑结构中相邻的结点存储位置也相邻。

线性表的运算在顺序表上的实现:增删查。

1.插入(增)

说明:

插入的主要步骤:首先将结点anan-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就可以了。

    以下为代码:

    1. // Delete opration  
    2. int delete(struct sequencelist *list,int index)  
    3. {  
    4.     int length = list->length;  
    5.     if(length ==0 || index < 0 || index > length-1 )  
    6.         return ERROR;  
    7.     for(int i = index;i<length-1;i++)  
    8.     {  
    9.         list->data[i] = list->data[i+1];  
    10.     }  
    11.     list->data[length-1] = '\0';//delete the last element.  
    12.     list->length--;  
    13.     return OK;  

    3.查找(定位)

    说明:查找一般为从左向右按照下表来查找。

    以下是代码:

    1. //get list elements  
    2. //make sure elemet is NOT NULL when calling.  
    3. int getElement(struct sequencelist list,int index,int *element)  
    4. {  
    5.     printf("\ngetElement\n");  
    6.     int length = list.length;  
    7.     printf("length is %d\n",length);  
    8.     if(length ==0 || index < 0 || index >= length)  
    9.         return ERROR;  
    10.     *element = list.data[index];  
    11.     return OK;  

    小结:顺序表实现算法的分析

    从算法实现可以看出,线性表基本操作中,使用最频繁的是元素的比较和移动,所以我们关心的应是在实现中元素比较和移动的次数。当然元素移动的次数肯定与表的长度和插入的位置有关。

    这里提一下最坏的情况下,实现算法的复杂度为O(n),一般情况下元素比较和移动的次数为n-i+1次。平均移动次数约为(n-1)/2。

    对于查找操作,平均时间复杂度为O(n)。


    PS:线性表的链式存储下次再说吧,本来打算写在一篇文章里的,但是后来发现如果作一篇说明的话肯定只会大体的说一下,所以另写一篇吧。


  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值