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

数据结构与算法03 顺序表+链表

注意点:

  • 函数的定义中建议增加断言:结构体指针不能为NULL!(空指针不能接引用!)
  • 控制台退出后显示的代码只要不为0,就不是正常退出!
  • Vs中编辑  ->  高级  ->     查看空白  可以查看是空格还是TAB!
  • assert(0 <= pos <= ps->size)不允许这样子写!
  • assert(pos >= 0 && pos <= ps-> size)
  • 缩容指的是释放部分内存,这种方法不行!内存只能整块申请,整块一起释放!

复杂度比较:

  • 头插 / 头删 N个数据的时间复杂度为:O(N^2)
  • 尾插 / 头删 N个数据的时间复杂度为:O(N)

有了中间插入(中间删除)之后,那么头插和尾插(头删和尾删)也就是中间插的另一种形式!

  • 头插法也就是insert在ps->0位置处插入数据;
  • 尾插法也就是insert在ps->size位置处插入数据;
  • 头删法也就是insert在ps->0位置处删除数据;
  • 尾删法也就是insert在ps->size位置处删除数据;

realloc分为两种:原地扩容和异地扩容!

原地扩容:后面的空间没有分配给其他位置!(原地扩容效率非常高!)

异地扩容:找一块空间更大的满足条件的内存空间,将内容拷贝进去,再将原来的空间释放掉!

int main()
{void* ps1 = malloc(10);printf("%p\n", ps1);void* ps2 = realloc(ps1,20);printf("%p\n", ps2);return 0;
}

地址相同!这时即为原地扩容!

int main()
{void* ps1 = malloc(10);printf("%p\n", ps1);void* ps2 = realloc(ps1,200);printf("%p\n", ps2);return 0;
}

此时为异地扩容!

如果realloc申请的空间比malloc申请的小!(官网解释说一般会移动至一个新的空间),但是此时编译器的地址往往不变!

	void* ps1 = malloc(10);printf("%p\n", ps1);void* ps2 = realloc(ps1,200);printf("%p\n", ps2);void* ps3 = realloc(ps2, 5);printf("%p\n", ps3);

可以通过访问空间来验证:

当i = 5的时候,访问会报错,说明申请的空间从20 - 5的时候,虽然地址不变,但是使用权从20个变成5个!

释放时只能全部释放:如果只能释放一部分,那么后面的空间有可能被其他程序使用,此时扩容只能异地扩容 --- >>> 效率降低!

注意点:如果需要写菜单,需要保证之前写的函数的验证没有错误!(在菜单界面中不容易验证函数代码)

练习一:移除数据

. - 力扣(LeetCode)

要求时间复杂度为O(N);

空间复杂度为O(1);

解法一:双指针(在原数组上进行修改)

解法:

int removeElement(int* nums, int numsSize, int val) {int src = 0;int dst = 0;while(src <= numsSize-1){if (nums[src] != val)nums[dst++] = nums[src++];elsesrc ++;}return dst;
}

练习二:去重

删除有序数组中的重复项,保留一个1

. - 力扣(LeetCode)

 

代码如下:

int removeDuplicates(int* nums, int numsSize) {int src = 1;int dst = 0;while(src < numsSize){if (nums[dst] == nums[src]){src ++;}else{nums[++dst] = nums[src++];}}return (dst+1);
}

练习三、合并两个有序数组 

. - 力扣(LeetCode)

解法一:逆向双指针

合并后的元素一共有m+n个,因此dst的坐标为(m+n-1) !

出循环后说明end1和end2比然后一个结束!但是如果是end2结束,那么num1前面的数字不需要进行修改!因此只需要多考虑end2还没有结束的情况!

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {int end1 = m-1;int end2 = n-1;int dst = m+n-1; // 合并后的数组共有m+n-1个有效数字while(end1 >=0 && end2 >=0)   // 两种情况只要有一种即可{if (nums1[end1] < nums2[end2]){nums1[dst--] = nums2[end2--];}else{nums1[dst--] = nums1[end1--];}}while (end2 >= 0){nums1[dst--] = nums2[end2--];}}

顺序表总结:

1、中间头部插入删除数据,效率低下;

2、空间不够,需要扩容,但是扩容会有一点的时间消耗,且在空间上可能造成一定的空间浪费!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 数字化转型专家讲师培训师唐兴通中欧国际工商学院数字化转型战略与实现路径AIGC人工智能数字化战略数字商业模式创新
  • Docker 详解及详细配置讲解
  • Linux安装Jenkins详细步骤分解
  • 前向渲染路径
  • js 查找数组对象中id相同的元素,把他们放到新数组对象中
  • 【系统架构设计师】管道-过滤器架构
  • 【Redis】Redis 主从复制原理与配置详解:解决单点故障与性能瓶颈的最佳方案
  • c++的初始化列表与const成员
  • python(进阶2)实现自动化注册和登录
  • 漫谈设计模式 [17]:状态模式
  • ✨机器学习笔记(二)—— 线性回归、代价函数、梯度下降
  • Windows本地制作nginx证书
  • python中的循环结构
  • MonoHuman: Animatable Human Neural Field from Monocular Video 精读
  • 树莓派5_opencv笔记27:Opencv录制视频(无声音)
  • C# 免费离线人脸识别 2.0 Demo
  • Date型的使用
  • dva中组件的懒加载
  • Intervention/image 图片处理扩展包的安装和使用
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • markdown编辑器简评
  • Python_OOP
  • SpiderData 2019年2月25日 DApp数据排行榜
  • Spring核心 Bean的高级装配
  • V4L2视频输入框架概述
  • windows下mongoDB的环境配置
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 记一次用 NodeJs 实现模拟登录的思路
  • 坑!为什么View.startAnimation不起作用?
  • 前端之React实战:创建跨平台的项目架构
  • 前嗅ForeSpider采集配置界面介绍
  • 前嗅ForeSpider教程:创建模板
  • 如何实现 font-size 的响应式
  • 如何在 Tornado 中实现 Middleware
  • 设计模式 开闭原则
  • 使用权重正则化较少模型过拟合
  • 我的业余项目总结
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​经​纬​恒​润​二​面​​三​七​互​娱​一​面​​元​象​二​面​
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #单片机(TB6600驱动42步进电机)
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (11)MSP430F5529 定时器B
  • (35)远程识别(又称无人机识别)(二)
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (苍穹外卖)day03菜品管理
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (附源码)springboot掌上博客系统 毕业设计063131