【Java】 大话数据结构(3) 线性表之静态链表
本文根据《大话数据结构》一书,实现了Java版的静态链表。
用数组描述的链表,称为静态链表。
数组元素由两个数据域data和cur组成:data存放数据元素;cur相当于单链表中的next指针,称为游标。
某一静态链表结构如图所示(游标存放内容可参考程序中的说明1):

静态链表的优缺点:

静态链表实现程序:
package StaticLinkList;
/**
* 说明:
* 1.数组第一个元素的cur为备用链表第一个结点下标,
* 数组最后一个元素的cur为第一个有数据的元素的下标,相当于头结点
* 最后一个有值元素的 cur为0
* 2.插入删除操作时,获取第i-1个元素的 下标时,应注意i-1=0的情况
* 3.注释中的“位置”指的是在链表中的位置,“下标”代表数组中的下标,勿搞混
* 4.程序关键:获取下标,在数组层面上操作
* 5.程序中主要写了插入删除操作,其余基本操作与之前文章类似
*
* 问题:
* 1.泛型数组的建立
* 2.书中P73的if(space[0].cur)和P74的if(j)是属于判断什么?
*
* @author Yongh
*/
public class StaticLinkList<E> {
private SNode<E>[] nodes;
private int maxSize; public StaticLinkList(){
this(1000);
}
public StaticLinkList(int maxSize){
this.maxSize=maxSize;
nodes=new SNode[this.maxSize];//泛型的数组建立似乎有些问题
for(int i=0;i<this.maxSize-1;i++) {
nodes[i]=new SNode<E>(null, i+1);
}
nodes[maxSize-1]=new SNode<E>(null, 0);
} class SNode<E> {
E data;
int cur;
public SNode(E data,int cur){
this.data=data;
this.cur=cur;
}
} /**
* 获取第i个元素的下标
*/
public int getIndex(int i){
if(i<1||i>this.getLength())
throw new RuntimeException("查找位置错误!");
int k=nodes[maxSize-1].cur;
for (int j=1;j<i;j++)
k=nodes[k].cur;
return k;
} /**
* 获取第i个元素
*/
public SNode<E> getElement(int i){
return nodes[getIndex(i)];
} /**
* 返回可分配结点下标
*/
public int malloc_sll() {
int i= nodes[0].cur;
nodes[0].cur=nodes[i].cur;//第i个分量要拿来用了,所以指向下一个分量
//注意,不是nodes[0].cur=nodes[0].cur+1,下一个分量不一定就是下标加一;
return i;
} /**
* 插入操作,i代表第i个位置,而不是下标
* 注意插入到第一个位置的特殊性
*/
public void listInsert(int i,E e) {
if(i<1||i>this.getLength()+1)
throw new RuntimeException("插入位置错误!");
if(getLength()==maxSize-2)
throw new RuntimeException("表已满,无法插入!");
int j=this.malloc_sll();
nodes[j].data=e;
int p; ////第i-1个元素的下标
if(i==1) {
p=maxSize-1;
}else {
p=getIndex(i-1);
}
nodes[j].cur=nodes[p].cur;
nodes[p].cur=j;
} /**
* 删除第i个位置的结点
*/
public SNode<E> listDelete(int i) {
if(i<1||i>getLength())
throw new RuntimeException("删除位置错误!");
int m= getIndex(i);
int p; //第i-1个元素的下标
if(i==1) {
p=maxSize-1;
}else {
p=getIndex(i-1);
}
nodes[p].cur=nodes[m].cur;
free_sll(m);
return nodes[m];
} /**
* 将下标为i元素回收到备用链表中
*/
public void free_sll(int i) {
nodes[i].cur=nodes[0].cur;
nodes[0].cur=i;
} /**
* 返回静态链表的长度
*/
public int getLength() {
int length=0;
int i=nodes[maxSize-1].cur;
while(i!=0) {
i=nodes[i].cur;
length++;
}
return length;
} }
测试代码:
package StaticLinkList;
public class StaticLinkListTest {
public static void main(String[] args) {
StaticLinkList<Student> students =new StaticLinkList<Student>();
System.out.println("——————————插入1到5,并读取内容——————————");
Student[] stus= {new Student("小A",11),new Student("小B",12),new Student("小C",13),
new Student("小D",14),new Student("小E",151)};
for(int i=1;i<=5;i++)
students.listInsert(i, stus[i-1]);
System.out.println("表长:"+students .getLength());
Student stu;
for(int i=1;i<=5;i++) {
stu=students .getElement(i).data;
System.out.println("第"+i+"个位置为:"+stu.name);
}
System.out.println("——————————删除小B、小E——————————");
stu=students .listDelete(2).data;
System.out.println("已删除:"+stu.name);
stu=students .listDelete(4).data;
System.out.println("已删除:"+stu.name);
System.out.println("当前表长:"+students .getLength());
for(int i=1;i<=students .getLength();i++) {
stu=students .getElement(i).data;
System.out.println("第"+i+"个位置为:"+stu.name);
}
System.out.println("表长:"+students.getLength());
}
}
class Student{
public Student(String name, int age) {
this.name=name;
this.age=age;
}
String name;
int age;
}
——————————插入1到5,并读取内容——————————
表长:5
第1个位置为:小A
第2个位置为:小B
第3个位置为:小C
第4个位置为:小D
第5个位置为:小E
——————————删除小B、小E——————————
已删除:小B
已删除:小E
当前表长:3
第1个位置为:小A
第2个位置为:小C
第3个位置为:小D
表长:3
StaticLinkListTest
【Java】 大话数据结构(3) 线性表之静态链表的更多相关文章
- 【Java】 大话数据结构(2) 线性表之单链表
本文根据<大话数据结构>一书,实现了Java版的单链表. 每个结点中只包含一个指针域的链表,称为单链表. 单链表的结构如图所示: 单链表与顺序存储结构的对比: 实现程序: package ...
- 【Java】 大话数据结构(1) 线性表之顺序存储结构
本文根据<大话数据结构>一书,实现了Java版的顺序存储结构. 顺序存储结构指的是用一段地址连续的存储单元一次存储线性表的数据元素,一般用一维数组来实现. 书中的线性表抽象数据类型定义如 ...
- 【Java】 大话数据结构(5) 线性表之双向链表
本文根据<大话数据结构>一书,实现了Java版的双向链表. 在每个数据结点中都有两个指针,分别指向直接后继和直接前驱,这样的链表称为双向链表. 双向链表的结构如图所示: 查找元素可以根据元 ...
- Java数据结构-线性表之静态链表
静态链表的定义: 节点由一个一维数组和一个指针域组成,数组用来存放数据元素,而指针域里面的指针(又称游标)用来指向下一个节点的数组下标. 这种链表称之为静态链表. 链表中的数组第一个和最后一个位置须要 ...
- 数据结构 1 线性表详解 链表、 栈 、 队列 结合JAVA 详解
前言 其实在学习数据结构之前,我也是从来都没了解过这门课,但是随着工作的慢慢深入,之前学习的东西实在是不够用,并且太皮毛了.太浅,只是懂得一些浅层的,我知道这个东西怎么用,但是要优化.或者是解析,就不 ...
- 【Java】 大话数据结构(4) 线性表之循环链表
本文稍微介绍了一下循环链表. 将单链表终端结点的指针域由空指针改为指向头结点,形成一个环,这种头尾相接的单链表称为循环列表. 循环列表的结构如下图所示: 循环链表的优点:可以从任意一个结点出发,遍历所 ...
- [C++]数据结构:线性表之(单)链表
一 (单)链表 ADT + Status InitList(LinkList &L) 初始化(单)链表 + void printList(LinkList L) 遍历(单)链表 + int L ...
- Java数据结构-线性表之单链表LinkedList
线性表的链式存储结构,也称之为链式表,链表:链表的存储单元能够连续也能够不连续. 链表中的节点包括数据域和指针域.数据域为存储数据元素信息的域,指针域为存储直接后继位置(一般称为指针)的域. 注意一个 ...
- javascript实现数据结构与算法系列:线性表的静态单链表存储结构
有时可借用一维数组来描述线性链表,这就是线性表的静态单链表存储结构. 在静态链表中,数组的一个分量表示一个结点,同时用游标(cur)代替指针指示结点在数组中的相对位置.数组的第0分量可看成头结点,其指 ...
随机推荐
- BZOJ 3993 [SDOI2015]星际战争 | 网络流 二分答案
链接 BZOJ 3993 题解 这道题挺棵的-- 二分答案t,然后源点向武器连t * b[i], 武器向能攻击的敌人连1, 敌人向汇点连a[i],如果最大流等于所有敌人的a[i]之和则可行. #inc ...
- 【ARC079F】Namori Grundy
Description 题目链接 大意:给一张基环外向树.要求给每一个点确定一个值,其值为所有后继点的\(\text{mex}\).求是否存在确定权值方案. Solution 首先,对于叶子节点,其权 ...
- 洛谷 P1457 城堡 The Castle 解题报告
P1457 城堡 The Castle 题目描述 我们憨厚的USACO主人公农夫约翰(Farmer John)以无法想象的运气,在他生日那天收到了一份特别的礼物:一张"幸运爱尔兰" ...
- HTML5 快速学习二 Canvas
本篇文章开始讲解HTML5的核心功能之一:Canvas 通过Canvas可以动态生成和展示图形.图表.图像以及动画. Canvas API功能非常多,我们将讨论最常用的功能. 我们先新建一个canva ...
- 第七节 认识SpringMVC中的表单标签
所谓成熟,就是:你要习惯,任何人的忽冷忽热:也要看淡,任何人的渐行渐远: --胖先生 SpringMVC的表单标签 回顾: JSTL标签 --C标签 FMT标签 自学:JSP如何自定义标签[开源社区当 ...
- spring+spring mvc+JdbcTemplate 入门小例子
大家使用这个入门时候 最好能够去 搜一下 spring mvc 的 原理,我放一张图到这里,自己琢磨下,后面去学习就容易了 给个链接 (网上一把,千万不能懒) https://www.cnblo ...
- .NET面试题系列(四)计算机硬件知识
计算机的硬件组成 总线:贯穿整个系统的是一组电子管道(其实就是传输数据的线路),也就是总线.总线传送的是字,字的大小与系统相关,比如在32位操作系统当中, 一个字是4个字节. I/O设备:I/O设备是 ...
- Vue.js绑定内联样式
1.对象语法 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ...
- 叉积(POJ - 2318 )
题目链接:https://cn.vjudge.net/contest/276358#problem/A 题目大意:给你一个矩阵的左上角和右下角,然后n个竖杠,这n个竖杠将这个矩阵分成n+1个方块,给你 ...
- 「Android 开发」入门笔记
「Android 开发」入门笔记(界面编程篇) ------每日摘要------ DAY-1: 学习笔记: Android应用结构分析 界面编程与视图(View)组件 布局管理器 问题整理: Andr ...