顺序线性列表的增删查改

来源:互联网 发布:云南师范大学网络教学 编辑:程序博客网 时间:2024/06/06 05:00

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

增加:分为三种情况,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);}@Overridepublic boolean isEmpty() {if(this.se_length==0){return true;}else{return false;}}@Overridepublic int getLength() {return this.se_length;}//索引值应该从0开始,小于最大长度@Overridepublic T getData(int index) {if(index>=0&&index<this.se_length){return se_table[index];}else{return null;}}@Overridepublic 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;}@Overridepublic boolean addData(T element) {//加到末尾return addData(this.se_length,element);}@Overridepublic 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;}@Overridepublic 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;}@Overridepublic 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
原创粉丝点击