1. 静态链表:用数组描述的链表叫静态链表,通常为方便数据插入,我们会把数组建的大一些。
2. 数组元素(node):由两个数据域组成(data,cursor)。数据域data用来存放数据元素,也就是通常我们要处理的数据;而cursor相当于单链表中的指针,存放该元素的后继在数组中的下标。
3. Java实现静态链表:
// 静态链表
class StaticLinkedList {
private int size;
private Node[] node = new Node[100];
// 用数组初始化静态链表
public StaticLinkedList(int arr[]) {
for (int i = 0; i < 100; i++) {
node[i] = new Node(); // 初始化100个结点对象(感觉性能不会很好)
}
for (int j = 0; j < arr.length; j++) {
node[j + 1].setData(arr[j]); // 第一个结点为头结点,头结点没有数据,只存索引
node[j].setCursor(j + 1);
}
size = arr.length;
}
// 在某位置插入值
public void insert(int index, int value) {
validateIndex(index);
int curIndex = node[index].getCursor(); // 获取待插入结点的前一个结点指针,它记住的是原待插入结点位置
node[size + 1].setData(value); // 第一个结点为头结点,所以新插入的结点为node[size + 1]
node[size + 1].setCursor(curIndex); // 让新插入的结点记住原位置结点角标
node[index].setCursor(size + 1); // 让原位置前一结点记住新插入结点角标
size++;
}
// 删除指定位置的值
public void delete(int index) {
validateIndex(index);
int curIndex = node[index].getCursor(); // 获取待删除节点的前一个结点指针,它记住的是待删除结点角标(注:第一个结点为头结点)
int nextIndex = node[curIndex].getCursor(); // 获取待删除节点指针,它记住的是待删除的下一个结点角标
node[index].setCursor(nextIndex); // 将待删除结点的前一个结点指针指向待删除结点的下一个结点角标
size--;
}
// 验证下标值是否合法,非法时抛出异常。
private void validateIndex(int index) {
if (index < 0 || index > size) {
throw new IndexOutOfBoundsException("无效的下标:" + index);
}
}
// 输出所有元素
public void display() {
int nextIndex = node[0].getCursor(); // node[0] 为头结点,存的是下一个结点角标
int i = 0;
while (i < size) {
System.out.printf("%d\t", node[nextIndex].getData());
nextIndex = node[nextIndex].getCursor();
i++;
}
}
}
// 结点(数组元素)
class Node {
int data; // 记录存入的数据
int cursor; // 记录下一个数据的下标
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
public int getCursor() {
return cursor;
}
public void setCursor(int cursor) {
this.cursor = cursor;
}
}
// 测试类
public class Main {
public static void main(String[] args) {
int arr[] = { 1, 3, 4, 5, 6 };
StaticLinkedList list = new StaticLinkedList(arr);
System.out.print("初始化:\n");
list.display();
System.out.print("\n在角标为1的位置插入2后:\n");
list.insert(1, 2);
list.display();
System.out.print("\n删除角标为5的结点后:\n");
list.delete(5);
list.display();
}
}
4. 静态链表的优越点:
优点:在插入和删除操作时,不需要移动元素,从而改进了在顺序存储结构中插入和删除操作需要移动大量元素的缺点。
缺点:没有解决连续存储分配带来表长难以确定的问题。
5. 总的来说,静态链表其实是为了给没有指针的高级语言设计的一种实现单链表的方法,一般很少用。
分享到:
相关推荐
数据结构实验报告2线性表的链式存储结构 本实验报告的主要内容是介绍线性表的链式存储结构,并通过编程实验来掌握线性表的逻辑结构和链式存储结构,以及单链表的基本算法。 一、线性表的概念 线性表是最基本的...
数据结构教学课件:线性表链表.ppt
设计线性表的动态或者静态链式存储结构,并实现一个一元多项式的计算器。 实验要求: 以动态或者静态链表存储一元多项式,在此基础上按要求完成对一元多项式 的运算。(为保证多项式的值的准确性,多项式的系数可以...
利用C++实现以下经典数据结构与算法:线性表(顺序表、链表、静态链表、三元组)、栈(双栈、共享栈)、队列(任务调度、循环队列、双向队列、链队列)、数组(特殊矩阵、稀疏矩阵压缩)、串(朴素模式匹配、KMP算法...
数据结构与算法:线性表的题库 线性表是一种基本的数据结构,它是由零个或多个数据元素组成的有序集合。线性表的存储结构可以分为顺序存储结构和链式存储结构两种。顺序存储结构是将所有元素存储在一块连续的存储...
### 数据结构中线性表的链式存储及合并排序实现 #### 一、线性表的概念与链式存储介绍 线性表是数据结构中最基本的一种逻辑结构,它由n(n≥0)个数据元素组成的一个有限序列。线性表中的每个数据元素,除了第一个...
本实验的目的是让学生掌握线性表的顺序存储结构和链式存储结构的定义及基本操作,熟练掌握顺序表和链表的基本运算,理解循环链表和双链表的特点和基本运算,加深对顺序存储数据结构和链式存储数据结构的理解,并逐步...
本主题将深入探讨线性表、链表、队列、栈这四种基本的数据结构,并以C++语言为例,通过相关源代码(stringData.cpp、seqList.cpp、node.cpp、seqQueue.cpp、linkQueue.cpp、linkStack.cpp、seqStack.cpp)来解析其...
线性表是数据结构中的一个基本概念,它是一种在计算机内存中能够按照线性方式存储数据元素的结构。线性表的元素之间存在一对一的线性关系。在数据结构实验报告中,线性表的存储结构被分为两大类:顺序存储结构和链式...
线性表是计算机科学中一种基础且重要的数据结构,它由有限个相同类型的数据元素构成一个有序序列。在描述线性表时,我们通常强调以下四个特性:存在唯一的第一个元素和最后一个元素,以及除了两端元素外,每个元素都...
在实际应用中,链式存储结构常用于实现各种复杂数据结构,如图和树。在处理不确定数据量或频繁进行插入、删除操作的场景下,链式存储通常比顺序存储更优。实验报告的编写有助于巩固理论知识,提高实践能力,同时培养...
《数据结构C++版》实验一的目的是让学生深入理解线性表的顺序存储结构,并熟练掌握C++程序设计的基本技巧。在这个实验中,学生需要通过类的定义来实现线性表,数据对象的类型可以自定义。以下是实验涉及的主要知识点...
线性表是计算机科学中一种基础的数据结构,它是由相同类型元素构成的有限序列。在本实验中,我们将深入理解并实践线性表的链式存储结构,这是一种非顺序存储方式,与数组不同,它通过指针链接元素,使得元素在内存中...
数据结构: 线性表讲解实例。针对线性表的深入讲解。
数据结构实验一线性表的基本操作 一、线性表的概念和类型 线性表是一种基本的数据结构,它是一种由零个或多个元素组成的有限序列,每个元素都是数据类型的实例。线性表可以分为两种类型:顺序存储结构和链式存储...
数据结构:线性表(链接存储) 一、线性表的链接存储 线性表的链接存储是一种存储方式,它可以克服顺序存储的缺点。顺序存储需要一块连续的存储空间,但是当顺序表很大时,系统可能无法分配这么大的一块连续存储...
"数据结构作业:第2章-线性表作业题目.docx" 在这份作业中,我们可以总结出以下几个重要的知识点: 1. 线性表的存储方式:线性表可以采用顺序存储和链式存储两种方式。顺序存储方式是指将所有元素存储在一片连续的...
数据结构线性表的链式存储结构,使用c语言完成。线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素。
2、已知由单链表表示的线性表中,含有三类字符的数据元素(如:字母、数字和其它字符),设计算法构造三个以循环链表示的线性表,使每一个表中只含同一类的字符,且利用原表中的结点空间作为这三个表的空间。...
可控分频器设计此存储库使用C++实现以下经典数据结构和算法:线性表(顺序表、链表、静态链表、三元组)、堆栈(双堆栈、共享堆栈)、队列(任务调度、循环队列、双向队列、链队列)、数组(特殊矩阵、稀疏矩阵压缩...