数据结构 1、基本概念 动态数组实现

一、大O表示法

判断一个算法的效率

难点

二、线性表

1.定义

2.数学定义

线性表是具有相同类型的n(n>=0)个数据元素的有限序列(a0,a1,a2,...,an),ai是表项,n是表长度

3.性质

4.线性表的基本操作

1.创建线性表

2.销毁线性表

3.清空线性表

4.将元素插入线性表

5.将元素从线性表中操作

6.将元素从线性表中删除

7.获取线性表中某个位置的元素

8.获取线性表的长度

4.存储方式

4.1 顺序存储

线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素

动态数组案例

当插入一个新的元素时,空间不足?

1.申请一块更大的内存空间

2.将原空间的数据拷贝到新的空间

3.释放旧的空间

4.将元素放入新的空间

三、动态数组代码实现

0、定义动态数组的结构体

//定义动态数组的结构体
typedef struct DYNAMICARRY {
	int* pAddr;//存放数据的地址
	int size;//当前有多少元素
	int capacity;//容量,容器当前最大容纳元素
}Dynamic_Array;

1、动态数组的初始化

//动态数组的初始化
Dynamic_Array* Init_Array() {
	//申请内存
	Dynamic_Array* myArray = (Dynamic_Array*)malloc(sizeof(Dynamic_Array));
	//初始化
	myArray->size = 0;
	myArray->capacity = 20;
	//动态分配内存
	myArray->pAddr = (int*)malloc(sizeof(int) * myArray->capacity);

	return myArray;
}

2、插入新数据

//插入 value 插入的值
void PushBack_Array(Dynamic_Array* arr, int value) {
	//判断数组长度是否为0
	if (arr == NULL) {
		return;
	}
	//判断空间是否足够 capacity记录当前数组空间长度 size==capacity数组已满
	if (arr->size == arr->capacity) {
		//第一步 申请一块更大的内存空间 默认新空间是旧空间的两倍
		int* newSpace = (int*)malloc(sizeof(int) * arr->capacity * 2);
		//第二步 拷贝数据到新的空间 newSpace新空间 arr->pAddr旧空间
		memcpy(newSpace, arr->pAddr, arr->capacity * sizeof(int));
		//第三步 释放旧的内存
		free(arr->pAddr);
		//经过上述步骤 释放完毕
		
		//更新容量 旧空间到新空间
		arr->capacity = arr->capacity * 2;
		arr->pAddr = newSpace;
	}
	//插入元素 size记录当前数组中具体的元素个数
	arr->pAddr[arr->size] = value;
	arr->size++;
}

3、根据元素位置删除

//根据位置删除
void RemoveByPos_Array(Dynamic_Array* arr, int pos) {
	if (arr == NULL) {
		printf("数组为空\n");
		return;
	}
	//判断位置是否有效
	if (pos < 0||pos>=arr->size) {
		printf("数组位置无效\n");
		return;
	}
	else {
		//删除元素 pos是被删除位置 从被删除位置向后遍历 将元素往后更新
		for (int i = pos; i < arr->size-1; i++) {
			arr->pAddr[i] = arr->pAddr[i + 1];
		}
		//当前数组存储元素数减一
		arr->size--;
	}
}

4、根据元素值删除第一次该值出现的位置

//根据值删除value第一次出现的位置
void RemoveByValue_Array(Dynamic_Array* arr, int value) {
	//判空操作
	if (arr == NULL) {
		return;
	}
	//找到值的位置 找到value值在数组arr中第一次出现的位置
	int pos = -1;
	for (int i = 0; i < arr->size; i++)
	{
		if (arr->pAddr[i] == value) {
			pos = i;
			break;
		}
	}
	// 根据value值出现的位置删除位置删除
	RemoveByPos_Array(arr, pos);
}

5、查找

//查找
int Find_Array(Dynamic_Array* arr, int value) {
	//对数组进行判空
	if (arr == NULL) {
		return -1;
	}
	//查找
	//找到值的位置
	int pos = -1;
	for (int i = 0; i < arr->size; i++)
	{
		if (arr->pAddr[i] == value) {
			pos = i;
			break;
		}
	}
	for (int i = 0; i < arr->size; i++)
	{
		if (arr->pAddr[i] == value) {
			pos = i;
			break;
		}
	}
	return pos;
}

6、打印

//打印
void Print_Array(Dynamic_Array* arr) {
	if (arr == NULL) {
		return;
	}
	for (int i = 0; i < arr->size; i++)
	{
		printf("%d ", arr->pAddr[i]);
	}
	printf("\n");
}

7、释放动态数组的内存

//释放动态数组的内存
void FreeSpace_Array(Dynamic_Array* arr) {
	if (arr == NULL) {
		return;
	}
	if (arr->pAddr != NULL) {
		free(arr->pAddr);
	}
	free(arr);
}

8、清空数组

//清空数组
void Clear_Array(Dynamic_Array* arr) {
	if (arr == NULL) {
		return;
	}
	//pAddr指向的空间直接为0
	arr->size = 0;
}

