线性表-顺序存储结构

线性表的顺序存储结构也称为顺序表!!!

逻辑结构:

 存储结构,用详细的代码实现!!!

//线性表的抽象数据类型描述
ADT List
{
数据对象:
    D={ai|0<=i<=n-1,n>=0,ai为E类型}    //E是用户指定的类型
数据关系:
    r={<ai,ai+1>|ai,ai+1属于D,i=0,...,n-2}
基本运算:
    void CreateList(E[] a)    //由a数组中的全部元素建立线性表的相应存储结构
    void Add(E e)    //将元素a添加到线性表末尾
    int size()    //求线性表的长度
    void Setsize(int nlen)    //设置表的长度
    E GetElem(int i,E e)    //求序号为i的元素
    void SetElem(int i,E e)    //设置表中序号为i的元素值为e
    int GetNo(E e)            //求表中第一个值为e的元素的序号
    void swap(int i,int j)    //交换序号为i和序号为j的元素
    void Insert(int i,E e)    //插入数据元素e作为第i个元素
    void Delect(int i)        //删除第i个数据元素
    String toString()        //将线性表转换为字符串
}

完整的代码:

@SuppressWarnings("unchecked")
public class SqListClass<E>						//顺序表泛型类
{
	final int initcapacity=10;					//顺序表的初始容量(常量)
	private E[] data;							//存放顺序表中元素
	private int size;    						//存放顺序表的长度
	private int capacity;    					//存放顺序表的容量
	public SqListClass() {						//构造方法,实现data和size的初始化
		data = (E[])new Object[initcapacity];	//强制转换为E类型数组
		capacity=initcapacity;
		size=0;
	}
	private void updatecapacity(int newcapacity) {			//改变顺序表的容量为newcapacity
		E[] newdata = (E[])new Object[newcapacity];
		for (int i=0; i<size; i++)					//复制原来的元素
			newdata[i]=data[i];
		capacity=newcapacity;						//设置新容量
		data=newdata;								//仍由data标识数组
	}
	//线性表的基本运算算法	
	public void CreateList(E[] a)					//由a整体建立顺序表
	{
		int i,k=0;
		for (i=0;i<a.length;i++) {
			if (size==capacity)						//出现上溢出时
				updatecapacity(2*size);						//扩大容量
			data[k]=a[i];
			k++;									//添加的元素个数增加1
		}
		size=k;										//设置长度
	}

	public void Add(E e)							//在线性表的末尾添加一个元素e
	{
		if (size==capacity)							//顺序表空间满时倍增容量
			updatecapacity(2*size);
		data[size]=e;
		size++;										//长度增1
	}
	public int size()								//求线性表长度
	{
		return size;
	}
	public void Setsize(int nlen)					//设置线性表的长度
	{
		if (nlen<0 || nlen>size)
			throw new IllegalArgumentException("设置长度:n不在有效范围内");
		size=nlen;
	}
	public E GetElem(int i)							//返回线性表中序号为i的元素
	{
		if (i<0 || i>size-1)
			throw new IllegalArgumentException("查找:位置i不在有效范围内");
		return (E)data[i];
	}
	public void SetElem(int i,E e)					//设置序号i的元素为e
	{
		if (i<0 || i>size-1)
			throw new IllegalArgumentException("设置:位置i不在有效范围内");
		data[i]=e;
	}
	public int GetNo(E e)							//查找第一个为e的元素的序号
	{
		int i=0;
		while (i<size && !data[i].equals(e))
			i++;									//查找元素e
		if (i>=size)								//未找到时返回-1
			return -1;
		else
			return i;								//找到后返回其序号
	}
	public void swap(int i,int j)					//交换data[i]和data[j]
	{
		E tmp=data[i];
		data[i]=data[j]; data[j]=tmp;
	}
	public void Insert(int i, E e)				//在线性表中序号i位置插入元素e
	{
		if (i<0 || i>size)							//参数错误抛出异常
			throw new IllegalArgumentException("插入:位置i不在有效范围内");
		if (size==capacity)							//满时倍增容量
			updatecapacity(2*size);
		for (int j=size; j>i; j--)					//将data[i]及后面元素后移一个位置
			data[j]=data[j-1];
		data[i]=e;									//插入元素e
		size++;										//顺序表长度增1
	}
	public void Delete(int i) {						//在线性表中删除序号i位置的元素
		if (i<0 || i>size-1)						//参数错误抛出异常
			throw new IllegalArgumentException("删除:位置i不在有效范围内");
		for (int j=i; j<size-1;j++)					//将data[i]之后的元素前移一个位置
			data[j]=data[j+1];
		size--;										//顺序表长度减1
	if (size>initcapacity && size==capacity/4)		//满足要求容量减半
		updatecapacity(capacity/2);
	}
	public String toString() {						//将线性表转换为字符串
		String ans="";
		for (int i=0;i<size;i++)
			ans+=data[i].toString()+" ";
		return ans;
	}

}

都看到这里了,创作不易,多多关照!!! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

来玥方长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值