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

数据结构(1)--> 顺序表

定义:

顺序表存储定义: 把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构,顺序表功能的实现借助于数组,通过对数组进行封装,从而实现增删查改的功能,严格意义上来说(数组无法实现删除数据的功能)。

#define _CRT_SECURE_NO_WARNINGS 1
#include"seqlist.h"void initseqlist(SL* p) {assert(p);p->arr = NULL;p->capacity = p->size = 0;
}void printseqlist(SL* p) {for (int i = 0; i < p->size; i++) {printf("%d ", p->arr[i]);}printf("\n");
}void checkcapacity(SL* p) {assert(p);if (p->capacity == p->size) {int newcapacity = p->capacity == 0 ? 4 : 2 * p->capacity;// if here use malloc,the origin data in this array might be missing int* temp = (int*)realloc(p->arr,sizeof(int) * newcapacity);p->arr = temp;p->capacity = newcapacity;}
}void pushFront(SL* p, int val) {assert(p);checkcapacity(p);int end = p->size - 1;while (end >= 0) {p->arr[end + 1] = p->arr[end];end--;}p->arr[0 ] = val;p->size++;
}void pushback(SL* p,int val) {//assert(p);checkcapacity(p);p->arr[p->size] = val;p->size++;
}void popfront(SL* p) {assert(p);int n = p->arr[0];printf("将要被pop元素=%d\n", n);for (int i = 1; i < p->size ; i++) {p->arr[i - 1] = p->arr[i];}p->size--;
}void insertanyposition(SL* p, int pos, int val) {assert(p);assert(pos >= 0 && pos <= p->size);int end = p->size - 1;while (end>=pos) {p->arr[end + 1] = p->arr[end];end--;}p->arr[pos] = val;p->size++;
}int findDataPos(SL* p, int val) {assert(p);for (int i = 0; i < p->size; i++) {if (p->arr[i] == val) {return i;}}return -1;
}

1、顺序表的初始化:

typedef struct seqlist {int* arr;int size;int capacity;
}SL,*PTR;void initseqlist(SL* p) {assert(p);p->arr = NULL;p->capacity = p->size = 0;
}

 

2、顺序表容量检测:

当我们要对表里进行相关操作的时候,第一步检测当下该表中size 与 容量的关系,可以写一个checkcapacity函数。

void checkcapacity2(SL* p) {assert(p);if (p->capacity == p->size) {int newcapacity = p->capacity == 0 ? 4 : 2 * p->capacity;int* temp = (int*)malloc(sizeof(int) * newcapacity);p->arr = temp;p->capacity = newcapacity;}
}void test3() {PTR p;SL sl;p = &sl;initseqlist(p);pushback(p, 5);//first init  ---> size=4,capacity=4pushback(p, 15);pushback(p, 25);pushback(p, 35);pushback(p, 45);printseqlist(p);}

这个时候来看一下打印结果:

为什么会这样呢,这个时候我们就需要借助调试工具来找出问题所在

所以我们该处可以用realloc 函数 来进行动态内存管理:

void checkcapacity(SL* p) {assert(p);if (p->capacity == p->size) {int newcapacity = p->capacity == 0 ? 4 : 2 * p->capacity;// if here use malloc,the origin data in this array might be missing int* temp = (int*)realloc(p->arr,sizeof(int) * newcapacity);p->arr = temp;p->capacity = newcapacity;}
}

 

 

3、顺序表插入数据:

3.1头插:

void pushFront(SL* p, int val) {assert(p);checkcapacity(p);int end = p->size - 1;while (end >= 0) {p->arr[end + 1] = p->arr[end];end--;}p->arr[0 ] = val;p->size++;
}

 

 

3.2尾插:

void pushback(SL* p,int val) {//assert(p);checkcapacity(p);p->arr[p->size] = val;p->size++;
}

4、顺序表删除数据:

4.1头删

void popfront(SL* p) {assert(p);int n = p->arr[0];// 可以起到记录作用printf("将要被pop元素=%d\n", n);for (int i = 1; i < p->size ; i++) {p->arr[i - 1] = p->arr[i];}p->size--;
}

 

4.2尾删

5、任意位置实现插入功能:

void insertanyposition(SL* p, int pos, int val) {assert(p);assert(pos >= 0 && pos <= p->size);int end = p->size - 1;while (end>=pos) {p->arr[end + 1] = p->arr[end];end--;}p->arr[pos] = val;p->size++;
}

6、顺序表中实现查找功能:

int findDataPos(SL* p, int val) {assert(p);for (int i = 0; i < p->size; i++) {if (p->arr[i] == val) {return i;}}return -1;
}

http://www.lryc.cn/news/289237.html

相关文章:

  • 排序算法经典模型: 梯度提升决策树(GBDT)的应用实战
  • 【揭秘】ForkJoinTask全面解析
  • 如何利用数据压缩提高高性能存储的效率?
  • 前端工程化之:webpack1-2(安装与使用)
  • MySQL索引类型及数据结构【笔记】
  • 成熟的内外网数据交换方案,如何实现跨网传输?
  • python11-Python的字符串之repr
  • python小项目:口令保管箱
  • 微认证 openEuler社区开源贡献实践
  • 紫光展锐M6780丨超分辨率技术——画质重构还原经典
  • 《Python 简易速速上手小册》第6章:Python 文件和数据持久化(基于最新版 Python3.12 编写)
  • 华为机考入门python3--(4)牛客4-字符串分隔
  • Unity MonoBehaviour 生成dll
  • 基于Python flask MySQL 猫眼电影可视化系统设计与实现
  • 【新课上架】安装部署系列Ⅲ—Oracle 19c Data Guard部署之两节点RAC部署实战
  • gdb调试std::list和std::vector等容器的方法
  • python stomp 转发activemq topic消息
  • Spring Boot使用AOP
  • C语言通过IXMLHttpRequest以get或post方式发送http请求获取服务器文本或xml数据
  • QtRVSim(二)一个 RISC-V 程序的解码流程
  • x-cmd pkg | httpx - 为 Python 设计的下一代 HTTP 客户端库
  • 代码随想录算法训练营第四十二天(动态规划篇)|62. 不同路径
  • YOLO 全面回顾:从最初的YOLOv1到最新的YOLOv8、YOLO-NAS,以及整合了 Transformers 的 YOLO
  • Android双指缩放ScaleGestureDetector检测放大因子大图移动到双指中心点ImageView区域中心,Kotlin(2)
  • 同为科技(TOWE)自动控制循环定时插座
  • 游戏设计模式
  • CUBEMX与FreeRTOS在Arm Compiler 6下的配置方法
  • Android Studio 提示Use app:drawableStartCompat instead of android:drawableStart
  • C# wpf 实现任意控件(包括窗口)更多调整大小功能
  • Vue+OpenLayers7入门到实战:快速搭建Vue+OpenLayers7地图脚手架项目。从零开始构建Vue项目并整合OpenLayers7.5.2