顺序表(SeqList) Java实现

实现的操作包括:

  1. 向顺序表末尾添加数据 ( addData( Data));
  2. 向顺序表指定位置添加数据( insertDataByLoc( Location));
  3. 删除顺序表中指定的数据( deleteDataByData( Data));
  4. 删除顺序表中指定位置的数据( deleteDataByLoc( Location));
  5. 查找指定位置的数据( findDataByLoc( Location));
  6. 查找指定数据的位置( findLocationOfData( Data))。

辅助实现的操作包括:

  1. 判断顺序表是否为空( isEmpty());
  2. 判断顺序表是否满( isFull())。

下面是实现的代码(SeqList)

/**
 * 该顺序表实现仅针对不存在相同元素的集合
 * 若集合中存在相同元素,则:
 *      方法 deleteDataByData(Type):删除第一个满足要求的数据。
 *      方法 findLocationOfData(Type):返回查找到的满足要求的第一个数据的地址。
 */
public class SeqList <Type> {
    /**
     * 定义数据结构
     */
    private static final int MAXSIZE = 100;//顺序表的最大长度
    private int size;//顺序表中的节点数
    Type[] dataList;//保存节点类型为 Type 的数组

    /**
     * 默认构造方法
     */
    public SeqList(){
        dataList = (Type[]) new Object[MAXSIZE];
        this.size = 0;
    }

    /**
     * 根据指定数组构造顺序表(未调通)
     * @param dataList:指定的数组
     */
    public SeqList(Type[] dataList){
        this.dataList = dataList;
        this.size = dataList.length;
    }

    /**
     * 构造指定大小的顺序表
     * @param size:指定的大小
     */
    public SeqList(int size){
        dataList = (Type[]) new Object[size];
        this.size = 0;
    }

    /**
     * 获取顺序表的大小
     * @return size:顺序表大小
     */
    public int getSize(){
        return this.size;
    }

    /**
     * 清空顺序表
     */
    public void clear(){
        this.dataList = null;
        this.size = 0;
    }

    /**
     * 向顺序表末尾添加节点 data
     * @param data:新添加的节点
     * @return -1:顺序表满,添加失败
     *          0:添加成功
     */
    public int addData(Type data){
        if (this.size == MAXSIZE) {//首先判断顺序表是否已满
            //System.out.println("顺序表已满!");
            return -1;
        }
        dataList[size++] = data;
        //顺序表未满,则将新数据添加到顺序表末尾。
        // 同时顺序表大小递增 1
        return 0;
    }

    /**
     * 向指定位置插入节点 data
     * @param data:新插入的数据
     * @param loc:插入的位置
     * @return -1:位置超出范围或顺序表满,插入错误
     *          0:插入成功
     */
    public int insertDataByLoc(Type data, int loc){
        if ((size == MAXSIZE)){
            //System.out.println("  顺序表已满!");
            return -1;
        }else if ((loc >= MAXSIZE)){
            //System.out.println("  指定位置过大!请指定 " + MAXSIZE + " 以内的位置!");
            return -1;
        } else if (loc < 0){
            //System.out.println("  指定位置不正确!位置不能为负数!");
            return -1;
        } else if (loc >= size){
            addData(data);
            //System.out.println("  指定位置超过当前顺序表最后一个节点的位置!\n  已将当前数据插入到顺序表最后!");
            return 0;
        }else if (size == 0) {
            dataList[0] = data;
            return 0;
        }else {
            for (int i = size-1; i >= loc; i--) {
                //将 loc 往后的节点都向后移动一个位置
                dataList[i+1] = dataList[i];
            }
            dataList[loc] = data;//将新数据插入到指定位置
            this.size += 1;//将顺序表大小递增 1
            return 0;
        }
    }

    /**
     * 删除指定元素,并返回删除元素的位置
     * @param data:需要删除的数据
     * @return  i:删除数据的位置
     *         -1:没有找到指定的元素
     */
    public int deleteDataByData(Type data){
        for (int i = 0; i < this.size; i++) {
            if (dataList[i].equals(data)) {
                deleteDataByLoc(i);
                return i;
            }
        }
        return -1;
    }

    /**
     * 删除指定位置的数据
     * @param loc:数据的位置
     * @return 删除掉的数据值
     */
    public Type deleteDataByLoc(int loc){
        Type data = findDataByLoc(loc);//将 loc 处的数据保存下来
        if (data == null)//数据为空
            return null;
        for (int i = loc; i < this.size; i++) {
            //将 loc 往后的数据顺序地往前移动一个位置
            dataList[i] = dataList[i+1];
        }
        this.size --;//将顺序表大小递减 1
        return data;
    }

