对于线性链表,也可用一维数组来进行描述。这种描述方法便于在没有指针类型的高级程序设计语言中使用链表结构
这种存储结构,仍需要预先分配一个较大的空间,但在作为线性表的插入和删除操作时不需移动元素,仅需修改指针,故仍具有链式存储结构的主要优点
#include<iostream>
#define Status int
#define OK 1
#define ERROR 0
#define MAXSIZE 100
template<class ElemType>
struct Component
{
ElemType data; // 数据
int cur; // 游标
};
template<class ElemType>
class StaticLinkList
{
private:
Component<int> L[MAXSIZE]; // 根据需要修改此处<>内类型可使用其他类型的静态链表
public:
Status InitList();
int Malloc_SSL();
Status ListInsert (int i, ElemType e);
void Free_SSL(int k);
Status ListDelete (int k);
int ListLength();
ElemType GetElem(int i);
};
template<class ElemType>
Status StaticLinkList<ElemType>::InitList()
{// 初始化静态链表
int i;
// 循环设置所有的游标进行初始化
for(i = 0; i < MAXSIZE-1; i++)
L[i].cur = i + 1;
// 目前静态链表空,最后一个元素的cur值为0
L[MAXSIZE-1].cur = 0;
return OK;
}
template<class ElemType>
int StaticLinkList<ElemType>::ListLength()
{// 返回长度
int j = 0;
int i = L[MAXSIZE - 1].cur;
while(i)
{
i = L[i].cur;
j++;
}
return j;
}
template<class ElemType>
int StaticLinkList<ElemType>::Malloc_SSL()
{// 开辟备用空间,返回分配结点的下标,失败时返回0;
// 获取当前备用空间下的第一个下标
int i = L[0].cur;
if (L[0].cur)
{// 将已获取的备用空间的一下个空间设为当前备用空间的第一个
L[0].cur = L[i].cur;
}
return i;
}
template<class ElemType>
Status StaticLinkList<ElemType>::ListInsert (int i, ElemType e)
{
int j, k, n;
k = MAXSIZE - 1; // k是最后一个元素的下标
int length = ListLength();
if (i < 1 || i > length + 1 || length >= MAXSIZE - 2)
{
// 第三个条件为链表已满
return ERROR;
}
// 获取备用空间的下标
j = Malloc_SSL();
if(j)
{
L[j].data = e;
// 找到第i个元素之前的位置
for (n = 1; n <= i-1; n++)
{
k = L[k].cur;
}
L[j].cur = L[k].cur;
L[k].cur = j;
}
return ERROR;
}
template<class ElemType>
void StaticLinkList<ElemType>::Free_SSL(int k)
{
// 将第一个元素cur值赋值给要删除的分量cur
L[k].cur = L[0].cur;
// 把要删除的分量下标赋值给第一个元素的cur
L[0].cur = k;
}
template<class ElemType>
Status StaticLinkList<ElemType>::ListDelete (int i)
{
int j, k;
// i不合法时删除失败
if (i < 1 || i > ListLength())
{
return ERROR;
}
k = MAXSIZE - 1;
// 循环至k到要删除的节点前
for(j = 1; j <= i-1; j++)
{
k = L[k].cur;
}
j = L[k].cur;
// 将该节点排出在元素链表之外
L[k].cur = L[j].cur;
// 释放该节点
Free_SSL(L, j);
return OK;
}
template<class ElemType>
ElemType StaticLinkList<ElemType>::GetElem(int i)
{
int n;
int k = MAXSIZE - 1;
if (i < 1 || i > ListLength())
{// 如果i的取值不在范围内返回一个-1
return -1;
}
for (n = 1; n <= i; n++)
{
k = L[k].cur;
}
return L[k].data;
}
#include"StaticLinkList.h"
int main()
{
StaticLinkList<int> L;
if(L.InitList())
{
int n;
for(int i = 1; i <= 3; i++)
{
std::cin >> n;
L.ListInsert(i, n);
}
for(int i = 1; i <= 3; i++)
{
std::cout << L.GetElem(i) << std::endl;
}
}
getchar();
getchar();
return 0;
}