线性表--顺序存储结构

我们来仔细回顾一下线性表两种物理结构之一-顺序存储结构。
何谓顺序存储呢?
我们知道,要存放数据,首先得给它分配一个空间,空间就好比一个房间,让它有地方可住。
但是呢,让一个数据有地方可住,这个数据的需求是满足了,但是我的需求没得到满足。我什么需求呢?因为我手里不止这样一个数据,有好多个,我呢,需要给他们每一个都给这样一个空间,也就是让他们每一个都有地方住。
但是问题又来了,如果我给他们找的房间七七八八,零零散散,我是不方便管理的,为什么呢?零零散散的空间就意味着房间号之间没有什么联系,我需要用到它们的时候,我上哪找?
所以,把它们分配到一块连续的空间里面,一个挨着一个,我呢,知道那个范围内是我管理的数据,在这个范围内,我可以随意找到它们当中任何一个。因为我有第一个数据的房间号,属于我管理的房间呢它们是一个挨着一个的。
顺序存储结构
用书上的话来说,就是用一段连续的存储单元一次存放线性表的数据元素。
图解如下
这里写图片描述
结构代码

#define MAXSIZE 100
typedef struct
{
    int data[MAXSIZE];//以int为例
    int length;//线性表当前长度
}SqList;

获取元素

int GetElement(SqList L, int i)
{
    int e;
    //如果表长度为0或者要获取表里小于0大于表长的元素都是错误的
    if (L.length == 0 || i < 1 || i > L.length)
        return 0;
    //我们要的第i个,它的下标为i-1
    return e = L.data[i - 1];
}

插入元素
我们在插入元素的时候,需要判断一下,就和我们获取元素一样,里面没东西获取啥?里面如果满了了往哪儿插?我们定义的MAXSIZE是100,它总有满的时候。

bool Insert_List(SqList * L,int i,int e)//给谁插,插哪,插的是谁
{
    int k;
    if (L->length == MAXSIZE)//满了
        return false;
    if (i < 1 || i > L->length + 1)//插入位置小于0或者大于最大长度
        return false;
    if (i <= L->length)//插入范围对了 同时这个地方不是表的尾
    {
        //那就要把要插入的位置后面的元素先往后移,挪出地方来
        for (k = L->length - 1; k > i; k--)
            L->data[k + 1] = L->data[k];//把k对应的元素放到k+1的地方
    }
    L->data[i - 1] = e;//插入新元素
    L->length++;//长度当然变成了
    return true;
}

删除元素
和插入一样的道理,删除之前,先看删除位置对不对,然后取出我们要删除的元素,把后面的往前挪,表里少了一个元素,相对应长度减一,就是这个思路

bool Delete_List(SqList * L, int i)//删除谁里面的元素,这个元素在哪
{
    int k;
    if (L->length == 0)//里面没东西当然没的删
        return false;
    if (i < 1 || i > L->length)//删除位置小于0或者超出最大范围
        return false;
    if (i <= L->length)//删除位置对但是删的不是最后一个元素
    {
        for (k = i; k < L->length; ++k)//往前挪
            L->data[k-1] = L->data[k];
    }
    L->length--;
    return true;
}

优缺点
优点
我们不需要为了元素之间的逻辑关系增加额外的空间开销
可以快速随机访问,因为是连续存储的嘛
缺点
首先,表有MAXSIZE的限制,如果表的长度变化很大,有可能不够用
其次,我们发现,每次插入和删除的时候,都要挪动大量的数据
其次,比如我从一开始设定的MAXSIZE是100,最后我只用了80,这样一来,就造成了20的空间“碎片”

欢迎大家指出错误。
Lif

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值