顺序表是一种基于数组的数据结构,用于存储一组具有相同类型的元素。顺序表中的元素在内存中是连续存储的,通过索引可以快速访问任意位置的元素。
顺序表的特点包括:
- 连续存储:顺序表中的元素在内存中是连续存储的,通过元素的索引可以计算出元素在内存中的物理地址。
- 快速访问:由于元素连续存储,可以通过索引直接访问任意位置的元素,访问时间复杂度为O(1)。
- 固定大小:顺序表的大小在创建时被确定,并且在运行时无法动态改变,需要预先分配足够的内存空间。
- 插入和删除效率低:在顺序表中插入和删除元素可能需要移动其他元素的位置,导致效率较低,时间复杂度为O(n)。
顺序表的应用场景:
- 数组操作:顺序表可以用于实现各种基于数组的操作,如查找、插入、删除和排序等。
- 线性表:顺序表是线性表的一种实现方式,适用于需要频繁访问和修改元素的场景。
- 算法实现:顺序表常用于算法的实现,如动态规划、贪心算法和分治算法等。
比如:
#include <stdio.h>
#define MAX_SIZE 100 // 最大容量
typedef struct {
int data[MAX_SIZE]; // 存储元素的数组
int length; // 当前长度
} SequentialList;
void initList(SequentialList *list) {
list->length = 0;
}
// 向顺序表末尾插入元素
void insert(SequentialList *list, int element) {
if (list->length >= MAX_SIZE) {
printf("顺序表已满,无法插入元素。\n");
return;
}
list->data[list->length] = element;
list->length++;
}
// 获取指定索引处的元素
int get(SequentialList *list, int index) {
if (index < 0 || index >= list->length) {
printf("无效的索引,无法获取元素。\n");
return -1;
}
return list->data[index];
}
// 删除指定索引处的元素
void removeElement(SequentialList *list, int index) {
if (index < 0 || index >= list->length) {
printf("无效的索引,无法删除元素。\n");
return;
}
for (int i = index; i < list->length - 1; i++) {
list->data[i] = list->data[i + 1];
}
list->length--;
}
// 获取顺序表的当前长度
int getLength(SequentialList *list) {
return list->length;
}
int main() {
SequentialList list;
initList(&list);
insert(&list, 10);
insert(&list, 20);
insert(&list, 30);
printf("顺序表中的元素: ");
for (int i = 0; i < getLength(&list); i++) {
printf("%d ", get(&list, i));
}
printf("\n");
removeElement(&list, 1);
printf("删除元素后的顺序表: ");
for (int i = 0; i < getLength(&list); i++) {
printf("%d ", get(&list, i));
}
printf("\n");
return 0;
}
它定义了一个 SequentialList
结构体,包含一个数组 data
用于存储元素,以及一个 length
变量表示当前长度。
initList
函数用于初始化顺序表,insert
函数用于在顺序表末尾插入元素,get
函数用于获取指定索引处的元素,removeElement
函数用于删除指定索引处的元素,getLength
函数用于获取顺序表的当前长度。
再看up的视频 记录一下今天是2024.3.3 /hfgydx/znkxyjs/2023217~~~/wyt