一、什么是线性表?
线性表嘛,肯定是一种线性结构,由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(增查改删)的性能比较啦。
二、线性表的顺序存储
线性表的顺序存储其实就是用顺序存储实现的线性表,我们称之为顺序表,一般我们用数组来表示线性表。
线性表顺序存储的方法:将表中的结点依次存放在计算机内存中一组连续的存储单元中,数据元素在线性表中的邻接关系决定它们在存储空间中的存储位置,就是逻辑结构中相邻的结点存储位置也相邻。
线性表的运算在顺序表上的实现:增删查。
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:线性表的链式存储下次再说吧,本来打算写在一篇文章里的,但是后来发现如果作一篇说明的话肯定只会大体的说一下,所以另写一篇吧。