    /**
     * 查找指定位置的数据
     * @param loc:数据的位置
     * @return 指定位置的数据值
     */
    public Type findDataByLoc(int loc){
        if ((loc > this.size) || (loc < 0) || (dataList == null))
            return null;
        return dataList[loc];
    }

    /**
     * 查找指定数据的位置
     * @param data:需要查找的数据
     * @return loc:数据的位置
     */
    public int findLocationOfData(Type data){
        for (int i = 0; i < this.size; i++) {
            //查找指定数据
            if (dataList[i].equals(data)) {
                return i;
            }
        }
        return -1;
    }

    /**
     * 判断顺序表是否为空
     * @return 顺序表是否为空
     */
    public boolean isEmpty(){
        //好奇一件事,为什么使用 if(dataList == null) 得到的结果是错的?
        //下面的实现是暴力实现,慎用!!!
//        if ((dataList == null) || (dataList.length == 0))
//            return true;
//        return false;
        for (int i = 0; i < dataList.length; i++) {
            if (dataList[i] != null)
                return false;
        }
        return true;
    }

    /**
     * 打印顺序表数据
     */
    public void display(){

        for (int i = 0; i < this.size; i++) {
            System.out.print(" " + dataList[i]);
        }

    }
}

 下面是该代码的测试代码(SeqListTest)

public class SeqListTest {

    private int[] dataList = new int[10];
    private static final int SIZE = 20;
    private static final int MULTI = 3;

    /**
     * 程序的 main() 方法
     * @param args
     */
    public static void main(String[] args) {
        SeqListTest s = new SeqListTest();
        s.run();
    }

    /**
     * 运行程序
     */
    public void run(){

        //首先构造数据列表
        for (int i = 0; i < dataList.length; i++) {
            dataList[i] = (i+1);
        }


        SeqList<Integer> seqDataList = new SeqList<>();
        if (seqDataList.isEmpty())//测试 isEmpty() 方法
            System.out.println("顺序表为空。");
        for (int i = 0; i < SIZE; i++) {//测试 addData() 方法
            seqDataList.addData((i * MULTI));
        }

        // 测试 findDataByLoc() 方法
        display(seqDataList);

        //测试 insertDataByLoc() 方法
        System.out.println("在位置 -3 处添加数据:10");
        seqDataList.insertDataByLoc(10,-3);
        System.out.println("在位置 3 处添加数据:10");
        seqDataList.insertDataByLoc(10,3);
        System.out.println("在位置 23 处添加数据:10");
        seqDataList.insertDataByLoc(10,23);
        System.out.println("在位置 103 处添加数据:10");
        seqDataList.insertDataByLoc(10,103);
        display(seqDataList);

        //测试 deleteDataByData() 方法
        System.out.println("删除数据:3");
        seqDataList.deleteDataByData(3);
        System.out.println("删除数据:5");
        seqDataList.deleteDataByData(5);
        display(seqDataList);

        //测试 deleteDataByLoc() 方法
        System.out.println("删除位置:-6 的数据");
        seqDataList.deleteDataByLoc(-6);
        System.out.println("删除位置:6 的数据");
        seqDataList.deleteDataByLoc(6);
        System.out.println("删除位置:26 的数据");
        seqDataList.deleteDataByLoc(26);
        display(seqDataList);

        //测试 findLocationOfData() 方法
        System.out.println("删除元素:15");
        seqDataList.deleteDataByData(15);
        System.out.println("删除元素:105");
        seqDataList.deleteDataByData(105);
        display(seqDataList);

        //测试 findLocationOfData() 方法
        System.out.println("查找元素:10 的位置:" + seqDataList.findLocationOfData(10));
        System.out.println("查找元素:-1 的位置:" + seqDataList.findLocationOfData(-1));

        //测试 clear() 方法
        seqDataList.clear();
        display(seqDataList);
    }

    private void display(SeqList seqDataList){
        System.out.println("顺序表中的数据为:");
        for (int i = 0; i < seqDataList.getSize(); i++) {
            System.out.print("  " + seqDataList.findDataByLoc(i));
        }
        System.out.println("\n顺序表大小为:" + seqDataList.getSize());
        System.out.println();
    }
}

 因为很久没写代码,所以写得比较乱,还望谅解~/bq

猜你喜欢

转载自blog.csdn.net/weixin_42034276/article/details/86707175