【数据结构笔记】静态链表 详尽(Java)

本文详细介绍了静态链表的概念,它结合了顺序表和链式表的优点,允许快速访问和操作元素。静态链表在数组中存储,利用“游标”维持数据间的逻辑关系。内容涵盖了静态链表的节点结构、初始化、空间分配、添加、删除、查找、修改数据的操作,以及与动态链表的区别。通过Java实现,提供了静态链表的完整实现流程和运行结果展示。

1.静态链表的概述

静态链表是为了在一些没有指针的语言中使用链表。他同时也融合了顺序表和链式表的优点,既能快速访问元素,也能快速的增加和删除元素。

静态链表像顺序表一样存储在数组中,但是存储结构却时链式表的分散存储。数据间的一对一逻辑由“游标”来维持。

数据结构如下图
在这里插入图片描述

在静态链表中有两个表头,除了数据链的表头外,还有一个备用链的表头,用来管理数组中的空闲位置。一般以数组下标为0的位置为备用链表头,下标为1的位置为数据链表头。

在这里插入图片描述
上图中,数据链第一个元素是11通过游标存储的2,得知下一个元素是arr[2]中的22,此时的游标是0,表示数据链到头了。因为arr[0]默认为备用链表头不存储数据所以以0表示结尾。

2.静态链表的实现

2.1静态链表的结点
class NodeOfArr {
    private int data;//数据
    private int cur;//游标

    public void setData(int data) {
        this.data = data;
    }

    public void setCur(int cur) {
        this.cur = cur;
    }

    public int getData() {
        return data;
    }

    public int getCur() {
        return cur;
    }
}

2.2初始化

此时还没有数据,因为所有空间都应该加入备用链表中。

	private int maxSize = 10;
    private NodeOfArr [] arr = new NodeOfArr[maxSize];
    
    //初始化
    public void init(){
        for(int i = 0;i<maxSize;i++){
            arr[i] = new NodeOfArr();
            arr[i].setData(0);
            arr[i].setCur(i+1);
        }
        arr[maxSize-1].setCur(0);
    }
2.3申请分配空间

当向数据链表加入数据时应先申请空间,从备用链表中获取结点空间。

//申请分配空闲结点,如果有则返回空闲结点编号,如果没有返会
    public int malloc(){
        int i = arr[0].getCur();
        if(arr[0].getCur() != 0){
            arr[0].setCur(arr[i].getCur());
        }
        return i;
    }
2.4添加数据

从备用链表中获取空间并加入数据链表中。

//添加结点
    public void add(){
        int num = malloc();
        if(num == 0){
            System.out.println("无空闲结点!");
            return;
        }
        System.out.println("请输入数据:");
        Scanner sca = new Scanner(System.in);
        if(num == 1){
            arr[1].setCur(0);
            arr[1].setData(sca.nextInt());
        } else {
            NodeOfArr tmp1 = arr[1];
            while(tmp1.getCur() != 0){
                tmp1 = arr[tmp1.getCur()];
            }
            tmp1.setCur(num);
            arr[num].setData(sca.nextInt());
            arr[num].setCur(0);
        }
    }

上述代码是顺序加入数据,还可以指定位置插入数据。

//在指定位置插入结点
    public void insert(){
        System.out.println("请输入要插入的位置:");
        Scanner sca = new Scanner(System.in);
        int loc = sca.nextInt();
        NodeOfArr tmp = arr[1];
        for(int i = 2;i<loc;i++){
            tmp = arr[tmp.getCur()];
        }
        int insert = malloc();
        arr[insert].setCur(tmp.getCur());
        tmp.setCur(insert);
        System.out.println("请输入数据:");
        arr[insert].setData(sca.nextInt());
    }
2.5删除数据

通过指定在数据链中的位置来删除数据结点。

//删除指定位置的结点
    public void delete(){
        System.out.println("请输入要删除的位置:");
        Scanner sca = new Scanner(System.in);
        int loc = sca.nextInt();
        NodeOfArr tmp = arr[1];
        for(int i = 2;i<loc;i++){
            tmp = arr[tmp.getCur()];
        }
        int num = tmp.getCur();
        tmp.setCur(arr[num].getCur());
        arr[num].setCur(arr[0].getCur());
        arr[0].setCur(num);
        arr[num].setData(0);
    }
2.6查找数据

查找指定数据结点的位置

//查找指定元素
    public void find(){
        System.out.println("请输入要查询的数据:");
        Scanner sca = new Scanner(System.in);
        int val = sca.nextInt();
        int tmp = 1;
        while(arr[tmp].getCur() != 0){
            if(arr[tmp].getData() == val){
                System.out.println("结点位置"+tmp);
                return;
            }
            tmp = arr[tmp].getCur();
        }
    }
2.7修改数据

此功能是在查找数据功能的基础上实现,查找指定数据并修改成新键入数据

//修改指定元素
    public void modify(){
        System.out.println("请输入要修改的原数据和新数据:");
        Scanner sca = new Scanner(System.in);
        int valOld = sca.nextInt();
        int valNew = sca.nextInt();
        int tmp = 1;
        while(arr[tmp].getCur() != 0){
            if(arr[tmp].getData() == valOld){
                arr[tmp].setData(valNew);
                return;
            }
            tmp = arr[tmp].getCur();
        }
    }
2.8格式化输出

用来验证功能是否顺利实现,并查看静态链表状态

 //格式化输出
    public void play(){
        for(int i = 0;i<maxSize;i++){
            System.out.println("结点"+i+" 数据:"+arr[i].getData()+" 游标:"+arr[i].getCur());
        }
    }
2.9运行结果展示

在这里插入图片描述
演示了部分功能(全功能演示图太长了hhhh

3和动态链表区别

静态链表在创建时指定大小,也就是说大小是固定的,超出会报错。而动态链表随用随申请,空间不会耗尽(创个链表应该不至于内存耗尽 。
还有一点就是,静态链表维护俩个头结点,一个是数据链表头,一个是备用链表头。这与动态链表也不同。

欢迎评论和指正啦~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值