静态链表是使用数组实现的能够高速插入和删除数据的链表,静态链表和链式单链表比的缺点在于链表的长度仅仅能初始化设置好,而相相应普通的顺序存储的链表,静态链表不能实现高速的读写随意的元素。

当然静态链表给了我们一种思考方式,当我们在特定状态下,不能使用指针操作时。我们能够使用一种替代指针的方法,静态链表使用的cur来表示当前节点的下一个节点的下标。

#pragma once
#define MAXSIZE 1000 template<typename EleType>
class StaticList
{
public:
typedef struct
{
EleType data;
int cur;
}Node;
StaticList();
~StaticList();
bool Insert(const EleType& e, int index = 1);
bool Delete( EleType& e, int index = 1);
void Show()const;
private:
int NewSpace();//返回list中一个能够用的空间下标
void DeleteSpace(int index);//删除list中的index元素
bool Empty()const;
bool Full()const;
Node StList[MAXSIZE];
int Length;
};
#include "StaticList.h"
#include<iostream>
using namespace std; template<typename EleType>
StaticList<EleType>::StaticList() :Length(0)
{
for (int i = 0; i < MAXSIZE - 1;++i)
{
StList[i].cur = i + 1;
}
StList[MAXSIZE - 1].cur = 0; } template<typename EleType>
StaticList<EleType>::~StaticList()
{ } template<typename EleType>
bool StaticList<EleType>::Insert(const EleType& e, int index /*= 1*/)
{
if (Full())//假设为满,则不插入数据
{
cout << "Can't insert element to a full List!\n";
return false;
}
if (index<1||index>Length+1)//假设插入点的下标不合法,返回false
{
cout << "The invalid index!\n";
return false;
}
int k = NewSpace();//返回一个能够插入的节点的下标
int j = MAXSIZE - 1;
if (k)//假设返回下标不为0
{
StList[k].data = e;//将返回位置的数据设置成e
for (int i = 1; i <= index - 1;++i)//找到插入节点的前一个节点的下标
{
j = StList[j].cur;
}
StList[k].cur = StList[j].cur;//将插入节点的cur设置成插入位置前一个节点的cur
StList[j].cur = k;//将插入位置的前一个节点的cur设置成k,实现把第k个节点插入到index-1个节点后。实现把第K个节点插入到第index个位置
++Length;//链表长度加一
return true;
} return false;
} template<typename EleType>
bool StaticList<EleType>::Delete(EleType& e, int index /*= 1*/)
{
if (Empty())//假设链表为空。不运行删除操作
{
cout << "Can't delete element in a empty list!\n";
return false;
}
if (index<1 || index>Length )//假设删除的位置不合法,返回false
{
cout << "The invalid index!\n";
return false;
}
int k = MAXSIZE - 1;
int i = 1;
for (; i <= index - 1;++i)//找到第index-1个节点k
{
k = StList[k].cur;
}
i = StList[k].cur;//i为第index个节点的下标
StList[k].cur = StList[i].cur;//将第index-1个节点的cur设置成第index个节点的cur,实现了把第index个节点排除在链表之外
e = StList[i].data;//返回第index个节点的data给e
DeleteSpace(i);//回收第index个节点的空间
--Length;//链表长度减一
return true;
} template<typename EleType>
void StaticList<EleType>::Show() const
{
if (Empty())
{
cout << "The List is Empty!\n";
return;
}
int k = StList[MAXSIZE - 1].cur;
cout << "The list is :\n";
for (int i = 1; i <= Length;++i)
{
cout << StList[k].data << " ";
k = StList[k].cur;
}
cout << endl;
} template<typename EleType>
bool StaticList<EleType>::Full() const
{
if (Length > MAXSIZE - 2)//保证StList[0]和StList[MAXSIZE-1]不被插入数据覆盖
{
return true;
}
return false;
} template<typename EleType>
bool StaticList<EleType>::Empty() const
{
return(Length == 0);
} template<typename EleType>
void StaticList<EleType>::DeleteSpace(int index)
{
StList[index].cur = StList[0].cur;//将要删除的节点增加到空暇节点最前
StList[0].cur = index;//把该节点设置成第一个可用的空暇节点
} template<typename EleType>
int StaticList<EleType>::NewSpace()
{
int i = StList[0].cur;//第一个可用的空暇姐弟那 if (StList[0].cur)//假设该空暇节点可用
{
StList[0].cur = StList[i].cur;//设置下一次第一个可用的空暇节点为返回节点的下一个节点
}
return i;//返回可用节点的下标
}
#include "StaticList.cpp"

