数据结构和算法学习记录——线性表之顺序表(顺序表概念、结构、顺序表接口函数-头插头删、尾插尾删)

简介: 数据结构和算法学习记录——线性表之顺序表(顺序表概念、结构、顺序表接口函数-头插头删、尾插尾删)

线性表的概念

线性表(linear list)是n个具有相同特征的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表: 顺序表、链表、栈、队列、字符串......
线性表在逻辑上线性结构,也就是说 连续的一条直线 。但是在物理结构上 并不一定是连续 的,线性表在物理上存储时,通常是 以数组和链式结构 的形式存储。


顺序表的概念

顺序表是用一段 物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用 数组存储。在数组上完成数据的增删查改。

顺序表是数组,但在数组的基础上,它还要求数据是从头开始连续存储的,不能跳跃间隔。

顺序表的结构

静态顺序表

#define N 100  //存储容量
typedef int SLDataType;  //方便修改存储的数据类型
 
typedef struct SeqList
{
    SLDataType a[N];
    int size;  //表示数组中存储了多少个数据
}SL;
 
//接口函数
void SeqListInit(SL* ps);
void SeqListPushBack(SL* ps, SLDataType x);
void SeqListPopBack(SL* ps);
void SeqListPushFront(SL* ps, SLDataType x);
void SeqListPopFront(SL* ps);
//......

动态顺序表

typedef int SLDataType;  //方便修改存储的数据类型
 
typedef struct SeqList
{
    SLDataType* a;
    int size;  //表示数组中存储了多少个数据
    int capacity;//表示数组实际能存数据的空间容量的大小
}SL;
 
  //接口函数
 
//顺序表初始化
void SeqListInit(SL* ps); 
//检查空间,如果满了,进行增容
void SeqListCheckCapacity(SL* ps);
//顺序表尾插
void SeqListPushBack(SL* ps, SLDataType x);
//顺序表尾删
void SeqListPopBack(SL* ps);
//顺序表头插
void SeqListPushFront(SL* ps, SLDataType x);
//顺序表头删
void SeqListPopFront(SL* ps);
//顺序表查找
int SeqListFine(SL* ps,SLDataType x);
//顺序表在pos位置插入x
void SeqListInsert(SL* ps,size_t pos,SLDataType x);
//顺序表删除pos位置的值
void SeqListErase(SL* ps,size_t pos);
//顺序表销毁
void SeqListDestory(SL* ps);
//顺序表打印
void SeqListPrint(SL* ps);

检查增容

void CheckCapacity(SL* ps)
{
    //如果没有空间或者空间不足,那么就增容
    if(ps->size == ps->capacity)
    {
        int newcapacity = ps->capacity == 0 ? 4 : ps->capacity*2;
        SLDataType* tmp = (SLDataType*)realloc(ps->a,newcapacity*sizeof(SLDataType));
        if(tmp == NULL)
        {
            printf("realloc fail\n");
            exit(-1);
        }
        ps->a = tmp;
        ps->capacity = newcapacity;
    }
}

顺序表尾插

void SeqListPushBack(SL* ps, SLDataType x)
{
    SeqListCheckCapacity(SL* ps);
    ps->a[ps->size] = x;    
    ps->size++;
}

顺序表尾删

void SeqListPopBack(SL* ps)
{
    //温柔处理方式
    //if(ps->size > 0)
    //{
    //    ps->size--;
    //}
    //暴力处理方式
    assert(ps->size > 0);
    ps->size--;
}

顺序表头插

void SeqListPushFront(SL* ps, SLDataType x)
{
    SeqListCheckCapacity(SL* ps);
    //挪动数据
    int end = ps->size - 1;
    while(end >= 0)
    {
        ps->a[end + 1] = ps->a[end];
        end--;
    }
    ps->a[0] = x;
    ps->size++;
}

顺序表头删

void SeqListPopFront(SL* ps)
{
    assert(ps->size > 0);
    //挪动数据
    int begin = 1;
    while(begin < ps->size)
    {
        ps->a[begin - 1] = ps->[begin];
        begin++;
    }
    ps->size--;
}

顺序表查找

int SeqListFine(SL* ps,SLDataType x)
{
    for(int i = 0;i < ps->a[i]size;i++)
    {
        if(ps->a[i] == x)
        {
            return i;
        }
    }
    return -1;
}

顺序表在pos位置插入x

void SeqListInsert(SL* ps,size_t pos,SLDataType x)
{
    assert(pos >=0 && pos <= ps->size);
    //挪动数据
    int end = ps->size - 1;
    while(end >= pos)
    {
        ps->a[end + 1] = ps->a[end];
        end--;
    }
    ps->a[pos] = x;
    ps->size++;
}

