【顺序表】java源码实现

定义线性表接口

public interface IListDS<T>{
    int Count(); //求长度
    void Clear();//清空操作
    boolean IsEmpty();//判断线性表是否为空的操作
    boolean IsFull();
    void Append(T item);//附加操作
    void Insert(T item,int i);//插入操作
    T Delete(int i);//删除操作
    T GetElem(int i);//取表元操作
    int Locate(T value);//按值查找操作

}

顺序表实现

public class SeqList<T> implements IListDS<T> {
    public T[] data; // 将数组的元素存放到线性表中
    public int last; // 线性表中最后一个元素的位置
    public int maxsize; // 线性表的容量

    public void SeqList(int size ){//创建一个顺序表类
        if (size>0){
            data = (T[]) new Object[size];
            this.maxsize=size;
            last=-1;
        }
        else
            throw  new RuntimeException("初始化容量必须大于零");
    }



    @Override
    public int Count() {
        return last + 1;
    }

    @Override
    public void Clear() {
        last = -1;
    }

    @Override
    public boolean IsEmpty() {
        return last == -1;
    }

    @Override
    public boolean IsFull() {
        return last == maxsize - 1;
    }

    @Override
    public void Append(T item) {
        if (last == maxsize-1){
            throw new RuntimeException("线性表已满,无法附加!");
        }
        data[++last] = item;
    }

    @Override
    public void Insert(T item, int i) {
        if (last==maxsize-1){
            throw new RuntimeException("线性表已满,无法插入");
        }
        if (i<1||i>last+2){
            throw new RuntimeException("插入位置错误");
        }
        // 元素移动
        for (int a=last;a>=i-1;--a){
            data[a+1] = data[a];
        }
        // 插入
        data[i-1]= item;
        // 修改表长
        ++last;
    }

    @Override
    public T Delete(int i) {
        T tmp;
        // 判断表是否为空
        if (last==-1){
            throw new RuntimeException("线性表为空,无法删除");
        }
        if (i<1||i>last+1){
            throw new RuntimeException("无效的下标"+i);
        }

        tmp = data[i - 1];
        for (int j= i;j<=last;++j){
            data[j-1]=data[j];
        }
        // 元素移动
        --last;
        return tmp;
    }

    @Override
    public T GetElem(int i) {
        if (IsEmpty()){
            throw new RuntimeException("线性表为空,无法获取元素");
        }
        if (i < 1 || i > last + 1){
            throw new RuntimeException("无效的下标"+ i);
        }
        return data[i - 1];
    }

    @Override
    public int Locate(Object value) {
        if (IsEmpty()){
            return -1;
        }
        int i = 0;
        for (i = 0;i<=last;++i){
            if (data[i].equals(value)){
                break;
            }
        }

        if (i>last){
            return -1;
        }
        return i+1;
    }
}

 案例:

请编制 java程序,利用顺序存储方式来实现下列功能:

(1)主函数中定义一个数组a[8]={12,32,43,55,34,76,81,59},建立一个顺序表,将数组a存储到顺序表中,并输出该顺序表中的数据以及该顺序表的长度;

(2)对(1)中建立的顺序表进行数据的插入、删除、查找(包括按值查找和按位查找),并在插入或删除数据后再输出顺序表中的数据。

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        SeqList<Integer> seqList = new SeqList<>();
        seqList.SeqList(12);
        int[] a = {12, 32, 43, 55, 34, 76, 81, 59};
        for (int i = 0; i < a.length; ++i) {
            seqList.Append(a[i]);

        }
        for (int i = 1; i <= seqList.Count(); ++i) {
            System.out.println("顺序表第" + i + "个元素为:" + seqList.GetElem(i));
        }
        System.out.println("表中一共有" + seqList.Count() + "个元素");


        // 插入操作:
        System.out.println("输入要插入的数字:");
        int num = sc.nextInt();
        System.out.println("输入要插入的位置:");
        int index = sc.nextInt();
        seqList.Insert(num, index);
        System.out.println("插入成功,展示数据:");
        for (int i = 1; i <=seqList.Count(); ++i) {
            System.out.println("第"+i+"个元素为:"+seqList.GetElem(i));
        }

        // 删除操作
        System.out.println("请输入你要删除的位置:");
        int p = sc.nextInt();
        seqList.Delete(p);
        System.out.println("删除成功,接下来开始输出顺序表数据");
        for (int i=1;i<=seqList.Count();++i){
            System.out.println("顺序表中第"+i+"个元素是:"+seqList.GetElem(i));
        }

        //按值查找操作
        System.out.println("请输入你要查找的数字:");
        int num2 = sc.nextInt();
        seqList.Locate(num2);
        if (seqList.Locate(num2) == -1){
            System.out.println("顺序表内没有你要查找的数字");
        }
        else
            System.out.println("顺序表中第"+seqList.Locate(num2)+"个元素是你要寻找的数字");

        //按位查找操作
        System.out.println("请输入你要查找的位置:");
        int num3 = sc.nextInt();
        seqList.GetElem(num3);
        System.out.println("顺序表中第"+num3+"个元素是你要寻找的"+seqList.GetElem(num3)+"数字");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值