静态链表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;
}



静态链表StaticLinkList的C++实现代码与可用头文件下载,布布扣,bubuko.com

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

上一篇:怎么删除C/C++代码中的所有注释?浅谈状态机的编程思想


下一篇:循环缓存区之C++实现