顺序表删除pos位置的值

void SeqListErase(SL* ps,size_t pos)
{
    assert(pos >= 0 && pos < ps->size);
    int begin = pos + 1;
    while(begin < ps->size)
    {
        ps->a[begin - 1] = ps->a[begin];
        begin++;
    }
    ps->size--;
}

顺序表销毁

void SeqListDestory(SL* ps)
{
    free(ps->a);
    ps->a = NULL;
    ps->capacity = ps->size = 0;
}
目录
相关文章
|
23小时前
|
存储 算法 搜索推荐
数据结构中的常用算法
数据结构中的常用算法
|
1天前
|
搜索推荐 算法
【排序】数据结构——排序算法概念及代码详解(插入、冒泡、快速、希尔)
【排序】数据结构——排序算法概念及代码详解(插入、冒泡、快速、希尔)
|
1天前
|
存储 算法
【二叉树】数据结构——BST二叉树基本概念及算法设计(插入、删除、遍历操作)
【二叉树】数据结构——BST二叉树基本概念及算法设计(插入、删除、遍历操作)
|
3天前
|
存储 机器学习/深度学习 算法
【数据结构与算法】:手搓顺序表(Python篇)
【数据结构与算法】:手搓顺序表(Python篇)
|
3天前
|
存储 算法 C++
【数据结构与算法】:带你手搓顺序表(C/C++篇)
【数据结构与算法】:带你手搓顺序表(C/C++篇)
|
3天前
|
算法 JavaScript 决策智能
基于禁忌搜索算法的TSP路径规划matlab仿真
**摘要:** 使用禁忌搜索算法解决旅行商问题(TSP),在MATLAB2022a中实现路径规划,显示优化曲线与路线图。TSP寻找最短城市访问路径,算法通过避免局部最优,利用禁忌列表不断调整顺序。关键步骤包括初始路径选择、邻域搜索、解评估、选择及禁忌列表更新。过程示意图展示搜索效果。
|
3天前
|
机器学习/深度学习 算法
基于BP神经网络和小波变换特征提取的烟草香型分类算法matlab仿真,分为浓香型,清香型和中间香型
```markdown 探索烟草香型分类:使用Matlab2022a中的BP神经网络结合小波变换。小波分析揭示香气成分的局部特征,降低维度,PCA等用于特征选择。BP网络随后处理这些特征,以区分浓香、清香和中间香型。 ```
|
5天前
|
机器学习/深度学习 算法
m基于PSO-GRU粒子群优化长门控循环单元网络的电力负荷数据预测算法matlab仿真
摘要: 在MATLAB 2022a中,对比了电力负荷预测算法优化前后的效果。优化前为&quot;Ttttttt111222&quot;,优化后为&quot;Tttttttt333444&quot;,明显改进体现为&quot;Tttttttttt5555&quot;。该算法结合了粒子群优化(PSO)和长门控循环单元(GRU)网络,利用PSO优化GRU的超参数,提升预测准确性和稳定性。PSO模仿鸟群行为寻找最优解,而GRU通过更新门和重置门处理长期依赖问题。核心MATLAB程序展示了训练和预测过程,包括使用&#39;adam&#39;优化器和超参数调整,最终评估并保存预测结果。
15 0
|
6天前
|
算法 安全
基于龙格库塔算法的SIR病毒扩散预测matlab仿真
该程序使用龙格库塔算法实现SIR模型预测病毒扩散,输出易感、感染和康复人群曲线。在MATLAB2022a中运行显示预测结果。核心代码设置时间区间、参数,并定义微分方程组,通过Runge-Kutta方法求解。SIR模型描述三类人群动态变化,常微分方程组刻画相互转化。模型用于预测疫情趋势,支持公共卫生决策,但也存在局限性,如忽略空间结构和人口异质性。
|
6天前
|
机器学习/深度学习 监控 算法
基于yolov2深度学习网络的昆虫检测算法matlab仿真,并输出昆虫数量和大小判决
YOLOv2算法应用于昆虫检测,提供实时高效的方法识别和定位图像中的昆虫,提升检测精度。核心是统一检测网络,预测边界框和类别概率。通过预测框尺寸估算昆虫大小,适用于农业监控、生态研究等领域。在matlab2022A上运行,经过关键升级,如采用更优网络结构和损失函数,保证速度与精度。持续优化可增强对不同昆虫的检测能力。![image.png](https://ucc.alicdn.com/pic/developer-ecology/3tnl7rfrqv6tw_e760ff6682a3420cb4e24d1e48b10a2e.png)

热门文章

最新文章