数据结构——顺序表

本文介绍了顺序表和链表的基本概念,详细阐述了顺序表的结构设计,包括初始化、增删节点和销毁操作。同时对比了顺序表的存储密度高和插入/删除操作复杂的特点。
摘要由CSDN通过智能技术生成

1、基本概念

  • 顺序表:顺序存储的线性表。
  • 链式表:链式存储的线性表,简称链表。

顺序存储就是将数据存储到一片连续的内存中,在C语言环境下,可以是具名的栈数组,或者是匿名的堆数组。

存储方式不仅仅只是提供数据的存储空间,而是必须要能体现数据之间的逻辑关系。当采用顺序存储的方式来存放数据时,唯一能用来表达数据间本身的逻辑关系的就是存储位置。比如队列中的两个人,小明和小花,如果小明在逻辑上排在相邻的小花的前面,那么在存储位置上也必须把小明存放在相邻的小花的前面。

2、基本操作

顺序表结构体设计

    1. 顺序表总容量
    2. 顺序表当前最末元素下标位置
    3. 顺序表指针

下面是管理结构体示例代码:

typedef struct
{
    int   capacity; // 顺序表容量
    int   last;     // 最末元素下标
    int * data;     // 顺序表,以整型数据为例
}sequenceList;
  • 初始化
    所谓初始化就是建立一个不包含任何元素的顺序表,设置好管理结构体中的表的总容量、末元素下标,申请好顺序表内存空间等系列准备工作。

下面是初始化顺序表的示例代码:

sequenceList * init(int cap)
{
    sequenceList *s = malloc(sizeof(sequenceList));
    if(s != NULL)
    {
        s->capacity = cap;
        s->last = -1;
        s->data = malloc(cap * sizeof(int));

        if(s->data == NULL)
        {
            free(s);
            return NULL;
        }
    }
    return s;
}
  • 增删节点
    在顺序表中增加一个数据,可以有多种方式,比如在原数组的末尾增加,或者在原数组的头部增加,或者在数组中间任意一个位置增加。根据实际需要来定。

下面以在顺序表头部增删数据为例,示例代码如下:

// 判定顺序表是否为空
bool isEmpty(sequenceList *s)
{
    return s->last == -1;
}

// 判定顺序表是否已满
bool isFull(sequenceList *s)
{
    return s->last == s->capacity-1;
}

// 在顺序表表头插入一个新数据
bool insert(sequenceList *s, int data)
{
    if(isFull(s))
        return false;

    // 将原有数据全部往后挪一位
    for(int i=s->last; i>=0; i--)
        s->data[i+1] = s->data[i];
    
    // 将新数据置入表头
    s->data[0] = data;
    s->last++;

    return true;
}

// 将顺序表表头的数据删除掉
bool remove(sequenceList *s)
{
    if(isEmpty(s))
        return false;

    // 将所有数据全部往前挪一位
    for(int i=0; i<s->last; i++)
        s->data[i] = s->data[i+1];
    
    s->last--;
    return true;
}
  • 销毁顺序表
    一个顺序表最后不再需要,应当要释放其所占用的内存空间,这被称为顺序表的销毁。

下面是销毁操作的示例代码:

void destroy(sequenceList *s)
{
    if(s == NULL)
        return;

    free(s->data);
    free(s);
}

 顺序表优缺点总结

顺序存储中,由于逻辑关系是用物理位置来表达的,因此从上述示例代码可以很清楚看到,增删数据都非常困难,需要成片地移动数据。顺序表对数据节点的增删操作是很不友好的。

总结其特点如下:

  • 优点
  1. 不需要多余的信息来记录数据间的关系,存储密度高
  2. 所有数据顺序存储在一片连续的内存中,支持立即访问任意一个随机数据,比如上述顺序表中第i个节点是 s->data[i]
  • 缺点
  1. 插入、删除时需要保持数据的物理位置反映其逻辑关系,一般需要成片移动数据
  2. 当数据节点数量较多时,需要一整片较大的连续内存空间
  3. 当数据节点数量变化剧烈时,内存的释放和分配不灵活
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我不吃辣。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值