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. Lock锁 精讲

    1.为什么需要Lock 为什么synchronized不够用,还需要Lock Lock和synchronized这两个最常见的锁都可以达到线程安全的目的,但是功能上有很大不同. Lock并不是用来代替 ...

  2. Java实现RS485串口通信

    前言 前段时间赶项目的过程中,遇到一个调用RS485串口通信的需求,赶完项目因为楼主处理私事,没来得及完成文章的更新,现在终于可以整理一下当时的demo,记录下来. 首先说一下大概需求:这个项目是机器 ...

  3. 使用nodejs和express搭建http web服务

    目录 简介 使用nodejs搭建HTTP web服务 请求nodejs服务 第三方lib请求post 获取http请求的正文 Express和使用express搭建http web服务 express ...

  4. java8 stream api流式编程

    java8自带常用的函数式接口 Predicate boolean test(T t) 传入一个参数返回boolean值 Consumer void accept(T t) 传入一个参数,无返回值 F ...

  5. 关于SSRF与CSRF漏洞的解释

    目录 SSRF服务端请求伪造(外网访问内网) 1.SSRF形成原因 2.利用SSRF漏洞的目的 3.SSRF漏洞的用途 4.SSRF漏洞的特性 实例 5.如何挖掘SSRF漏洞 6.常用SSRF去做什么 ...

  6. kubernets之secret资源

    一  对于一些保密度比较高的文件,k8s又是如何存储的呢? 针对那些保密度比较高的配置文件,例如证书以及一些认证配置不能直接存储在configmap中,而是需要存储在另外一种资源中,需要对存储在里面的 ...

  7. Bagging和Boosting的介绍及对比

    "团结就是力量"这句老话很好地表达了机器学习领域中强大「集成方法」的基本思想.总的来说,许多机器学习竞赛(包括 Kaggle)中最优秀的解决方案所采用的集成方法都建立在一个这样的假 ...

  8. 如何配置 Slf4j

    一,前言 日常开发中经常需要在控制台输出一些信息,如果这些东西不加管理,那么很容易就被输出信息淹没.幸好,我们有日志相关的库来帮助我们格式化控制台的输出. 这篇文章将介绍如何配置 Slf4j 及其具体 ...

  9. OpenDaylight — YANG

    1. 介绍 YANG 是一种用于为 NETCONF 协议建模数据的语言. YANG 将数据的层次结构建模为一棵树. 2. 节点类型 2.1 leaf 它只有一个特定类型的值,并且没有子节点. YANG ...

  10. Android 8.0/9.0 wifi 自动连接评分机制

    前言 Android N wifi auto connect流程分析 Android N selectQualifiedNetwork分析 Wifi自动连接时的评分机制 今天了解了一下Wifi自动连接 ...