线性表的顺序存储及JAVA实现

来源:互联网 发布:领淘宝优惠券的app 编辑:程序博客网 时间:2024/05/22 00:53

 线性表是线性结构的典型代表

线性表是一种最基本、最简单的数据结构,数据元素之间仅有单一的前驱和后继关系。线性表不仅具有广泛的应用,而且也是其他数据结构的基础。

线性表的定义

  线性表是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;  }  }




原创粉丝点击