Static Link List 静态链表
参考:
 
开辟一块数组空间用来在非指针的程序中维护数组链表。
定义:
SLinkList共有MAX个元素,节点是有数据域Data和游标域Cur组成
其中第一个元素节点SLinkList[0]用来记录备用链表的头节点。最后一个节点SLinkList[maxn-1]用来记录链表的头结点。
如果链表头结点的Cur为0,则链表为空。
备用链表节点即是未使用的节点空间。
 
1.Node节点定义
/*静态链表节点元素*/
template < class ElemType >
class Node {
public :
ElemType data ;
int cur ;
};
2.静态链表定义
/*静态链表*/
template < class ElemType >
class StaticLinkList {
public :
void Init (); //初始化链表
bool Insert ( int pos, ElemType e ); //在链表的第pos个位置插入元素
bool Insert ( ElemType e ); //在链表的末尾插入元素
bool Delete ( int pos ); //删除第pos个位置的元素
int Length (); //获取链表的长度
bool Empty (); //判断链表是否为空
void Traverse (); //遍历链表
bool GetElement ( int pos, ElemType & e ); //获取第pos位置的元素
private :
//链表
Node <ElemType > SLinkList [ maxn];
int len ;
//处理备用链表用,分配和回收节点
int Malloc (); //分配备用链表中的一个空位置
void Free ( int pos ); //将位置为pos的空闲节点释放
};
3.初始化链表,链表头结点为空,其余元素连接组成备用链表。
/*初始化静态链表*/
template < class ElemType >
void StaticLinkList < ElemType>:: Init () {
cout << "----Init the Link List----" << endl; //初始化备用链表
for ( int i = 0; i < maxn - 1 ; i ++ )
SLinkList [i ]. cur = i + 1 ; SLinkList [maxn - 2 ].cur = 0 ; //作为备用链表的末尾保护,指向0空 或 可以认为指向循环备用链表的头结点
SLinkList [maxn - 1 ].cur = 0 ; //链表头结点为空
this ->len = 0 ; //链表长度为0
}
4.插入元素
4.1在pos位置插入元素
/*在第Pos个位置插入元素*/
template < class ElemType >
bool StaticLinkList < ElemType>:: Insert ( int pos , ElemType e ) {
cout << "----Insert Element in pos---- -> " << pos << " : " << e << endl; if ( pos < 1 || pos > this-> Length () + 1 )
cout << "----Failed : Input Pos Error----" << endl ; int cur_idx = maxn - 1;
int mac_idx = this ->Malloc (); if ( mac_idx != 0 ) {
SLinkList [mac_idx ]. data = e ; //寻找第pos个元素
for ( int i = 1; i <= pos - 1 ; i ++ )
cur_idx = SLinkList[ cur_idx ].cur ; SLinkList [mac_idx ]. cur = SLinkList [cur_idx ]. cur; //第pos个元素的cur指向 cur_idx之后的元素
SLinkList [cur_idx ]. cur = mac_idx ; //cur_idx指向当前插入对象
this ->len ++;
return true ;
} else
return false ;
}
4.2 插入元素到最后
/*在链表的末尾插入元素*/
template < class ElemType >
bool StaticLinkList < ElemType>:: Insert ( ElemType e ) {
cout << "----Insert Element in back---- -> " << e << endl ; int cur_idx = maxn - 1;
int mac_idx = this ->Malloc (); if ( mac_idx != 0 ) {
SLinkList [mac_idx ]. data = e ; //寻找第pos个元素
for ( int i = 1; i <= this -> Length(); i++ )
cur_idx = SLinkList[ cur_idx ].cur ; SLinkList [mac_idx ]. cur = SLinkList [cur_idx ]. cur; //第pos个元素的cur指向 cur_idx之后的元素
SLinkList [cur_idx ]. cur = mac_idx ; //cur_idx指向当前插入对象
this ->len ++;
return true ;
} else
return false ;
}
5.删除pos位置的元素
/*删除第pos个位置的元素*/
template < class ElemType >
bool StaticLinkList < ElemType>:: Delete ( int pos ) {
cout << "----Delete List from pos---- -> " << pos << endl ; if ( pos < 1 || pos > this-> Length () ) {
cout << "----Failed : Input Pos Error----" << endl ;
return false ;
} int cur_idx = maxn - 1; for ( int i = 1; i <= pos - 1 ; i ++ )
cur_idx = SLinkList[ cur_idx ].cur ; int aim_idx = SLinkList [cur_idx ]. cur;
SLinkList [cur_idx ]. cur = SLinkList [ pos]. cur ;
this ->len --;
Free ( aim_idx );
return true ;
}
6.获取链表的长度
/*获取静态链表的长度*/
template < class ElemType >
int StaticLinkList < ElemType>:: Length () {
//cout << "----Get Link List Length----" << endl;
return len ;
/*
int cur_idx = SLinkList[maxn - 1].cur;
int cnt = 0;
//统计所有元素,直到cur为0
while (cur_idx != 0) {
cur_idx = SLinkList[cur_idx].cur;
cnt++;
}
return cnt;
*/
}
7.判断链表是否为空
/*判断链表是否为空*/
template <class ElemType >
bool StaticLinkList <ElemType >:: Empty() {
return SLinkList [maxn - 1 ].cur == 0 ;
}
8.遍历链表
/*遍历静态链表*/
template < class ElemType >
void StaticLinkList < ElemType>:: Traverse () {
cout << "----Traverse Link List----" << endl;
int cur_idx = SLinkList [maxn - 1 ].cur ;
int idx = 1 ; //输出Node的数据
while ( cur_idx != 0 ) {
cout << "Node " << ( idx++ ) << " : " << SLinkList [cur_idx ]. data << endl ;
cur_idx = SLinkList[ cur_idx ].cur ;
}
}
9.获取第pos位置的元素
/*获取第pos位置的元素*/
template <class ElemType >
bool StaticLinkList <ElemType >:: GetElement( int pos , ElemType & e ) {
if ( pos < 1 || pos > this-> Length () + 1 ) {
cout << "----Failed : Input Pos Error----" << endl ;
return false ;
} int cur_idx = maxn - 1 ; for ( int i = 1; i <= pos ; i++ )
cur_idx = SLinkList [cur_idx ].cur ; e = SLinkList [cur_idx ].data ;
return true ;
}
10.分配备用链表中的一个位置用于插入元素
/*分配备用链表的一个节点*/
template <class ElemType >
int StaticLinkList <ElemType >:: Malloc() {
int cur_idx = SLinkList [0 ].cur ;
if ( cur_idx != 0 ) {
SLinkList [0 ].cur = SLinkList [cur_idx ].cur ;
return cur_idx ;
} else {
cout << "----Failed : Spare Link List is Empty----" << endl;
exit( 0);
} }
11.释放链表中的pos位置,并插入到备用链表中
/*释放pos位置空闲节点*/
template <class ElemType >
void StaticLinkList <ElemType >:: Free( int pos ) {
SLinkList [pos ].cur = SLinkList [0 ].cur ; /*把第一个元素的cur值赋给要删除的分量cur */
SLinkList [0 ].cur = pos ; /* 把要删除的分量下标赋值给第一个元素的cur */
}

