数据结构(Java笔记)—顺序表

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40780805/article/details/82780335

在计算机中线性表可以采用两种方式来保存,一种是顺序存储结构,另一种是链式存储结构,对于顺序存储结构的线性表称为顺序表(Sequential List),而链式存储的线性表称为链表,以下是我对顺序表结构的学习。

顺序表结构的优点:适用于追加查询操作较多的数据存储,存储方式简单。

顺序表结构的缺点:在插入或者删除结点的时候,往往需要移动大量的数据。如果表比较大,有时还比较难分配足够的连续存储空间,即内存分配失败而无法存储。

对顺序表结构的设计分为以下几个步骤:

  1. 定义顺序表结构(SLType
  2. 初始化顺序表(SLInit
  3. 计算顺序表长度(SLLength
  4. 追加结点(SLAdd
  5. 插入结点(SLInsert
  6. 删除结点(SLDelete
  7. 查找/遍历结点(SLSelect

代码实现:

一,定义结点

class Data { // 定义结点
    String name;
    String age;
}

二,顺序表结构设计

public class SList {
    SLType SL;//定义全局引用,在初始化顺序表的时候会为引用赋值

    class SLType { // 定义顺序表结构
        static final int SLMAX = 20;// 顺序表的最大长度
        Data[] data = new Data[SLMAX];
        int SLLen;// 顺序表现有长度
    }

    void SLInit() {// 初始化顺序表
        if ((SL = new SLType()) != null) {
            SL.SLLen = 0;
        }
    }

    int SLLength() {// 计算顺序表长度
        return SL.SLLen;
    }

    int SLAdd(Data d) {// 追加数据
        if (SL.SLLen >= SL.SLMAX) {
            System.out.println("顺序表数据已满");
            return 0;
        }
        SL.data[SL.SLLen++] = d;//在顺序表尾部添加数据,且顺序表长度增一
        return 1;
    }

    int SLInsert(int n, Data d) {// 插入数据(插入结点号,插入数据对象)
        if (SL.SLLen >= SL.SLMAX) {//数据溢出
            System.out.println("顺序表数据已满");
            return 0;
        }
        if (n < 1 || n > SL.SLLen) {//保证数据插入位置有效
            System.out.println("输入结点号错误");
            return 0;
        }
        for (int i = SL.SLLen; i >= n; i--) {
            SL.data[i] = SL.data[i - 1];
        }
        SL.data[n - 1] = d;//输入结点从1开始,程序索引从0开始,故插入位置为n-1
        SL.SLLen++;//数据插入成功,顺序表长度增一
        return 1;
    }

    int SLDelete(int n) {// 删除数据结点
        if (n < 0 || n > SL.SLLen) {
            System.out.println("输入结点号错误");
            return 0;
        }
        for (int i = n - 1; i < SL.SLLen - 1; i++) {
            SL.data[i] = SL.data[i + 1];
        }
        SL.SLLen--;//数据删除成功,顺序表长度减一
        return 1;
    }

    Data SLSelectByNum(int n) {// 结点查询数据
        if (n < 0 || n > SL.SLLen) {
            System.out.println("输入结点号错误");
            return null;
        }
        return SL.data[n - 1];
    }

    void SLSelectAll(){//遍历查询所有数据
        if(SL.SLLen==0){
            System.out.println("数据表为空");
        }
        for(int i=0;i<SL.SLLen;i++){
            System.out.println("姓名:"+SL.data[i].name+"|"+"年龄:"+SL.data[i].age);
        }
    }
}

三,运行测试

public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        SList sList = new SList();
        sList.SLInit();
        while (true) {
            System.out.println("请输入:0(退出),1(添加信息),2(插入信息),3(查询所有信息),4(删除信息)");
            int i = in.nextInt();
            switch (i) {
            case 0:
                System.out.println("已退出");
                return;
            case 1:
                Data d=new Data();
                System.out.print("插入姓名:");
                String name=in.next();
                System.out.print("插入年龄:");
                String age=in.next();
                if(name==null||age==null){
                    System.out.println("信息不能为空");
                    break;
                }
                d.age=age;
                d.name=name;
                int temp1=sList.SLAdd(d);
                if(temp1==0){
                    System.out.println("插入失败");
                }System.out.println("插入成功");
                break;
            case 2:
                Data d2=new Data();
                System.out.print("插入姓名:");
                String name2=in.next();
                System.out.print("插入年龄:");
                String age2=in.next();
                if(name2==null||age2==null){
                    System.out.println("信息不能为空");
                    break;
                }
                System.out.print("插入结点号:");
                int n=in.nextInt();
                d2.age=age2;
                d2.name=name2;
                int temp2=sList.SLInsert(n, d2);
                if(temp2==0){
                    System.out.println("插入失败");
                    break;
                }System.out.println("插入成功");
                break;
            case 3:
                sList.SLSelectAll();
                break;
            case 4:
                System.out.print("删除结点号:");
                int n4=in.nextInt();
                int temp4=sList.SLDelete(n4);
                if(temp4==0){
                    System.out.println("删除失败");
                    break;
                }System.out.println("删除成功");
                break;
            default:
                break;
            }
        }
    }

猜你喜欢

转载自blog.csdn.net/qq_40780805/article/details/82780335