线性表是线性结构的典型代表
线性表是一种最基本、最简单的数据结构,数据元素之间仅有单一的前驱和后继关系。线性表不仅具有广泛的应用,而且也是其他数据结构的基础。
线性表的定义
线性表是n个具有相同类型的数据元素的有限序列。数据元素的个数称为线性表的长度。长度等于零是称为空表。
线性表的数据元素具有抽象的数据类型,在设计具体的应用程序时,数据元素的抽象类型将被具体的数据类型所取代。
线性表的顺序存储结构及实现——顺序表
顺序表是用一段地址连续的存储单元依次存储线性表的数据元素。通常用一维数组来说实现顺序表,也就是把线性表中相邻的元素存储在数组中相邻的位置,从而导致了数据元素的序号和存放它的数组下表之间的一一对应。
用数组存储顺序表,就意味着要分配固定长度的数组空间,因此,必须确定数组的长度,即存放线性表的数组空间的长度。因为在线性表中可以经行插入操作,则数组的长度就要大于当前线性表的长度。数组的长度和线性表的长度不是同一概念。(数组的长度大于线性表的长度)
设顺序表的每个元素占用c个存储单元,则第i个元素的存储地址为:LOC(ai)=LOC(a1)+(i-1)*c;
顺序表中数据元素的存储地址是其序号的线性函数,只要确定了存储顺序表的起始地址,计算任意一个元素的存储地址的时间是相等的,具有这一特点的存储结构称为随机存取结构。
优点——随机存取,读取数据速度快。
缺点——增加、删除元素需要大量移动元素。表的容量难以确定。造成存储空间的碎片。数组要求占用连续的存储空间,即使存储单元数超过所需的数目,如果不连续也不能使用。
JAVA中的应用:ArrayList。
package data.LineList.SequenceList;
import java.util.ArrayList;
/**
* 顺序表的实现
* @author zhouhai
*
*/
public class SeqList<E> {
private Object [] data=null;//data,用来保存该线性表数据的数组
private int capacity;//线性表的容量,即数组的长度!
private int current;//线性表包含元素的个数
/**
* 初始化没有声明大小,则设置为10
*/
SeqList(){
this(10);
}
/*
* 初始化线性表,声明保存数据的数组的大小
*
*/
public SeqList(int initialSize) {
// TODO Auto-generated constructor stub
if(initialSize>=0){
this.capacity=initialSize;
data=new Object[initialSize];
current=0;
}else{
throw new RuntimeException("初始化数组长度不能小于零"+initialSize);
}
}
/**
* 在线性表的末尾加元素,在加入之前先确定线性表是否已经满了
*/
public boolean addElement(E e){
ensureCapacity();
data[current]=e;
++current;
return true;
}
/**
* 检查存储数据的数组容量,如果数组已经满,则增加容量,否则不操作
*/
public void ensureCapacity(){
int index;
if(current==capacity){
capacity*=2;//将线性表的容量扩大两倍
Object [] newData=new Object[capacity];
//将原来数组中的元素复制到新数组中
for(int i=0;i<capacity/2;i++){
newData[i]=data[i];
}
data=newData;
}
}
/**
* 返回下表为index的元素
*/
public E get(int index){
validateIndex(index);
return (E) data[index];
}
/**
* 在指定的位置插入元素
*/
public void set(int index,E e){
validateIndex(index);
}
/**
* 验证下标是否合法,非法是抛出异常
*/
public void validateIndex(int index){
if(index<0||index>=current){
throw new RuntimeException("无效的下标:"+index);
}
}
/**
* 返回当前顺序表的大小
* @return
*/
public int getSize(){
return current;
}
/**
* 在指定位置加入指定元素
* @param index 待插入的位置
* @param e 待插入的元素
*/
public boolean insert(int index,E e){
validateIndex(index);
ensureCapacity();//确保容量
//将
for(int temp=current;temp>index;temp--){
data[temp]=data[temp-1];
}
data[index]=e;
++current;
return true;
}
/**
* 删除下表为index的元素
*/
public boolean delete(int index){
validateIndex(index);
for(int temp=index;temp<capacity-1;temp++){
data[temp]=data[temp+1];
}
data[current-1]=null;
current--;
return true;
}
}