当前位置: 首页 > news >正文

【数据结构C语言】顺序表

1. 线性表

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

2. 顺序表

2.1 概念与结构

概念:顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。

 顺序表和数组的关系是什么?

顺序表的底层就是数组,顺序表是用数组来实现的,两种创建数组的方式:

2.2 分类

2.2.1 静态顺序表

概念:使用定长数组存储元素

2.3 动态顺序表的实现

void SLInit(SL* ps) {ps->arr = NULL;ps->size = ps->capacity = 0;
}

传值和传址操作 

 顺序表初始化:

void SLInit(SL* ps) {ps->arr = NULL;ps->size = ps->capacity = 0;
}

尾插法

扩容realloc操作: 

//尾插
void SLPushBack(SL* ps, SLTDataType x) {if (ps->size == ps->capacity) { // 空间不够,扩容int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;SLTDataType* tmp = (SLTDataType *)realloc(ps->arr, sizeof(SLTDataType) * newCapacity);if (tmp == NULL) {perror("realloc fail!");exit(1);}ps->arr = tmp;ps->capacity = newCapacity;}//空间足够ps->arr[ps->size++] = x;
}

利用调试的监视窗口,监视变量的值从而进行调试。按F5调试,按F5+Ctrl,直接运行,按F10一行行调试,但不进入函数内部,按F11进入函数内部。

头插法:时间复杂度o(n)

// 头插法
void SLPushFront(SL* ps, SLTDataType x)
{assert(ps);SLCheckCapacity(ps);for (int i = ps->size; i > 0; i--) {ps->arr[i] = ps->arr[i-1];}ps->arr[0] = x;ps->size++;
}

 尾删法:时间复杂度o(1)

// 尾删法
void SLPopBack(SL* ps) {assert(ps && ps->size);ps->size--;
}

头删法:o(n)

// 头删法
void SLPopFront(SL* ps) {assert(ps && ps->size);//数据整体向前挪动一位for (int i = 0; i < ps->size-1; i++) {ps->arr[i] = ps->arr[i + 1];}ps->size--;
}

指定位置之前插入:o(n)

// 指定位置之前插入
void SLInsert(SL* ps, int pos, SLTDataType x) {assert(ps);assert(pos >= 0 && pos < ps->size);SLCheckCapacity(ps);for (int i = ps->size; i > pos; i--) {ps->arr[i] = ps->arr[i - 1];}ps->arr[pos] = x;ps->size++;
}

删除pos位置的数据:

// 删除pos位置的数据
void SLErase(SL* ps, int pos) {assert(ps);assert(0 <= pos && pos < ps->size);for (int i = pos; i < ps->size - 1; i++) {ps->arr[i] = ps->arr[i + 1];}ps->size--;
}

销毁顺序表:

void SLDestroy(SL* ps) {if (ps->arr) {free(ps->arr);}ps->arr = NULL;ps->size = ps->capacity = 0;
}

相关算法题:

1. 移除元素

27. 移除元素 - 力扣(LeetCode)

2. 删除有序数组中的重复项

26. 删除有序数组中的重复项 - 力扣(LeetCode)

3. 合并两个有序数组

88. 合并两个有序数组 - 力扣(LeetCode)

http://www.dtcms.com/a/344574.html

相关文章:

  • ZYNQ启动流程——ZYNQ学习笔记11
  • 线性回归学习
  • 消费盲返模式:重构快消行业营销生态的破局之道与风险防控指南
  • 无服务器函数:扩展 Next.js 应用的功能
  • 四十三、【完结篇】消息通知:集成多渠道机器人与邮件通知
  • Android 关于activity-ktx的 by viewModels()踩坑记录与分析
  • 龙蜥Confidential MaaS解决方案如何破解MaaS “黑盒”困局|《AI 进化论》第三期
  • MATLAB:编程入门、多维可视化、时间序列/图像/地图/遥感/点云数据处理及生态模型构建
  • 软件设计师——计算机网络学习笔记
  • 汽车主机厂为何开始押注平台化视觉?
  • 微服务的编程测评系统14-C端题目列表功能-个人中心
  • uniapp使用map打包app后自定义气泡不显示解决方法customCallout
  • Java设计模式--工厂模式:对象创建的魔法工坊
  • GDSFactory环境配置(PyCharm+Git+KLayout)
  • C/C++三方库移植到HarmonyOS平台详细教程(补充版so库和头文件形式)
  • 如何使用navicat连接容器中的mysql数据库
  • 报表工具DevExpress .NET Reports v25.1新版本亮点:AI驱动的扩展
  • Tensorflow、Keras与Python版本兼容性全解析
  • xml中resultMap 的用法,数据库 JSON 字符串 → Java List/对象
  • Build a Webhook for a Chatbot Using Python
  • Python处理JSON数据的最佳实践:从基础到进阶的实用指南
  • 深入理解深度学习中的“Batch”
  • SSM框架基础知识-Spring-Spring整合MyBatis
  • 数据安全——39页解读数字化转型大数据安全基础培训方案【附全文阅读】
  • [react] js容易混淆的两种导出方式2025-08-22
  • 6020角度双环控制一种用于电机控制的策略
  • Numpy模块下的ndarray介绍
  • vscode 插件 远程服务器无法下载
  • Axure下载安装教程(附安装包)Axure RP 11 超详细下载安装教程
  • AI多模态分析框架下的黄金下跌波动:鲍威尔讲话前的政策信号与量化因子共振