顺序表

顺序表的特点#

  1. 随机访问,在O(1)时间内找到第i个元素
  2. 存储密度高,每个节点只存放数据元素
  3. 拓展容量不方便(即便采用动态分配的方式实现,拓展长度的时间复杂度也比较高)
  4. 插入删除操作不方便,需要移动大量元素

顺序表的定义#

线性表的顺序存储

静态分配的顺序表#

#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)。

posted @   isxh  阅读(120)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示
主题色彩