静态链表StaticLinkList的C++实现代码与可用头文件下载


静态链表的头文件以及使用范例与说明的下载地址:

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;
}

静态链表的优缺点:

优点:*在插入和删除操作时,只需要修改游标,不需要移动移动元素,从而改进了在顺序存储结构中的插入和删除操作需要移动大量元素的缺点

缺点:*没有解决连续存储分配带来的表长难以确定的问题

  *失去了顺序存储结构伴随存取的特性


总的来说,静态链表其实是为了给没有指针的高级语言设计的一种实现单链表能离的方法。尽管大家不一定用得上,但这样得思考方式是非常巧妙得,应该理解其思想,以备不时之需。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值