C#数据结构-静态链表
对于双向链表中的节点,都包括一个向前、向后的属性器用于指向前后两个节点,对于引用类型,对象存储的是指向内存片段的内存指针,那么我们可以将其简化看作向前向后的两个指针。
现在我们将引用类型替换为值类型int,将链用数组代替,向后的指针替换为数组的下标,那么此时的链我们称为静态链表(或者说是单向静态链表)。
不多说,直接上代码(代码已做注解)
public class Node<T>
{ public T data { get; set; } public int next { get; set; } public Node(T item)
{
data = item;
}
}
public class StaticLink<T>
{
public int count { get; set; } = 0;
public Node<T>[] link { get; set; }
public int minSize { get; set; } = 10;
public int extendSize { get; set; } = 10;//扩容步长
public StaticLink()
{
//第一个节点为空节点,不存储内容,同时,第一个节点的next存放备用链表的第一个节点(备用链表——数组内可以用于存储内容的处于空值时的节点连接成的表)
//初始化,静态链表的长度为10;
link = new Node<T>[minSize];
for (int i = 0; i < minSize; i++)
{
//i=0时,由于链表为空,则备用链表的第一个节点也就是1
link[i] = new Node<T>(default(T));
link[i].next = i + 1;
}
//初始化,静态链表的结尾next 指向第一个节点(除头节点外)
link[minSize - 1].next = 1;
count++;
}
private int Malloc()
{
//取得静态链表-备用链表中的第一个节点(取出待用,存储内容)
int i = link[0].next;
if (i > 0)
{
//同时,移除备用链表的第一个节点,
link[0].next = link[i].next;
//取到链表的最后一个元素时,扩容。
if (i >= minSize - 1)
{
//todo 不翻倍扩容,采用定值步长扩容~
//todo 暂不实现
}
}
return i;
}
/// <summary>
/// 在链表的结尾附加
/// </summary>
/// <param name="node"></param>
public void Append(T node)
{
Insert(count, node);
}
/// <summary>
/// 指定位置插入节点
/// </summary>
/// <param name="index"></param>
/// <param name="node"></param>
public void Insert(int index, T node)
{
//要插入的节点需要在链表的范围内
if (index > count || index < 1)
throw new IndexOutOfRangeException("索引超出界限");
//由于时插入节点,所以此处我们需要从备用链表取出一个空节点。
int maxIndex = Malloc();
int k = minSize - 1;
Node<T> newNode = new Node<T>(node);//创建一个节点 if (count == 1)
newNode.next = 0;
else
{
//取链表最后一个节点的next;
for (int i = 1; i <= index -1; i++)
{
k = link[k].next;
}
newNode.next = link[k].next;
link[k].next = maxIndex;
}
link[maxIndex] = newNode;
count++;
}
/// <summary>
/// 根据索引删除
/// </summary>
/// <param name="index"></param>
public void Del(int index)
{
//去除头节点,并判断索引要在链表范围内
if (index < 1 || index > count)
throw new IndexOutOfRangeException("索引超出界限");
int k = minSize - 1;
//通过链取得前一个节点 -时间复杂度O(n)
for (int j = 1; j <= index - 1; j++)
{
k = link[k].next;
}
int beforeNodeNext = link[k].next;//获取前一个节点的next;
link[k].next = link[beforeNodeNext].next;//跳过要删除的节点
link[beforeNodeNext].next = link[0].next;//将释放除来的节点接入备用链
link[0].next = beforeNodeNext;//将当前释放的节点放入到备用的第一个节点。-待用
count--;
}
/// <summary>
/// 展示链节点
/// </summary>
public void showAll()
{
for (int i = 1; i <= count; i++)
{
Console.WriteLine($"index:{link[i].next},data:{link[i].data}");
}
}
}
测试:
class Program
{
static void Main(string[] args)
{
StaticLink<string> link = new StaticLink<string>();
link.Append("第一位");
link.Append("第二位");
link.Append("第三位");
link.Insert(2,"第四位,插入到二的位置");
link.Append("第五位");
link.Append("第六位");
link.Append("第七位");
link.Del(6); link.showAll(); Console.ReadLine();
}
}
打印结果:


C#数据结构-静态链表的更多相关文章
- 【Java】 大话数据结构(3) 线性表之静态链表
本文根据<大话数据结构>一书,实现了Java版的静态链表. 用数组描述的链表,称为静态链表. 数组元素由两个数据域data和cur组成:data存放数据元素:cur相当于单链表中的next ...
- Java数据结构-线性表之静态链表
静态链表的定义: 节点由一个一维数组和一个指针域组成,数组用来存放数据元素,而指针域里面的指针(又称游标)用来指向下一个节点的数组下标. 这种链表称之为静态链表. 链表中的数组第一个和最后一个位置须要 ...
- java与数据结构(2)---java实现静态链表
结点类 1 //结点类 2 class Node<T> { 3 private T data; 4 private int cursor; 5 6 Node(T data, int cur ...
- 静态链表C语言数据结构
静态链表就是将数组实现单链表: int Malloc_SLL(StaticLinkList space) { int i = space[0].cur;//取得第一个头节点的下标 if( space[ ...
- 静态链表的C实现(基于数据结构 严蔚敏)
静态链表是利用一维数组实现逻辑上的单链表结构,结点的逻辑上相邻但物理位置上不一定相邻,因为内存分配上是一次性的,故称为静态. 特点: 预先需要一片连续的存储空间: 非随机存取: 无现成的"内 ...
- 【数据结构】单链表&&静态链表详解和代码实例
喜欢的话可以扫码关注我们的公众号哦,更多精彩尽在微信公众号[程序猿声] 01 单链表(Singly Linked List ) 1.1 什么是单链表? 单链表是一种链式存储的结构.它动态的为节点分配存 ...
- 数据结构6: 静态链表及C语言实现
本节继续介绍线性表的另外一种链式表示——静态链表.(前面介绍的链表称为 动态链表 ). 逻辑结构上相邻的数据元素,存储在指定的一块内存空间中,数据元素只允许在这块内存空间中随机存放,这样的存储结构生成 ...
- c数据结构链式存储-静态链表
#include "string.h" #include "ctype.h" #include "stdio.h" #include &qu ...
- 静态链表实现(A-B)+(B-A)【代码】
-----------------------------------------------第一次发代码,写在前面------------------------------------------ ...
随机推荐
- [HGAME] Week1 Web WriteUp
一 .Cosmos的博客 打开题目之后,首页直接给了我们提示: 版本管理工具常用的有git和svn两种,这里提示了GitHub,考虑Git信息泄露,先访问/.git/目录考虑用Githack获取泄露信 ...
- 20190923-11Linux crond 系统定时任务 000 019
crond 服务管理 1.重新启动crond服务 [root@hadoop101 ~]# service crond restart centOS7是 systemctl restart crond ...
- 莫名其妙的Explain Plan
两张表的建表语句: CREATE TABLE hy_emp ( empno NUMBER(8,0) not null primary key, ename NVARCHAR2(60) not null ...
- mysql通过经纬度查询400公里范围内的小区
mysql距离计算,单位m,以及排序 lng 经度 lat 纬度 一般地图上显示的坐标顺序为,纬度在前(范围-90~90),经度在后(范围-180~180) 传入参数 纬度 40.0497810000 ...
- 面经手册 · 第10篇《扫盲java.util.Collections工具包,学习排序、二分、洗牌、旋转算法》
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 算法是数据结构的灵魂! 好的算法搭配上合适的数据结构,可以让代码功能大大的提升效率. ...
- 【GDKOI2004】汉诺塔
题目描述 古老的汉诺塔问题是这样的:用最少的步数将N个半径互不相等的圆盘从1号柱利用2号柱全部移动到3号柱,在移动的过程中小盘要始终在大盘的上面. 现在再加上一个条件:不允许直接把盘从1号柱移动到3号 ...
- python3 if
if-else python中特有if-elif-else语句
- 乔悟空-CTF-i春秋-Web-SQLi
2020.09.05 今天注定是高产的一天,这题真是坑,不看wp真的不会做,现在回头来复习一遍. 做题 题目 题目地址 做题 这题坑人的地方就在于重定向了两次,并且重要信息在第一次里藏着,第二次还给了 ...
- [算法与数据结构]使用Java泛型实现栈
###题解 1 实现内部类node 2 维护top为头节点的链表 3 操作 操作1:push() 操作2: pop() 操作3: isEmpty() ###代码 package Exam; class ...
- java Spring系列之 配置文件的操作 +Bean的生命周期+不同数据类型的注入简析+注入的原理详解+配置文件中不同标签体的使用方式
Spring系列之 配置文件的操作 写在文章前面: 本文带大家掌握Spring配置文件的基础操作以及带领大家理清依赖注入的概念,本文涉及内容广泛,如果各位读者耐心看完,应该会对自身有一个提升 Spri ...