12. 测试

int main() {
StaticLinkList<int> sll;
sll.Init();
int e;
for ( int i = 1; i < 10; i++ )
sll.Insert( i, i );
for (int i = 1; i < 10; i++) {
sll.GetElement(i, e);
cout << e << endl;
}
sll.Traverse();
sll.Delete( 3 );
sll.Traverse();
cout << "List Length : " << sll.Length() << endl; return 0;
}

静态链表 Static Link List的更多相关文章

  1. C#数据结构-静态链表

    对于双向链表中的节点,都包括一个向前.向后的属性器用于指向前后两个节点,对于引用类型,对象存储的是指向内存片段的内存指针,那么我们可以将其简化看作向前向后的两个指针. 现在我们将引用类型替换为值类型i ...

  2. Django基础,Day7 - 添加静态文件 static files

    添加css样式文件 1.首先在app目录下创建static文件夹,如polls/static.django会自动找到放在这里的静态文件. AppDirectoriesFinder which look ...

  3. java与数据结构(2)---java实现静态链表

    结点类 1 //结点类 2 class Node<T> { 3 private T data; 4 private int cursor; 5 6 Node(T data, int cur ...

  4. 【Java】 大话数据结构(3) 线性表之静态链表

    本文根据<大话数据结构>一书,实现了Java版的静态链表. 用数组描述的链表,称为静态链表. 数组元素由两个数据域data和cur组成:data存放数据元素:cur相当于单链表中的next ...

  5. Java数据结构-线性表之静态链表

    静态链表的定义: 节点由一个一维数组和一个指针域组成,数组用来存放数据元素,而指针域里面的指针(又称游标)用来指向下一个节点的数组下标. 这种链表称之为静态链表. 链表中的数组第一个和最后一个位置须要 ...

  6. 使用C语言描述静态链表和动态链表

    静态链表和动态链表是线性表链式存储结构的两种不同的表示方式. 静态链表的初始长度一般是固定的,在做插入和删除操作时不需要移动元素,仅需修改指针,故仍具有链式存储结构的主要优点. 动态链表是相对于静态链 ...

  7. 静态导入Static import

    静态导入Static import 要使用静态成员(方法和变量)我们必须给出提供这个静态成员的类. 使用静态导入可以使被导入类的静态变量和静态方法在当前类直接可见,使用这些静态成员无需再给出他们的类名 ...

  8. 静态链表 C语言描述

    静态链表1.下标为0的游标存放最后存放数据节点的游标,即是第一个没有存放元素(备用链表)的下标2.最后一个的节点存放第一个由数值得下标3.第一个和最后一个都不存放数据 即是备用链表的第一个的下标 4. ...

  9. 03静态链表_StaticLinkList--(线性表)

    #include "string.h" #include "ctype.h" #include "stdio.h" #include &qu ...

