数据结构───顺序表(梦开始的地方)

news2024/11/8 2:48:00

  从一个编程小白到入门,大学选的软件工程,从大一开始就没有真正的了解这个专业,更别说以后的发展方向。活了几十年,也不知道自己究竟要成为一个什么样的人。似乎在大二的某一天,忽然意识到我不该如此庸碌下去,是时候该改变和提升自己了。于是我做了两件事,读了两本书,一本《月亮与六便士》,一本《认知觉醒》,第二件事徒步登顶华山。于是我逐渐意识到,我一直是那个呆在山下仰望山顶的人,思想是分阶层的,一旦一个人的思维上了一个维度,就很难再降下去。

  后来我在从零开始的学习过程中,遇到了许多行业精英,编程高手,太多优秀的人以至于自己也想成为一个更好的人。 种一棵树最好的时间是十年前,其次实现。

   我写博客只是便利自己。因为遗忘一种自然现象,在未来的某一天,我一定会对某些东西模糊,这时候就可以回来翻翻自己的博客啦。

 

什么是顺序表? 

简单来说,就是按顺序依次存储简单元素的线性数据结构,数组就是顺序表。其实目前我还不知道除了数组还有哪个数据结构是顺序表emmm。

 如何实现顺序表

   那么创建一个顺序表就是定义一个数组吗?其实不止这些。顺序表不仅要存储数据,得实现数据的增删查改吧。所以就需定义另一个变量,来记录数组的元素下标,来实现以上功能。顺序表就分为两种,一种静态,一种动态。动态就需要多一个变量,来记录当前的最大容量。

typedef int SLDataType;//顺序表要存储的类型
#define N 100
//创建数据结构--顺序表--静态
typedef struct SqeList {
	SLDataType a[N];
	int size;        //记录当前数据个数
}SL;


//创建数据结构--顺序表--动态
typedef struct SqeList {
	SLDataType* a;
	int size;        //记录当前数据个数
	int capacity;    //顺序表最大容量
}SL;

下面就动态顺序表各个功能的实现,因为动态会了,静态自然就会了。

 首先初始化顺序表

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

 然后实现插入元素功能,只要添加数据就需要先检查内存够不够,于是先实现增容功能。

//扩容
void SqeListCheckCapacity(SL* ps) {
	if (ps->size == ps->capacity) {
		int newcapacity = ps->capacity == 0 ? SIZEINIT : 2 * ps->capacity;
		SLDataType* tmp = (SLDataType*)realloc(ps->a, newcapacity * sizeof(SLDataType));
		if (tmp == NULL) {
			perror("no space to use:");
			exit(-1);
		}
		ps->a = tmp;
		ps->capacity = newcapacity;
	}
}
//插入元素
void SqeListInsert(SL* ps, int pos, SLDataType x) {
	SqeListCheckCapacity(ps);
	assert(pos >=0 && pos <= ps->size);
	memmove(ps->a+pos+1, ps->a+pos, (ps->size - pos) * sizeof(SLDataType));
	ps->a[pos] = x;
	ps->size++;
}

 插入功能完成了,那么头插尾插直接调用即可。

//尾部插入一个数据
void SqeListPushBack(SL* ps,SLDataType x) {
	/*SqeListCheckCapacity(ps);
	ps->a[ps->size] = x;
	ps->size++;*/

	SqeListInsert(ps, ps->size, x);
}
//顶部插入一个数据
void SqeListPushFront(SL* ps,SLDataType x) {
	//SqeListCheckCapacity(ps);
	//int end = ps->size - 1;
	//while (end >= 0) {
	//	ps->a[end + 1] = ps->a[end];
	//	end--;                  
	//}
	//ps->a[0] = x;
	//ps->size++;
	SqeListInsert(ps, 0,x);
}

 删除元素的话,只要将要删除的元素覆盖掉,可以使用memmove函数,当然也可以写个循环一个一个的移。

//删除尾部数据
void SqeListPopBack(SL* ps) {
	assert(ps->size > 0);
	ps->size--;
}
//删除顶部数据
void SqeListPopFront(SL* ps) {
	assert(ps->size > 0);
	//法一:
	//int begin = 1;
	//while (begin > ps->size) {
	//	ps->a[begin - 1] = ps->a[begin];
	//	begin++;
	//}
	//ps->size--;
	//法二:
	memmove(ps->a, ps->a + 1, (ps->size - 1) * sizeof(SLDataType));
	ps->size--;
}

 接下来实现一下查找,直接暴力枚举,遍历一遍顺序表所有元素。

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

对于修改功能,直接赋值就好啦。还有排序功能,各种排序方法,因地适宜。最后也是最重要的,用realloca开辟的空间要归还,避免内存遗漏 ,养成好习惯,同时也将指针赋空。

