大家好我是雷军,今天我们来学习数据结构
今天我们先来说顺序表
顺序表 是一种线性表的存储结构,使用一块连续的存储空间(如数组)来存储线性表中的数据元素。它是一种逻辑结构和存储结构的结合,常用于实现线性表的操作。
特点
连续的存储空间:
顺序表的所有元素都存储在一块连续的内存空间中。
元素之间按照逻辑顺序排列。
随机访问:
由于元素是连续存储的,可以通过索引直接访问任意位置的元素,时间复杂度为 O(1)。
插入和删除的效率:
插入和删除时需要移动元素,效率较低,时间复杂度为 O(n)。
组成
数据元素:
存储在线性表中的每个元素。
容量(Length 或 MaxSize):
表示顺序表最多可以容纳的元素个数。
当前长度(Size 或 CurrentSize):
表示顺序表中实际存储的元素个数。
操作
初始化:
创建一个固定大小的连续存储空间,通常表示为数组。
访问元素:
通过索引直接访问:A[i]。
插入元素:
在指定位置插入一个元素,需要将该位置后的所有元素后移。
时间复杂度:O(n)。
删除元素:
删除指定位置的元素,需要将该位置后的所有元素前移。
时间复杂度:O(n)。
扩容:
如果表已满且需要插入新元素,则需要重新分配更大的存储空间,并将旧数据复制到新空间中。
优缺点
优点:
支持随机访问,访问效率高。
存储密度高,没有额外的指针存储开销。
缺点:
插入和删除操作效率低,特别是当操作靠近表的开头时。
需要连续的存储空间,当存储空间不足时,需要扩容操作。
示例
我有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;
}