9、获得动态数组的容量capacity

//获得动态数组容量
int Capacity_Array(Dynamic_Array* arr) {
	if (arr == NULL) {
		return -1;
	}
	return arr->capacity;
}

10、获得动态数组当前元素个数

//获得动态数组当前元素个数
int Size_Array(Dynamic_Array* arr) {
	if (arr == NULL) {
		return -1;
	}
	return arr->size;
}

11、根据位置,获得数组中某个位置的元素

//根据位置 获得某个位置的元素
int At_Array(Dynamic_Array* arr, int pos) {
	return arr->pAddr[pos];
}

四、函数测试

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <stdio.h>
#include <limits.h>
#include <ctype.h>
#include <math.h>

#include "动态数组.h"//方法定义在源文件动态数组.c中

//11.12 动态数组
//动态增长内存,将存放的数据放在堆上
//动态数组 申请内存 拷贝数据 释放内存 插入多一个元素
//容量capacity 表示我的这块内存空间一共可以存放多少元素
//size概念 记录当前数组中具体的元素个数

void test01() {
	//初始化一个动态数组
	Dynamic_Array* myArray = Init_Array();
	//打印数组容量
	printf("数组容量:%d\n", Capacity_Array(myArray));
	printf("数组大小:%d\n", Size_Array(myArray));
	//插入元素
	for (int i = 0; i < 30; i++) {
		PushBack_Array(myArray , i);
	}
	printf("数组容量:%d\n", Capacity_Array(myArray));
	printf("数组大小:%d\n", Size_Array(myArray));
	//打印
	Print_Array(myArray);
	//根据位置删除value第一次出现的位置
	RemoveByPos_Array(myArray, 0);
	Print_Array(myArray);
	//根据值删除元素
	RemoveByValue_Array(myArray, 28);
	Print_Array(myArray);
	//打印
	//查找第五个位置的元素
	int pos=Find_Array(myArray,5);
	printf("5查找到:pos:%d %d\n", pos, At_Array(myArray, pos));
	//销毁
	FreeSpace_Array(myArray);
}

int main()
{
	test01();
	system("pause");
	return 0;
}

测试结果

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis集群,你真的学会了吗?

目录 1、为什么引入集群 1.1、先来了解集群是什么 1.2、哨兵模式的缺陷 引入集群解决了什么问题 1.3、使用集群&#xff0c;如何存储数据 2、三种主流的分片方式【经典面试题】 2.1、哈希求余算法 2.1.1、哈希求余算法的介绍 2.1.2、哈希求余算法如何扩容 2.2、一致性…

No193.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

(只需三步)虚拟机上vm的ubuntu不能联上网怎么办

第一步&#xff1a;重启虚拟网络适配器 第二步&#xff1a;删掉网络适配器&#xff0c;重新添加 第三步&#xff1a;重启虚拟机网络服务器 sudo service network-manager stop sudo rm /var/lib/NetworkManager/NetworkManager.state sudo service network-manager start 再打…

eNSP-打开华为USG6000V1防火墙web管理页面方法

一、本地打开防火墙web管理页面 1.先在ensp中启动USG6000V1防火墙&#xff0c;启动后&#xff0c;需要输入原始username和password&#xff08;username&#xff1a;admin&#xff0c;password&#xff1a;Admin123&#xff09;&#xff0c;并修改原始密码后&#xff0c;才能配…

由浅入深学习统计学 -集中趋势的量度

由浅入深学习统计学 -集中趋势的量度 均值 &#xff08;通俗来说是平均数&#xff09; 计算公式 均值在对称数据中才有参考性。 异常数据会导致出现&#xff0c;向左偏移或者向右偏移 中位数 - &#xff08;也是属于平均数的一种&#xff09; 当偏移数据和异常数据使得均值产…

大手笔!吴恩达一口气开放了 3 个 AIGC 教程。。

一个月前&#xff0c;DeepLearning.ai 创始人吴恩达与 OpenAI 开发者 Iza Fulford 联手推出了一门面向开发者的技术教程&#xff1a;ChatGPT 提示工程。 该教程总共分为 9 个章节&#xff0c;总一个多小时&#xff0c;里面主要涵盖&#xff1a;提示词最佳实践、评论情感分类、…

Centos7安装Jenkins

Jenkins官方网址&#xff1a;https://www.jenkins.io/zh/ 关闭防火墙 systemctl stop firewalld && systemctl disable firewalld && iptables -Fsed -i s/enforcing/disabled/ /etc/selinux/config && setenforce 0安装JDK 检索JDK可用包 yum sear…

威海广泰-002111 三季报分析(20231109)

威海广泰-002111 基本情况 公司名称&#xff1a;威海广泰空港设备股份有限公司 A股简称&#xff1a;威海广泰 成立日期&#xff1a;2002-08-30 上市日期&#xff1a;2007-01-26 所属行业&#xff1a;专用设备制造业 周期性&#xff1a;0 主营业务&#xff1a;航空产业、消防产业…