//顺序表销毁
void SqeListDestory(SL* ps) {
	free(ps->a);
	ps->a = NULL;
	ps->size = ps->capacity = 0;
}

这就是一个简单动态顺序表的实现了。检验所学知识当然就是刷题啦

直接打开leetcode找到数组一栏,对于初学者就从简单开始。1. 两数之和 - 力扣(LeetCode)

 题目要求在一个数组中返回两个数的下标,这两个数相加等于目标值。对于没有接触高阶算法的我来说,直接暴力枚举就好啦,如果相等就返回两数下标。


int* twoSum(int* nums, int numsSize, int target, int* returnSize){
    *returnSize=2;
    int*pc=(int*)malloc(2*sizeof(int));
    for(int i=0;i<numsSize;i++){
        for(int j=i+1;j<numsSize;j++){
            if(nums[i]+nums[j]==target){
                *pc=i;
                *(pc+1)=j;
                return pc;
            }
        }
    }
    return NULL;

}

  由于接收端会释放内存,我就不用释放了,对于初学者能过就行啦,好了,完成第一题现在我也是刷过leetcode的人了,但想要不断巩固和熟练掌握所学内容,就采用刷题的方式,因为每一次通过就是给自己一次的正向反馈,等自己知识储备一定多的时候,再返回来试着用不同的方法解决,优化时间复杂度和空间复杂度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1114700.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

对话 L2 潜力新星 Mantle:模块化理念推动生态可持续建设

作为一个由 DAO 主导实现快速增长&#xff0c;致⼒推动⼤众应⽤与数字虚拟资产治理技术—— Mantle 如何凭借模块化设计理念、可扩展性技术优势、高效能数据处理机制在 Layer2 版图中成长为新晋潜力项目&#xff1f;从测试网到主网上线&#xff0c;Mantle 经历了数个技术更新阶…

【(数据结构)— 双向链表的实现】

&#xff08;数据结构&#xff09;— 双向链表的实现 一.双向链表的结构二. 双向链表的实现2.1 头文件 ——双向链表的创建及功能函数的定义2.2 源文件 ——双向链表的功能函数的实现2.3 源文件 ——双向链表功能的测试2.4 双向链表各项功能测试运行展示2.4.1 双向链表的初始化…

发现一不错的编程助手 Amazon CodeWhisperer

Amazon CodeWhisperer 是一款 AI 编程助手&#xff0c;旨在为开发人员提供智能化的编程辅助工具。作为一款基于人工智能的编程助手&#xff0c;CodeWhisperer 的目标是提高开发人员的生产效率、降低开发成本&#xff0c;并提供高质量的编程解决方案。 1.安装过程参考官网 htt…

C++11函数适配器bind() --- C++11新语法bind() 你了解多少?什么是适配器???

文章目录 1.介绍头文件定义原型 2.引入2.1现有语法无法解决2.2bind的文档阅读2.3bind()绑定函数对于2.1问题的解决 1.介绍 头文件 #include <functional> 定义 bind函数定义在头文件中&#xff0c;是一个函数模板&#xff0c;它就像一个函数包装器(适配器)&#xff0c…

苹果 AirPods Pro 2 耳机新固件(6A305)

苹果公司对采用 Lightning 端口和 USB-C 端口的 AirPods Pro 2 耳机&#xff0c;推出了内部编号为 6A305 的全新固件&#xff0c;高于 10 月 10 日发布的 6A303 更新。用户无需手动更新&#xff0c;只需将 AirPods 通过蓝牙连接到 iPhone &#xff0c;此时便会自动安装新的固件…

甄知科技张礼军:数智化转型助企业破茧成蝶!

数智化浪潮滚滚向前&#xff0c;正席卷各行各业&#xff0c;带领企业从数字化时代跨入数智化时代。可什么是数智化&#xff1f;如何实现数智化转型&#xff1f;已经成为横亘在无数企业面前的大难题&#xff01; 事实上&#xff0c;数智化是数字化、AI和业务三个要素的交集&…

SQLServe联合主键、联合索引、唯一索引,聚集索引,和非聚集索引、主键、唯一约束和外键约束、索引运算总结

联合主键 SQL server 中给表增加联合主键的两种方法 第一种方法&#xff0c;新建表时增加联合主键&#xff1a; create table t_students(id int not null,name varchar(10) not null Primary Key (id, name),age int,dept_id int )注&#xff1a;联合主键的列需要限制非空约…

操作系统【OS】系统调用

