首页 > 技术文章 > 静态链表

geziyu 2018-11-02 17:11 原文

1、概念:用数组描述的链表称为静态链表,这种描述方法叫做游标实现法。

//线性表的静态链表存储结构
#define MAXSIZE 1000
typedef struct{
    ElemType data;//数据 
    int cur;//游标(cursor) 
}component,StaticLinkList(MAXSIZE); 

2、静态链表—插入元素

//插入操作分两部分组成
//首先是获得空闲分量的下标
int Malloc_SLL(StaticLinkList space){
    int i = space[0].cur;
    if(space[0].cur){
        space[0].cur = spae[i].cur;//把它的下一个分量用来作为备用 
    }
    return i; 
}

//插入操作
Status ListInsert(StaticLinkList L, int i, ElemType e){
    int j,k,l;
    k = MAXSIZE-1;//数组的最后一个元素
    if( i<1 || i>ListLength(L)+1 ) 
        return ERROR;
    j = Malloc_sLL(L);
    if(j){
        L[j].data = e;
        for(l=1;l<=i-1;l++){
            k = L[k].cur;
        }
        L[j].cur = L[k].cur;
        L[k].cur = j;
        return OK;
    }
    else
        return ERROR;
}

 3、静态链表—删除元素

//删除操作
Status ListDelete(StaticLinkList L, int i){//删除第i的位置的元素 
    int j,k;
    if(i<1||i>ListLength(L)+1)
        return ERROR;
    k = MAXSIZE - 1;
    for(j = 1;j <= i-1;j++){
        k = L[k].cur;
    }
    j = L[k].cur;
    L[k].cur = L[j].cur;
    Free_SLL(L,j);
    return OK; 
} 

//将下标为k的空闲结点回收到备用年链表
void Free_SLL(StaticLinkList space, int k){
    sapce[k].cur = space[0].cur;
    space[0].cur = k;
} 

4、返回L中数据元素的个数

//返回L中数据元素的个数
int ListLength(StaticLinkList L){
    int j = 0;
    int i = L[MAXSIZE-1].cur;
    while(i){
        i = L[i].cur;
        j++;
    }
    return j;
} 

总结:静态链表的优缺点

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

缺点:没有解决连续存储分配带来的表长难以确定的问题;失去了顺序存储结构中随机存取得特性。

总的来说:静态链表其实就是为了给没有指针的编程语言设计的一种实现单链表的功能。尽管我们可以使用单链表不用静态链表了,但这样的思考方式是非常巧妙的,应该理解其思想,以备不时之需。

 

推荐阅读