六、线性表(3)

原创 2016年08月31日 10:54:18

静态链表

用数组描述的链表叫做静态链表。
对静态链表进行初始化相当于初始化数组:

Status InitList(StaticLinkList space)
{
    int i;
    for(i=0;i<MAXSIZE-1;i++)
    space[i[.cur=i+1;
    space[MAXSIZE-1].cur=0;
    return OK;
}

1、对数组的第一个和最后一个元素做特殊处理,他们的data不存放数据;
2、通常把未使用的数组元素称为备用链表;
3、数组的第一个元素,即下标为0的那个元素的游标就存放备用链表的第一个没有存放数据结点的下标;
4、数组的最后一个元素,即下标为maxsize-1的游标存放第一个有数组的元素的下标。相当于单链表的头结点;

静态链表的插入操作
为了辨明数组中哪些分量未被使用,解决的方法是将所有未被使用过的及已被删除的分量用游标链成一个备用的链表。

Status ListInsert(StaticLinkList L,int i,ElemType e)
{
    int j,k,l;
    k=MAX_SIZE-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;
    }
    return ERROR;
}

如图,原数组为{A,C,D,E}若将B插入A后面,过程如下:
这里写图片描述

静态链表的删除操作
继上一个链表后,删除C元素,过程如图:
这里写图片描述

Status ListDelete(StaticLinkList L,int i)
{
    int j,k;
    if(i<1||i>ListLength(L))
    {
        return ERROR;
    }
    k=MAX_SIZE-1;
    for(j=1;j<=i-1;j++)
    {
        k=L[k].cur;
    }
    j=L[k].cur;
    Free_SLL(L,j);
    return OK;
}
//将下标为k的空闲结点回收到备用链表
void Free_SLL(StaticLinkList space,int k)
{
    space[k].cur=space[0].cur;
    space[0].cur=k;
}

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

静态链表优缺点
优点:

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

缺点:

  • 没有解决连续存储分配(数组)带来的表长难以确定的问题。
  • 失去了顺序存储结构随机存取的特性。
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CystalVon/article/details/52382805
收藏助手
不良信息举报
您举报文章:六、线性表(3)
举报原因:
原因补充:

(最多只允许输入30个字)