系统调用 定义 操作系统对应用程序和程序员提供的接口用户程序执行陷入指令&#xff08;Trap或访管指令&#xff09;来发起系统调用&#xff0c;请求操作系统提供服务OS 通过提供系统调用避免用户程序直接访问外设【应用程序通过系统调用使用OS的设备管理服务】操作系统不同, …

弹出框,使用树结构查询数据

效果如下: 描述:希望点击某个按钮,弹出一个窗口,然后通过下拉框,点击下拉框里面的组织信息,然后查询对应组织的成员对象列表,并展示到表格中 HTML代码(最主要的就是树的那个): <el-dialog :visible.sync="TesteePage.showDialog" width="70%&quo…

初出茅庐的小李博客之Windows11运行Linux记录

安装教程 超简单&#xff0c;不安装虚拟机&#xff0c;Windows11运行Linuxhttps://zhuanlan.zhihu.com/p/393484912 注意事项 出现错误有可能是少了驱动 驱动下载地址 https://link.zhihu.com/?targethttps%3A//wslstorestorage.blob.core.windows.net/wslblob/wsl_updat…

bp(back propagation)

文章目录 定义过程前向传播计算过程计算损失函数&#xff08;采用均方误差MSE&#xff09;反向传播误差&#xff08;链式法则&#xff09;计算梯度更新参数 简单实例 定义 反向传播全名是反向传播误差算法&#xff08;Backpropagation&#xff09;&#xff0c;是一种监督学习方…

HZOJ-271: 滑动窗口

题目描述 ​ 给出一个长度为 N&#xfffd; 的数组&#xff0c;一个长为 K&#xfffd; 的滑动窗口从最左移动到最右&#xff0c;每次窗口移动&#xff0c;如下图&#xff1a; 找出窗口在各个位置时的极大值和极小值。 输入 ​ 第一行两个数 N,K&#xfffd;,&#xfffd;。 …

win yolov5.7 tensorRT推理

安装TensorRT 下载tensorrt8.xx版本&#xff0c;适用于Windows的cuda11.x的版本 官方下载地址https://developer.nvidia.com/nvidia-tensorrt-8x-download 把tensorRT里面的bin、include、lib添加到本机CUDA中&#xff0c;CUDA需要加入环境变量中 配置虚拟环境 torch的版本…

Confluence最新版本(8.6)安装

软件获取 Confluence 历史版本下载地址&#xff1a;Confluence Server 下载存档 | Atlassian Atlassian-agent.jar https://github.com/haxqer/confluence/releases/download/v1.3.3/atlassian-agent.jar MySQL 驱动包 MySQL :: Download MySQL Connector/J (Archived Ve…

举个栗子!Alteryx 技巧(6):从 API 中提取数据

你听说过从 API 中提取数据吗&#xff1f;API 是指应用编程接口&#xff0c;是计算机之间或计算机程序之间的连接&#xff0c;它是一种软件接口&#xff0c;让不同的软件进行信息共享。对于很多数据分析师来说&#xff0c;他们常常需要从 API 中提取数据&#xff0c;那么如何快…

ASEMI肖特基二极管MBR10200CT在电子电路中起什么作用

编辑-Z 肖特基二极管MBR10200CT是一种特殊类型的二极管&#xff0c;可以在电子电路中起到多种作用。 首先&#xff0c;MBR10200CT具有非常低的正向电压丢失和快速的开关速度。这使得它非常适合用作整流器。在直流电源中&#xff0c;MBR10200CT可以将交流电转换为直流电&#x…

漏洞复现--蓝凌EIS智慧协同平台任意文件上传

免责声明&#xff1a; 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

【LCR 159. 库存管理 III】

目录 一、题目描述二、算法原理三、代码实现 一、题目描述 二、算法原理 三、代码实现 class Solution { public:int getrandom(int left,int right,vector<int>& stock){return stock[rand()%(right-left1)left];}void qsort(int l,int r,vector<int>& s…

【uni-app+vue3】分享功能,App端调用手机的系统分享,可分享到微信、QQ、朋友圈等,已实现

前言&#xff1a; uniapp分享功能&#xff0c;之前考虑的思路一直都是如何使用uni.share()实现 需要下载插件&#xff0c;需要申请微信appid&#xff0c;插件已下载&#xff0c;主要就是没有appid&#xff0c;所以只好换方向 实现效果&#xff1a; 在需要分享的页面&#xff0c…

嵌入式学习笔记(59)内存管理之栈

1.6.1.什么是栈&#xff08;Stack&#xff09; 栈是一种数据结构&#xff0c;C语言中使用栈来存放局部变量。 1.6.2.栈管理内存的特点&#xff08;小内存、自动化&#xff09; 先进后出 FILO&#xff08;First In Last Out&#xff09; 栈 先进先出 FIFO&#xff08;First …