静态链表
静态链表是利用一维数组代替指针
在内存中也需要分配一整块连续的内存空间
每个元素都由两个数据域组成
data存储节点中的数据,cur存储后继节点所属的数组元素
cur也称为游标,用来模拟指针。
下标为0 的数组元素可以看做是链表的头结点,其cur域的值用于只是链表第一个数据节点对应的数组下标。
静态链表的插入操作
1.找到一个空闲位置代表新插入的节点,在其中存入数据元素。
2.从头节点开始,找到待插入位置的前一个节点。
3.设置新插入节点的cur值以指向前一个节点所指向的节点,设置前一个节点所指向的节点的cur指向为这个新插入的节点。
4.如果新插入的节点是最后一个节点,要设置其cur标记为末尾。
实现代码
#include <iostream>
using namespace std;
#define MaxSize 201//静态链表的尺寸,可用数组下标为0-200
enum NODEUSE//枚举节点使用情况
{
//这些枚举值都取负值
e_NOUSE = -1,//未使用
e_LAST = -2//最后一个节点
};
//静态链表中每个节点的定义
template <typename T>//T代表数据元素的类型
struct Node
{
T data;//元素数据域
int cur;//游标
};
//静态链表的定义
template <typename T>
class StaticLinkList
{
public:
StaticLinkList();//构造函数
~StaticLinkList();//析构函数
int FindAnIdlePos();//找到一个空闲位置用于存放数据
bool ListInsert(int i, const T& e);//在第i个位置插入指定元素e
bool ListDelete(int i);//删除第i个位置元素
bool GetElem(const T& e);//获得第i个位置的元素值
int LocateElem(const T& e);//获得元素e第一次出现的位置
void DisplayList();//扫描静态链表
int ListLength();//获取静态链表的长度
bool Empty();//判断静态链表是否为空
private:
Node<T> m_data[MaxSize];//保存节点数据的数组
int m_length;//保存数组长度
};
template <typename T>
StaticLinkList<T>::StaticLinkList()//通过构造函数对链表初始化
{
for (int i = 1; i < MaxSize; i++)//从下标1开始的节点用于保存实际的数据,这些节点的cur有必要设置值,而头结点其实不用赋值。
{
m_data[i].cur = e_NOUSE;//标记这些节点都没有使用
}
m_length =