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

当然静态链表给了我们一种思考方式,当我们在特定状态下,不能使用指针操作时。我们能够使用一种替代指针的方法,静态链表使用的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. 迅为i.MX6Q嵌入式开发板

    工业级核心板:核心板10层高速PCB设计,充分保证电磁兼容. 01. 处理器:开发板默认是四核商业扩展级芯片,可根据用户需求更换单核.双核.工业级.汽车级处理器,批量更省成本. 02. 扩展引脚:32 ...

  2. bzip2 一种块排序文件压缩软件

    总览 bzip2 [ -cdfkqstvzVL123456789 ] [ filenames ... ] bunzip2 [ -fkvsVL ] [ filenames ... ] bzcat [ - ...

  3. Vue完成TodoList案例

    写一个简单的TodoList的更实用(文末有彩蛋). 一,使用VUE-CLI脚手架快速搭建一个框架 利用VUE-CLI来自动生成我们项目的前端目录及文件,方法: npm install -g vue- ...

  4. 向数据库添加中文数据乱码的解决办法(本文使用spring-jdbcTemplate)

    由于编码字符集的不同通常容易导致数据库中文乱码问题,如显示问号. 往往由以下三个方面所造成的 (一):数据库端字符集设置 1.安装mysql时,会有一个数据库编码设置,将其设置为utf-8 2.先设置 ...

  5. windows下mysql 5.7版本中修改编码为utf-8的方法

    方法如下 首先通过 show variables like 'character_set_%';查看mysql字符集情 默认编码为 latin1 然后关闭数据库 在mysql安装目录下找到my.ini ...

  6. python的学习之路(三)

    一.set集合#!/usr/bin/env python# *_*coding:utf-8 *_*# Author: harson old_dict = { "#1": {'hos ...

  7. linux虚拟环境搭建

    一.virtualenv的安装与使用 1.安装virtualenv pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple virtualen ...

  8. 91-Williams' Percent Range 威廉指标.(2015.7.4)

    Williams' Percent Range 威廉指标 ~计算: %R = (HIGH(i-n)-CLOSE)/(HIGH(i-n)-LOW(i-n))×100 注解:CLOSE: 当前时段的收盘价 ...

  9. LeetCode(30) Substring with Concatenation of All Words

    题目 You are given a string, s, and a list of words, words, that are all of the same length. Find all ...

  10. Windows Server 2012 防火墙如何添加端口例外的方法(转)

    Windows Server 2012 防火墙如何添加端口例外的方法 Windows Server 2012 防火墙如何添加端口例外的方法 在Windows Server 2012系统中,如果用户想在 ...