线性表之顺序存储结构
第三章
线性表:零个或多个数据元素的有限序列。
若将线性表标记为(a1,a2,...ai-1,ai,ai+1,...,an),
当i=1,2,...n-1时,ai有且仅有一个直接后继,
当i=2,3,...,n时,ai有且仅有一个直接前驱。
线性表的抽象数据类型:
《大话数据结构》中是C语言版,这里是java版的。
基本操作:
1)线性表的制空操作: clear()
2)线性表判空操作: isEmpry()
3)求线性表的长度: length()
4)取元素操作: get(i)
5)插入操作: insert(i,x)
6)删除操作: remove(i)
7)查找操作: indexOf(x)
8)输出操作: display()
Java接口描述
public interface IList {
public void clear();
public boolean isEmpty();
public int length();
public Object get(int i);
public void insert(int i,Object x);
public void remove(int i);
public int indexOf(Object x);
public void display();
}
可继续参考:http://blog.csdn.net/sdliujiangbo/article/details/8068570
例子:A并B代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; public class AandB { public static void main(String[] args) { // TODO Auto-generated method stub List<Integer> A = new ArrayList<Integer>(Arrays.asList(3,5,8,11)); List<Integer> B = new ArrayList<Integer>(Arrays.asList(2,6,8,9,11,15,20)); System.out.println("集合A:"+A); System.out.println("集合B:"+B); List<Integer> tmp = new ArrayList<Integer>(B); tmp.removeAll(A); System.out.println("集合B-A:"+tmp); List<Integer> result = new ArrayList<Integer>(A); result.addAll(tmp); System.out.println("集合B-A+A(去掉重复值):"+result); A.addAll(B); Collections.sort(A); System.out.println("A+B(保留重复值按序排列):"+A); } }
线性表的顺序存储结构:用一段地址连续的存储单元依次存储线性表的数据元素。
顺序存储结构需要三个属性:
1)存储空间的起始位置:数组data,它的存储位置就是存储空间的存储位置。
2)线性表的最大存储容量:数组长度MaxSize.
3)线性表的当前长度:length.
注意区别:数组长度&&线性表长度
数组长度:存放线性表的存储空间的长度,存储分配后这个量一般不变的。
线性表长度:线性表中数据元素的个数,随着线性表插入和删除操作的进行,这个量是变化的。
在任意时刻,线性表的长度应该小于等于数组的长度。
地址计算方法:
假设每个数据元素占用c个存储单元,那么线性表中第i+1个数据元素的存储位置和第i个数据元素的存储位置满足下列关系。(LOC表示获得存储位置的函数)
LOC(ai+1)=LOC(ai)+c
所以对于第i个数据元素ai的存储位置可以由ai推算出:
LOC(ai)=LOC(a1)+(i-1)*c
顺序结构的插入与删除
1、获得元素的操作
2、插入操作
插入算法的思路:
1)如果插入位置不合理,抛出异常;
2)如果线性表长度大于等于数组长度,则抛出异常或动态增加容量;
3)从最后一个元素开始向前遍历到第i个位置,分别将它们都向后移动一个位置;
4)将要插入元素填入位置i处;
5)表长加1.
实现代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public boolean insertElem(int i, T t) { if(length == MAXSIZE) { //线性表已经满了 System.out.println("该线性表已经满了"); return false; } if(i < 1 || i > MAXSIZE) { //插入位置不在范围内 System.out.println("该位置不合法"); return false; } if(i < length) { //插入位置不在表尾 for(int j = length; j >= i; j--) { //将要插入位置后数据元素向后移动一位 data[j] = data[j - 1]; } } data[i - 1] = t; //插入新元素 length++; //线性表长度增加 return true; }
3、删除元素
删除算法的思路:
1)如果删除位置不合理,抛出异常;
2)取出删除元素;
3)从删除元素位置开始遍历到最后一个元素位置,分别将它们都向前移动一个位置;
4)表长减1.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//删除元素 public T deleteElem(int i) { if(length == 0) { //"线性表为空" System.out.println("线性表为空"); return null; } if(i < 1 || i > length) { //删除位置不在范围内 System.out.println("该位置不合法"); return null; } T t = data[i -1]; for(int j = (i - 1); j <= (length - 1); j++) { data[j] = data[j+1]; } length--;//线性表长度减少 return t; }
线性表的顺序存储结构,在存,取数据时间复杂度都是O(1)
而插入或删除时,时间复杂度都是O(n)。
线性表顺序存储结构的优缺点:
优点:
·无须为表示表中元素之间的逻辑关系而增加额外的存储空间
·可以快速地存取表中任意位置的元素。
缺点:
·插入和删除操作需要移动大量元素
·当线性表长度变化大时,难以确定存储空间的容量
·造成存储空间的”碎片“
java数据结构之线性表代码实现:http://blog.csdn.net/yaerfeng/article/details/38293401