顺序线性列表,说白了就是对一个数组元素进行增删查改,下面是自己的一些理解。
增加:分为三种情况,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