顺序线性列表的增删查改

顺序线性列表,说白了就是对一个数组元素进行增删查改,下面是自己的一些理解。

增加:分为三种情况,1)是增加的位置在数组的后面,且数组未装满的情况,直接加到后面。2)数组未满,需要插入数据到中间,那么从插入位置开始的元素开始后移,然后插入元素,数组长度加1。3)数值元素个数已经等于或者大于数组长度,这时数组需要扩容,所谓的扩容就是用一个临时数组来装原来数组的数据,然后重新new一个数组名称相同,长度是原来2倍的数组,然后讲临时数组的内容全部放到数组里面,然后再将元素插入数组中。


删除:分为两种情况,1)是直接在后面删除一个元素,然后数组长度减一。2)删除元素位置后面还有很多元素,那么久从删除位置开始依次将后面的元素先前移动,用来覆盖前面的元素。


查找:直接根据index来查找,当然index要大于0,小于数组的长度。


修改:也是直接根据index来修改,当然index要大于0,小于数组的长度。


总而言之,线性表最重要的还是元素的增加和删除。而增加跟删除特别的地方就是扩容和元素的前移后移。


下面是具体的代码:

package com.structure.linktable.imp;

/**
 * 线性表接口
 * @author fengjr
 */
public interface LinearTable<T> {

	//判空
	public boolean isEmpty();
	//计算长度
	public int getLength();
	//返回某个位置的元素
	public T getData(int index);
	//更新index位置的元素,返回前一个元素
	public T setData(int index,T element);
	//插入一个元素,位置没有限制(插入链表末尾)
	public boolean addData(T element);
	//在指定的位置上插入一个元素
	public boolean addData(int index,T element);
	//删除某个位置上的元素,并返回该元素
	public T deleteData(int index);
	//清空线性表
	public boolean clearData();
}

实现类:
package com.structure.linktable.impl;

import com.structure.linktable.imp.LinearTable;


/**
 * 线性表实现
 * @author fengjr
 * @param <T>
 */
public class SequenceTable<T> implements LinearTable<T> {
	
	private T[] se_table;//使用数组作为元素
	private int se_length;//数组长度
	
	//通过构造函数序列号顺序表
	@SuppressWarnings("unchecked")
	public SequenceTable(int size){
		if(size<0){
			System.out.println("不能为空");
		}else{
			this.se_table=(T[]) new Object[size];
			this.se_length=0;
		}
	}
	
	//初始化数组
	public SequenceTable(){
		this(20);
	}

	@Override
	public boolean isEmpty() {
		if(this.se_length==0){
			return true;
		}else{
			return false;
		}
	}

	@Override
	public int getLength() {
		return this.se_length;
	}

	//索引值应该从0开始,小于最大长度
	@Override
	public T getData(int index) {
		if(index>=0&&index<this.se_length){
			return se_table[index];
		}else{
			return null;
		}
	}

	@Override
	public T setData(int index, T element) {
		if(index>=0&&index<this.se_length&&se_table[index]!=null){
			T oldElement=se_table[index];
			se_table[index]=element;
			return oldElement;
		}
		return null;
	}

	@Override
	public boolean addData(T element) {
		//加到末尾
		return addData(this.se_length,element);
	}

	@Override
	public boolean addData(int index, T element) {
		//如果element为空
		if(element==null){
			return false;
		}
		//首先如果index等于或者大于数组长度,则需要扩容
		if(this.se_length==se_table.length){
			T[] tem=se_table;
			this.se_table=(T[]) new Object[this.se_length*2];
			for(int i=0;i<=tem.length;i++){
				se_table[i]=tem[i];
			}
		}
		//如果index等于0,默认插入到第一个位置
		if(index<=0){
			index=0;
		}
		//如果index小于数组长度,则index后面的内容需要后移
		if(index>this.se_length){
			this.se_length=index;
		}
		for(int j=this.se_length-1;j>=index;j--){
			se_table[j+1]=se_table[j];
		}
		this.se_table[index]=element;
		this.se_length++;
		return true;
	}

	@Override
	public T deleteData(int index) {
		if(index>0&&index<this.se_length&&this.se_length!=0){
			T oldElement=se_table[index];
			for(int j=index;j<this.se_length;j++){
				se_table[index]=se_table[index+1];
			}
			this.se_table[this.se_length-1]=null;
			this.se_length--;
			return oldElement;
		}
		return null;
	}

	@Override
	public boolean clearData() {
		if(this.se_length!=0){
			for(Object obj:this.se_table){
				obj=null;
			}
			return true;
		}
		return false;
	}

}

测试类:
package com.structure.linktable.test;

import com.structure.linktable.impl.SequenceTable;

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		SequenceTable sequenceTable = new SequenceTable(10);  
        sequenceTable.addData("a");  
        sequenceTable.addData("b");  
        sequenceTable.addData("c");  
        System.out.println(sequenceTable.getLength());
        System.out.println(sequenceTable.toString());
        System.out.println(sequenceTable.getData(0)); 
        System.out.println(sequenceTable.getData(1));  
        System.out.println(sequenceTable.getData(2));  
        sequenceTable.setData(0, "aa");  
        System.out.println(sequenceTable.getData(0));
		
	}

}

测试结果:

3
com.structure.linktable.impl.SequenceTable@14318bb
a
b
c
aa




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值