大家好我是雷军,今天我们来学习数据结构

今天我们先来说顺序表

顺序表 是一种线性表的存储结构,使用一块连续的存储空间(如数组)来存储线性表中的数据元素。它是一种逻辑结构和存储结构的结合,常用于实现线性表的操作。


特点

  1. 连续的存储空间

    • 顺序表的所有元素都存储在一块连续的内存空间中。

    • 元素之间按照逻辑顺序排列。

  2. 随机访问

    • 由于元素是连续存储的,可以通过索引直接访问任意位置的元素,时间复杂度为 O(1)。

  3. 插入和删除的效率

    • 插入和删除时需要移动元素,效率较低,时间复杂度为 O(n)。


组成

  1. 数据元素

    • 存储在线性表中的每个元素。

  2. 容量(Length 或 MaxSize)

    • 表示顺序表最多可以容纳的元素个数。

  3. 当前长度(Size 或 CurrentSize)

    • 表示顺序表中实际存储的元素个数。


操作

  1. 初始化

    • 创建一个固定大小的连续存储空间,通常表示为数组。

  2. 访问元素

    • 通过索引直接访问:A[i]。

  3. 插入元素

    • 在指定位置插入一个元素,需要将该位置后的所有元素后移。

    • 时间复杂度:O(n)。

  4. 删除元素

    • 删除指定位置的元素,需要将该位置后的所有元素前移。

    • 时间复杂度:O(n)。

  5. 扩容

    • 如果表已满且需要插入新元素,则需要重新分配更大的存储空间,并将旧数据复制到新空间中。


优缺点

优点:

  1. 支持随机访问,访问效率高。

  2. 存储密度高,没有额外的指针存储开销。

缺点:

  1. 插入和删除操作效率低,特别是当操作靠近表的开头时。

  2. 需要连续的存储空间,当存储空间不足时,需要扩容操作。

示例

我有5辆小米SU7,存在一个顺序表里,这个顺序表是

SU7 = [10,20,40,60,70]

我要查看第三辆小米su7能不能被我遥控,可以通过序号直接查看,SU7[2] = 40

我要遥控一辆新的小米su7插入到第三个位置,那么原来的第三个位置之后的小米su7都会后移一个位置,当我存储了很多小米su7的时候,就要移动很多小米su7,这样导致操作效率比较低

我要插入的小米su7是114,那么新的顺序表就是

SU7 = [10,20,114,40,60,70]

大家看,原本的第三辆以及第三辆后面的小米su7都往后移了,我得一辆一辆的遥控小米su7后移,真麻烦

我现在要遥控一辆小米su7去创死金凡,我现在遥控第四辆小米su7去创人,那么第四辆小米su7就不在这个顺序表里了,我还要遥控后面两辆小米su7往前补。现在的顺序表是

SU7 = [10,20,114,60,70]

下面是我写的一个C语言代码演示

#include <stdio.h>
struct Xiaomi_SU7 {
    int x;
    int size;
};

void Xiaomi_su7_init(struct Xiaomi_SU7 *su7) {
    su7 -> size = 0;
}

void show_su7(struct Xiaomi_SU7 *su7) {
    for (int i = 0; i < su7 -> size; i++) {
        printf("%d ", su7 -> x );
    }
    printf("\n");
}
//遥控一辆小米su7
void insert_su7(struct Xiaomi_SU7 *su7, int x,int pos) {
    if (pos < 0 or pos > su7 -> size) {
        printf("invalid pos");
    } else {
        for (int i = su7 ->size ; i > pos; i--) {
            su7->x[i] = su7->x[i - 1];
        }
        su7->x[pos] = x; // 插入元素
        su7->size++;     // 更新大小
    }
}
//远程遥控小米su7
int remote_ctl(Xiaomi_SU7 *list, int pos) {
    if (list->size == 0) {
        printf("Error: List is empty.\n");
        return -1;
    }
    if (pos < 0 || pos >= list->size) {
        printf("Error: Invalid position.\n");
        return -1;
    }
    for (int i = pos; i < list->size - 1; i++) {
        list->x[i] = list->x[i + 1];
    }
    list->size--;
    return 0;
}