静态链表的C++实现

对于线性链表,也可用一维数组来进行描述。这种描述方法便于在没有指针类型的高级程序设计语言中使用链表结构

这种存储结构,仍需要预先分配一个较大的空间,但在作为线性表的插入和删除操作时不需移动元素,仅需修改指针,故仍具有链式存储结构的主要优点

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值