当前位置: 首页 > 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.xdnf.cn/news/1343917.html

相关文章:

  • 四十一、【高级特性篇】API 文档驱动:OpenAPI/Swagger 一键导入测试用例
  • Design Compiler:层次模型(Block Abstraction)的简介
  • memcmp 函数的使用及其模拟实现
  • 数学建模--Topsis
  • 分布式与微服务
  • [特殊字符] 潜入深渊:探索 Linux 内核源码的奇幻之旅与生存指南
  • LeetCode Hot 100 第一天
  • 相机曝光调节与自动曝光控制详解
  • AI适老服务暖人心:AI适老机顶盒破数字鸿沟、毫米波雷达护独居安全,银发生活新保障
  • 初识数据结构——Map和Set:哈希表与二叉搜索树的魔法对决
  • 车载以太网SOME/IP协议:面向服务的汽车通信技术详解
  • python-对图片中的人体换背景色
  • Java面试宝典:Redis底层原理(持久化+分布式锁)
  • 机器学习-线性回归
  • [react] class Component and function Component
  • vsCode或Cursor 使用remote-ssh插件链接远程终端
  • 用户登录Token缓存Redis实践:提升SpringBoot应用性能
  • yggjs_rlayout使用教程 v0.1.0
  • unistd.h 常用函数速查表
  • 【Linux仓库】进程的“夺舍”与“飞升”:exec 驱动的应用现代化部署流水线
  • Elasticsearch倒排索引和排序
  • Elasticsearch核心概念
  • 【机器学习深度学习】大模型分布式推理概述:从显存困境到高并发挑战的解决方案
  • 用sftp协议实现对文件的上传下载
  • 高压、高功率时代,飞机电气系统如何保障安全?
  • PDF文档安全升级:三招实现文本转曲线(防篡改+高清输出)
  • 一分钟docker部署onlyoffice 在线预览word pdf excel...
  • 嵌入式第三十五天(网络编程)
  • week3-[二维数组]最大列
  • WindowsAPI|每天了解几个winAPI接口之网络配置相关文档Iphlpapi.h详细分析9