随机推荐

  1. 如何用Github上传项目中的代码

    第一步: 在Github上创建自己的仓库 第二步:克隆GitHub文件 1:$ git clone  Github文件地址 如:$ git clone https://github.com/wwwxx ...

  2. 【原创】X86_64汇编、寄存器、内嵌汇编

    整理的X86_64/X86汇编.寄存器.C内嵌汇编笔记,主要用于查阅使用. 目录 一.汇编语言 二.指令 数据传输指令 栈操作指令 push pop 运算指令 位操作 比较操作指令 标志寄存器 流控制 ...

  3. 【Linux】linux中用vim来比较文件内容不同

    1. 使用vim的比较模式打开两个文件: vim -d file1 file2 或 vimdiff file1 file2 2. 如果已经打开了文件file1,再打开另一个文件file2进行比较: : ...

  4. oracle 12C单实例打PSU

    前提: oracle不管打什么样的补丁,readme都是很好的参考资料. Oracle每季度都会更新一个最新的PSU,现在12.1.0.2.0的最新的PSU是Patch 26925311. 由于今天白 ...

  5. 一文读懂 TKE 及 Kubernetes 访问权限控制

    你有了解过Kubernetes的认证授权链路吗?是否对TKE的权限控制CAM策略.服务角色傻傻分不清楚?本文将会向你介绍腾讯云TKE平台侧的访问控制.Kubernetes访问控制链路,以及演示如何将平 ...

  6. kafka(二)基本使用

    一.Kafka线上集群部署方案 既然是集群,那必然就要有多个Kafka节点机器,因为只有单台机器构成的kafka伪集群只能用于日常测试之用,根本无法满足实际的线上生产需求. 操作系统: kafka由S ...

  7. 前端知识(二)08-Vue.js的路由-谷粒学院

    目录 一.锚点的概念 二.路由的作用 三.路由实例 1.复制js资源 2.创建 路由.html 3.引入js 4.编写html 5.编写js 一.锚点的概念 案例:百度百科 特点:单页Web应用,预先 ...

  8. Tensorflow-基础使用

    Tensorflow基本概念 使用图(graphs)来表示计算任务 在被称之为会话(Session)的上下文(context)中执行图 使用tensor表示数据 通过变量(Variable)维护状态 ...

  9. 针对Fluent-Bit采集容器日志的补充

    hello,之前我写过<一套标准的ASP.NET Core容器化应用日志收集分析方案>,在公司团队.微信公众号.Github上反映良好. 其中配置Fluent-bit使用Forward协议 ...

  10. java虚拟机入门(二)-探索内存世界

    上节简单介绍了一下jvm的内存布局以及简单概念,那么对于虚拟机来说,它是怎么一步步的让我们能执行方法的呢: 1.首先,jvm启动时,跟个小领导一样会根据配置参数(没有配置的话jvm会有默认值)向大领导 ...