数据结构线性表之顺序表

数据结构(java实现)

线性表

最简单常用的一种数据结构,就是n个数据元素的有限序列。可以理解为一个中间没有空元素的数组(数组元素不一定只有数)

在这里插入图片描述

顺序表

那么我们现在来用java实现一个最简单的顺序表,先写个接口确定一下功能,主要是增删和查

zhpackage xianxingbiao1;//这个是包,不用管

public interface IList {
    
    //设定接口
    public void clean();//将线性表置空

    public boolean isEmpty();//判断线性表内元素个数,为0返回true ,不为0返回false

    public int length();//求线性表内元素个数并返回

    public  Object get(int i) throws Exception;//读取线性表中第i个元素:0≤i≤length()-1,如果i值不在此范围则抛出异常

    public void insert (int i, Object x) throws Exception;//给线性表里添加元素。在线性表第i个元素之前插入一个值为x的数据元素,其中i取值范围为:0≤i≤length()。如果i值不在此范围则抛出异常,当i=0时表示在表头插入一个数据元素x,当i=length()时表示在表尾插入一个数据元素x

    public void remove (int i) throws Exception;//将线性表中第i个元素删除,其中i取值范围为:0≤i≤length()- 1,如果i值不在此范围则抛出异常

    public  int  indexOf(Object x);//返回线性表中指定元素首次出现的索引,如果列表不包含此元素,则返回-1

    public  void display();//输出线性表中的数据元素

}

​ object是所有类型的基础类,所有类型都能实现这个方法,也表示线性表不只能用数来实现。其中get和remove取值范围用0≤i≤length()-1是因为线性表和数组一样都是从0开始计排序的,如果表里有5个元素,那么最后一个元素的序号一定是4,所以用这两种方法操作表的时候序号指令不能小于0,不能大于4。而添加则不需要,因为添加是在某序号前添加,5个元素,在5号元素前添加就相当于在4号元素后添加,两者是一样的。因此添加时范围与读取和删除的范围差1.

下一步实现类和方法,创建一个类之间调用接口

package xianxingbiao1;

public class SqList implements IList{
    
    

    private Object[] listElem; // 线性表存储空间,设定一个类似数组的东西

    private int curLen; // 当前长度

    // 顺序表的构造函数,构造一个存储空间容量为maxSize的线性表
    public SqList(int maxSite){
    
    
        curLen=0;
        listElem=new Object[maxSite];//给储存空间设定容量
    }

    @Override
    public void clean() {
    
    
        curLen=0;//将线性表长度变成0,置空
    }

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

    @Override
    public int length() {
    
    
        return curLen; // 返回顺序表的当前长度
    }

    // 读取到线性表中的第i个数据元素并由函数返回其值。其中i取值范围为:0≤i≤length()-1,如果i值不在此范围则抛出异常
    @Override
    public Object get(int i) throws Exception {
    
    
        if (i < 0 || i > curLen - 1)// i小于0或者大于表长减1
        {
    
    
            throw new Exception("第" + i + "个元素不存在"); // 输出异常
        }
        return listElem[i]; // 返回顺序表中第i个数据元素
    }

    // 在线性表的第i个数据元素之前插入一个值为x的数据元素。其中i取值范围为:0≤i≤length()。如果i值不在此范围则抛出异常,当i=0时表示在表头插入一个数据元素x,当i=length()时表示在表尾插入一个数据元素x
    @Override
    public void insert(int i, Object x) throws Exception {
    
    
        if(curLen==listElem.length){
    
    
            throw new Exception("顺序表已满");
        }
        if (i < 0 || i > curLen){
    
    // i小于0或者大于表长
            throw new Exception("插入位置不合理");// 输出异常
        }

            for (int j = curLen; j > i; j--) //遍历线性表,确定有那些位置需要后移
                listElem[j] = listElem[j - 1];// 把插入位置之后的元素后移给插入的位置腾地方
                listElem[i] = x; // 插入x
                curLen++;// 表长度增1
    }

    // 将线性表中第i个数据元素删除。其中i取值范围为:0≤i≤length()- 1,如果i值不在此范围则抛出异常
    @Override
    public void remove(int i) throws Exception {
    
    
      if(i<0||i>curLen-1){
    
    
          throw new Exception("删除位置不合理");// 输出异常
      }
      if(i==curLen-1){
    
    //这个地方需要注意,删除的逻辑是把需要删除的那个元素后面的元素依次+1来删除元素,但是如果需要删除的元素是最后一个元素,那么没有别的元素来通过+1删除掉他,所以我们通过缩短表长来实现
          curLen--;
      }
      else{
    
    
          for (int j = i; j < curLen - 1; j++) {
    
    //遍历线性表,确定有那些位置需要前移,填补删除后的空
              listElem[j] = listElem[j + 1];// 被删除元素之后的元素前移
              curLen--;
          }
      }
    }

    @Override
    public int indexOf(Object x) {
    
    
        int j = 0;// j为计数器
        while (j < curLen && !listElem[j].equals(x))
            // 从顺序表中的首结点开始查找,直到listElem[j]指向元素x或到达顺序表的表尾
            j++;
        if (j < curLen)// 判断j的位置是否位于表中
            return j; // 返回x元素在顺序表中的位置
        else
            return -1;// x元素不在顺序表中
    }

    @Override
    public void display() {
    
    
        for (int j = 0; j < curLen; j++)
            System.out.print(listElem[j] + " ");
        System.out.println();// 换行
    }
}

书上有图,可以帮忙理解一下算法:

在这里插入图片描述
类和方法些完了,我们来实验一下

package xianxingbiao1;

public class Result {
    
    
    public static void main(String[] args) throws Exception {
    
    
        SqList L = new SqList(5);
        L.insert(0,1 );
        L.insert(1,2 );
        L.insert(2,3 );
        L.insert(3,4 );
        System.out.println("顺序表中的各个数据元素为:");
        L.remove(3);
        L.display();
        System.out.println(L.get(2));
        System.out.println(L.indexOf(2));

    }
}

输出:

顺序表中的各个数据元素为:
1 2 3 
3
1

进程已结束,退出代码 0

问题不大,这样一个最简单的基本线性表就构建完成了

参考博客

猜你喜欢

转载自blog.csdn.net/qq_43652113/article/details/106693137