静态链表的头文件以及使用范例与说明的下载地址:
http://download.csdn.net/detail/banana_416432275/6965441
静态链表:用一个包含以下一个元素作为游标的结构体的静态数组,分别模拟成两条链表,一条是存放元素的链表,一条是存放备用区域的链表。数组的首元素纪录备用链表的第一个元素,数组的末元素纪录已存在数据链表的第一个元素。
下面粘出头文件代码,欢迎交流
#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;
}
静态链表的优缺点:
优点:*在插入和删除操作时,只需要修改游标,不需要移动移动元素,从而改进了在顺序存储结构中的插入和删除操作需要移动大量元素的缺点
缺点:*没有解决连续存储分配带来的表长难以确定的问题
*失去了顺序存储结构伴随存取的特性
总的来说,静态链表其实是为了给没有指针的高级语言设计的一种实现单链表能离的方法。尽管大家不一定用得上,但这样得思考方式是非常巧妙得,应该理解其思想,以备不时之需。