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和动态链表区别
静态链表在创建时指定大小,也就是说大小是固定的,超出会报错。而动态链表随用随申请,空间不会耗尽(创个链表应该不至于内存耗尽 。
还有一点就是,静态链表维护俩个头结点,一个是数据链表头,一个是备用链表头。这与动态链表也不同。
欢迎评论和指正啦~~
本文详细介绍了静态链表的概念,它结合了顺序表和链式表的优点,允许快速访问和操作元素。静态链表在数组中存储,利用“游标”维持数据间的逻辑关系。内容涵盖了静态链表的节点结构、初始化、空间分配、添加、删除、查找、修改数据的操作,以及与动态链表的区别。通过Java实现,提供了静态链表的完整实现流程和运行结果展示。
&spm=1001.2101.3001.5002&articleId=110731819&d=1&t=3&u=7a682759f9444c34bea06bd595665e89)
752

被折叠的 条评论
为什么被折叠?



