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

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

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

线性表的定义

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




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值