顺序表
顺序表的特点#
- 随机访问,在O(1)时间内找到第i个元素
- 存储密度高,每个节点只存放数据元素
- 拓展容量不方便(即便采用动态分配的方式实现,拓展长度的时间复杂度也比较高)
- 插入删除操作不方便,需要移动大量元素
顺序表的定义#
线性表的顺序存储
静态分配的顺序表#
#define Maxsize 10
typedef struct{
ElemType data[Maxsize];
int length;
} SqList;
动态分配的顺序表#
#define MaxSize 10
typedef struct{
ElemType *data;
int MaxSize;
int length;
} SeqList;
动态分配的顺序表经常使用malloc()和free()函数,下面通过初始化和扩充存储空间举例理解:
#include <stdio.h>
#include <stdlib.h>
#define InitSize 10
typedef struct
{
int *data;
int MaxSize;
int length;
} SeqList;
void InitList(SeqList &L);
void IncreaseSize(SeqList &L, int len);
int main()
{
SeqList L;
InitList(L);
IncreaseSize(L, 5);
return 0;
}
void InitList(SeqList &L)
{
L.data = (int *)malloc(InitSize * sizeof(int));
L.length = 0;
L.MaxSize = InitSize;
}
void IncreaseSize(SeqList &L, int len)
{
int *p = L.data;
L.data = (int *)malloc((L.MaxSize + len) * sizeof(int));
for (int i = 0; i < L.length; i++)
{
L.data[i] = p[i];
}
L.MaxSize = L.MaxSize + len;
free(p);
}
使用malloc()函数时,要强制转换类型为和定义的数据类型相对应的同类型的指针,以防止在访问数据元素时出现问题。
顺序表的插入操作#
bool ListInsert(SqList &L, int i, int e)
{
if (i < 1 || i > L.length + 1 || i > MaxSize)
{ //判断插入范围和是否超除了最大值
return false;
}
for (int j = L.length; j >= i; j--)
{
L.data[j] = L.data[j - 1];
}
L.data[i - 1] = e;
L.length++;
return true;
}
这段代码,一开始做健壮性判断时,不能小于一和顺序表当前长度加一,因为顺序表是增加一个元素,所以要加一。for循环判断时,注意j的条件判断是大于等于号,因为要在第i个位置插入时,下一位元素要赋值成当前元素,下一位元素的下标是i,因此要可以等于i。
最好情况时间复杂度:O(1);
最坏情况时间复杂度:O(n);
平均情况时间复杂度:O(n)。
顺序表的删除操作#
bool ListDelete(SqList &L, int i, int &e)
{
if (i < 1 || i > L.length)
{
return false;
}
e = L.data[i - 1];
for (int j = i; j < L.length; j++)
{
L.data[j - 1] = L.data[j];
}
L.length--;
return true;
}
删除操作相对简单。
最好情况时间复杂度:O(1);
最坏情况时间复杂度:O(n);
平均情况时间复杂度:O(n)。
顺序表的按位查找#
int GetElem(SqList L, int i){
return L.data[i - 1];
}
时间复杂度:O(1),体现了顺序表的随机存取。
顺序表的按值查找#
//在顺序表L中查找第一个元素值等于e的元素,并返回其位序
int LocateElem(SqList L, int e)
{
for (int i = 0; i < L.length; i++)
{
if (L.data[i] == e)
{
return i + 1;
}
}
return 0;
}
最好情况时间复杂度:O(1);
最坏情况时间复杂度:O(n);
平均情况时间复杂度:O(n)。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)