错误:FUNCTION simple_notebook.count does not exist.解决方法

0 引入问题 小王&#xff1a;你这个数据有问题啊&#xff0c;有时候还会报错 小腾&#xff1a;怎么会有问题呢&#xff0c;代码写的一点毛病也没有 小王&#xff1a;没问题怎么会报错&#xff0c;你赶紧看看&#xff0c;项目上线甲方看到了报给老板咱俩就寄了 小腾&#xff1a…

基于LangChain+ChatGLM2-6B+embedding构建行业知识库

目的&#xff1a;最近在探索大模型本地化部署知识库实现行业解决方案&#xff0c;安装过程记录&#xff0c;分享给需要的同学&#xff0c;安装前确定好各组件的版本非常重要&#xff0c;避免重复安装走老路。 经过查阅大量资料&#xff0c;目前可以分为以下两种方案 方案一&am…

【npm 错误】:npm ERR! code ERESOLVE、npm ERR! ERESOLVE could not resolve问题

用过npm的小伙伴都会有这么一个情况出现&#xff0c;就是npm install /npm install xxxx 会出现改一连串的错误&#xff0c;如下&#xff1a; 解决办法&#xff1a; 只要在npm install后面加上--legacy-peer-deps就可以解决问题,安装插件也一样 npm install --legacy-peer-dep…

二、数据运营:B-O价值模型

B - O 价值模型&#xff0c;即 Business - Operation 模型&#xff0c;业务一运营模型。这是一个非常成熟的概念&#xff0c;其变体 BOSS 系统&#xff0c;即 BSS 业务支撑系统和 OSS 运营支撑系统已经在通信运营上使用20多年之久。 B - O 价值模型试图建立起一种通用的业务经…

学习网络编程No.9【应用层协议之HTTPS】

引言&#xff1a; 北京时间&#xff1a;2023/10/29/7:34&#xff0c;好久没有在周末早起了&#xff0c;该有的困意一点不少。伴随着学习内容的深入&#xff0c;知识点越来越多&#xff0c;并且对于爱好刨根问底的我来说&#xff0c;需要了解的知识就像一座大山&#xff0c;压得…

高级运维学习(十六)Prometheus 监控

Prometheus概述 Prometheus是一个开源系统监控和警报工具包&#xff0c;最初由 SoundCloud构建。也是一款监控软件&#xff0c;也是一个时序数据库。Prometheus 将其指标收集并存储为时间序列数据&#xff0c;即指标信息与记录时的时间戳以及称为标签的可选键值对一起存储。主…

python的re正则表达式

华子目录 什么是正则表达式元字符字符集字符集与元字符的综合使用 数量规则指定匹配次数边界处理分组匹配贪婪匹配非贪婪匹配re.S转移字符re.search()re.sub()实例常见的匹配模式 什么是正则表达式 正则表达式是一个特殊的字符序列&#xff0c;它能帮助你方便的检查一个字符串…

SPSS时间序列模型预测

前言&#xff1a; 本专栏参考教材为《SPSS22.0从入门到精通》&#xff0c;由于软件版本原因&#xff0c;部分内容有所改变&#xff0c;为适应软件版本的变化&#xff0c;特此创作此专栏便于大家学习。本专栏使用软件为&#xff1a;SPSS25.0 本专栏所有的数据文件请点击此链接下…

Python 如何实现 Strategy 策略设计模式?什么是 Strategy 策略设计模式?

策略模式&#xff08;Strategy Design Pattern&#xff09;是一种对象行为型设计模式&#xff0c;它定义了一系列算法&#xff0c;并使得这些算法可以相互替换&#xff0c;使得客户端代码可以独立于算法的变化而变化。策略模式属于对象行为模式。 主要角色&#xff1a; 策略接口…

抖音小程序定制开发: 解锁创意,打造独特互动体验

随着抖音平台的崛起&#xff0c;抖音小程序定制开发成为数字创新的关键领域之一。本文将探讨如何通过定制开发&#xff0c;实现独特功能和个性化设计&#xff0c;为用户带来全新的互动体验。 1. 环境搭建 在开始抖音小程序的定制开发之前&#xff0c;首先需要搭建开发环境。…

UBoot

uboot是什么&#xff1f; 嵌入式linux系统启动过程 嵌入式系统上电后先执行uboot、然后uboot负责初始化DDR&#xff0c;初始化Flash&#xff0c;然后将OS从Flash中读取到DDR中&#xff0c;然后启动OS&#xff08;OS启动后uboot就无用了&#xff09;uboot是什么&#xff0c;ubo…

【LeetCode刷题笔记】二叉树(一)

102. 二叉树的层序遍历 解题思路: 1. BFS广度优先遍历 ,使用队列,按层访问 解题思路: 2. 前序遍历 , 递归 ,在递归方法参数中,将 层索引
最新文章