静态链表的C++实现
静态链表是使用数组实现的可以快速插入和删除数据的链表,静态链表和链式单链表比的缺点在于链表的长度只能初始化设置好,而相对应普通的顺序存储的链表,静态链表不能实现快速的读写任意的元素。
当然静态链表给了我们一种思考方式,当我们在特定状态下,不能使用指针操作时,我们可以使用一种替代指针的方法,静态链表使用的cur来表示当前节点的下一个节点的下标。
【静态链表的C++实现】
#pragma once
#define MAXSIZE 1000template
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
using namespace std;
template
StaticList::StaticList() :Length(0)
{
for (int i = 0;
i < MAXSIZE - 1;
++i)
{
StList[i].cur = i + 1;
}
StList[MAXSIZE - 1].cur = 0;
}template
StaticList::~StaticList()
{}template
bool StaticList::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 = https://www.it610.com/article/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
bool StaticList::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
void StaticList::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
bool StaticList::Full() const
{
if (Length > MAXSIZE - 2)//保证StList[0]和StList[MAXSIZE-1]不被插入数据覆盖
{
return true;
}
return false;
}template
bool StaticList::Empty() const
{
return(Length == 0);
}template
void StaticList::DeleteSpace(int index)
{
StList[index].cur = StList[0].cur;
//将要删除的节点加入到空闲节点最前
StList[0].cur = index;
//把该节点设置成第一个可用的空闲节点
}template
int StaticList::NewSpace()
{
int i = StList[0].cur;
//第一个可用的空闲姐弟那 if (StList[0].cur)//如果该空闲节点可用
{
StList[0].cur = StList[i].cur;
//设置下一次第一个可用的空闲节点为返回节点的下一个节点
}
return i;
//返回可用节点的下标
}
#include "StaticList.cpp"int main()
{
StaticList 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;
}
推荐阅读
- 热闹中的孤独
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- 一个人的旅行,三亚
- 布丽吉特,人生绝对的赢家
- 慢慢的美丽
- 尽力
- 一个小故事,我的思考。
- 家乡的那条小河
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量