int main()
{
StaticList<int> TestList;
TestList.Insert(12);
TestList.Insert(12);
TestList.Insert(34); TestList.Insert(23);
TestList.Insert(12); TestList.Insert(99,4);
TestList.Show();
int m = 0;
TestList.Delete(m,7);
cout << "____________" << m << "_______________\n";
TestList.Show();
return 0;
}

静态链表的C++实现的更多相关文章

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

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

  2. 静态链表 C语言描述

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

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

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

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

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

  5. 静态链表实现 (A-B)U(B-A)

    图中黄色部分为(A-B)U(B-A)的实际意义,用结构数组做静态链表来实现该表达式 大致流程是先建立A链表,接着将挨个输入的B中元素在A链表中遍历.如果没找到,就加到A链表结尾下标为endpointe ...

  6. C链表之创建简单静态链表

    C代码: #include<stdio.h> #include<stdlib.h> #include<malloc.h> //创建简单静态链表 typedef st ...

  7. 静态链表实现(A-B)+(B-A)【代码】

    -----------------------------------------------第一次发代码,写在前面------------------------------------------ ...

  8. 静态链表C语言数据结构

    静态链表就是将数组实现单链表: int Malloc_SLL(StaticLinkList space) { int i = space[0].cur;//取得第一个头节点的下标 if( space[ ...

  9. 静态链表的C实现(基于数据结构 严蔚敏)

    静态链表是利用一维数组实现逻辑上的单链表结构,结点的逻辑上相邻但物理位置上不一定相邻,因为内存分配上是一次性的,故称为静态. 特点: 预先需要一片连续的存储空间: 非随机存取: 无现成的"内 ...

  10. c++ 简单静态链表

    所有结点(结构体变量)都是在程序中定义的,不是临时开辟的,也不能用完后释放,这种链表称为静态链表.对各结点既可以通过上一个结点的next指针去访问,也可以直接通过结构体变量名s1, s2, s3去访问 ...

随机推荐

  1. Activiti数据库表结构(表详细版)

    http://blog.csdn.net/hj7jay/article/details/51302829 1  Activiti数据库表结构 1.1      数据库表名说明 Activiti工作流总 ...

  2. (转)淘淘商城系列——使用maven构建工程

    http://blog.csdn.net/yerenyuan_pku/article/details/72669269 开发工具和环境 这里,我统一规范一下淘淘商城的开发工具和环境,如下: Eclip ...

  3. PHP 中 echo 和 print 的区别

    一般来说,PHP中动态输出HTML内容,是通过print 和 echo 语句来实现的,在实际使用中, print 和 echo 两者的功能几乎是完全一样.可以这么说,凡是有一个可以使用的地方,另一个也 ...

  4. MySQL 中去重 distinct 用法

    在使用MySQL时,有时需要查询出某个字段不重复的记录,这时可以使用mysql提供的distinct这个关键字来过滤重复的记录,但是实际中我们往往用distinct来返回不重复字段的条数(count( ...

  5. 浅谈JS之text/javascript和application/javascript

    问题描述: JS在IE8以下浏览器运行异常 代码: <script>标签是这样子写的: <script type="application/javascript" ...

  6. How To:利用frm和idb文件进行数据恢复.txt

    在另外一个机器上准备测试数据,并传输到dbadb05机器的/mysql/backup/reco/位置下.开始尝试恢复数据一.使用mysqlfrm获取表结构信息及DDL语句. [mysql@dbadb0 ...

  7. (3)Gojs model简介

    (3)Gojs model简介 在GoJS中,model用来存储表的基本数据,包括node.link等具体对象和属性,与其在视觉上的展示效果不相关.model中往往只保存相对简单的数据,最方便且持久化 ...

  8. 中南大学2019年ACM寒假集训前期训练题集(基础题)

    先写一部分,持续到更新完. A: 寒衣调 Description 男从戎,女守家.一夜,狼烟四起,男战死沙场.从此一道黄泉,两地离别.最后,女终于在等待中老去逝去.逝去的最后是换尽一生等到的相逢和团圆 ...

  9. 全排列函数 nyoj 366(next_permutation()函数)

    C++ STL中提供了std::next_permutation与std::prev_permutation可以获取数字或者是字符的全排列,其中std::next_permutation提供升序.st ...

  10. CentOS7 Firewall防火墙配置用法详解

    centos 7中防火墙是一个非常的强大的功能了,但对于centos 7中在防火墙中进行了升级了,下面我们一起来详细的看看关于centos 7中防火墙使用方法.   FirewallD 提供了支持网络 ...