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

news2024/11/17 21:40:17

一、大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.coloradmin.cn/o/1205217.html

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

相关文章

blockly编程简介

blockly编程简介 blockly是google发布的可视化编程工具&#xff0c;基于web技术构建。 在功能/设计上和MIT的儿童编程语言Scratch类似&#xff0c;采用可视化搭积木编程方式。 可以将基于block程序转化为基于普通文本的常规代码&#xff08;如JavaScript、Python等&#xff…

leetcode:2935. 找出强数对的最大异或值 II【最大异或值还是得看01Trie树啊!】

题目截图 题目分析 排序后&#xff0c;限定了x和y的相对位置 假设y > x&#xff0c;随着y的移动&#xff0c;必须要保证2x > y 所以可以使用滑动窗口维护一堆满足条件的x 这些x的异或值记录在Trie树中即可 ac code class Node:__slots__ children, cntdef __init__(s…

C++ 对象的拷贝、赋值、清理和移动(MyString类)

MyString类 MyString.h #ifndef MYSTRING_H #define MYSTRING_H#include <iostream> using namespace std;class MyString {private:char* str nullptr;unsigned int MaxSize 0;public:MyString(); /*默认构造函数*/MyString(unsigned int n); /*有…

Spring源码系列-Spring AOP

目录 AOP的用法 注解用法 早期的基于接口的用法 递归实现的责任链模式 简单实现 责任链模式就两个关键点 传统的aop实现方式的局限性 Advisor 解决不能精确到方法级别的增强 注解形式的Advisor 解决需要创建多个FactoryBean 纯注解的AOP实现原理 AOP源码解析 AOP…

pta 6翻了 Python3

“666”是一种网络用语&#xff0c;大概是表示某人很厉害、我们很佩服的意思。最近又衍生出另一个数字“9”&#xff0c;意思是“6翻了”&#xff0c;实在太厉害的意思。如果你以为这就是厉害的最高境界&#xff0c;那就错啦 —— 目前的最高境界是数字“27”&#xff0c;因为这…

camera tuning 常识

#灵感# 把收集的乱东西&#xff0c;归在一起。字体颜色标浅色的&#xff0c;是扩展内容&#xff0c;为了先简单了解&#xff0c;并不做很细致的阐述。 &#xff08;1&#xff09;模组 集成封装好的模组&#xff0c;一般由三个部分组成&#xff1a;镜头&#xff08;lens&#…

如何利用反欺诈(羊毛盾)API提升电商平台交易安全性?

前言 近年来&#xff0c;随着网络交易的普及和互联网金融的快速发展&#xff0c;各类网络欺诈事件层出不穷。面对这些问题&#xff0c;电商平台必须采取有效的措施来保障交易安全。而反欺诈&#xff08;羊毛盾&#xff09;API正是一种高效、智能的解决方案&#xff0c;能够帮助…

LeetCode(10)跳跃游戏 II【数组/字符串】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 45. 跳跃游戏 II 1.题目 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nu…

XML Web 服务 Eclipse实现中的sun-jaxws.xml文件

说明 在sun-jaxws.xml文件&#xff0c;可以配置endpoint、handler-chain等内容。在这个文件中配置的内容会覆盖在Java代码中使用注解属性配置的的内容。 这个文件根据自己的项目内容修改完成以后&#xff0c;作为web应用的一部分部署到web容器中&#xff08;放到web应用的WEB…

高效批量剪辑、处理和添加水印,用视频批量剪辑高手轻松搞定!

您是否曾经在处理大量视频时&#xff0c;因为剪辑、处理和添加水印等问题而感到烦恼&#xff1f;是否因为这些问题而大大降低了您的工作效率&#xff1f;现在&#xff0c;我们为您推荐一款全新的视频批量剪辑工具——视频批量剪辑高手&#xff0c;让您的工作效率瞬间翻倍&#…

听10秒语音就能判断糖尿病,这个AI大模型太硬核了!

加拿大的Klick科研人员在顶级健康杂志《梅奥诊所文集&#xff1a;数字健康》上发布了一个AI大模型&#xff0c;只需要听一段6—10秒的语音&#xff0c;就能诊断是否患有2型糖尿病&#xff08;T2DM&#xff09;。 目前糖尿病的主要检测方式依赖于血糖测量&#xff0c;但这种方法…

【06】VirtualService高级流量功能

5.3 weight 部署demoapp v10和v11版本 --- apiVersion: apps/v1 kind: Deployment metadata:labels:app: demoappv10version: v1.0name: demoappv10 spec:progressDeadlineSeconds: 600replicas: 3selector:matchLabels:app: demoappversion: v1.0template:metadata:labels:app…

基于token的多平台身份认证架构设计

1 概述 在存在账号体系的信息系统中&#xff0c;对身份的鉴定是非常重要的事情。 随着移动互联网时代到来&#xff0c;客户端的类型越来越多&#xff0c; 逐渐出现了 一个服务器&#xff0c;N个客户端的格局 。 不同的客户端产生了不同的用户使用场景&#xff0c;这些场景&…

Python实现cpu密集型多线程

问题&#xff1a; 想通过以下代码实现多线程 class ThreadTest(threading.Thread):def __init__(self, num, *args, **kwargs):super(ThreadTest, self).__init__(*args, **kwargs)self.num numprint(num)def run(self):print(self.num)print(time.time())if __name__ &quo…

Git-工作流

前言 一、工作流概述二、Git flow1.主要流程2.优缺点3.适用场景 三、Github flow1.主要流程2.优缺点3.适用场景 四、Gitlab flow1.主要流程2.优缺点3.适用场景 总结参考 一、工作流概述 开发人员通过Git可以记录和追踪代码的变化&#xff0c;包括添加、删除和修改文件。如果是…

贪吃蛇和俄罗斯方块

贪吃蛇 一、创建新项目 创建一个新的项目&#xff0c;并命名。 创建一个名为images的文件夹用来存放游戏相关图片。 然后再在项目的src文件下创建一个com.xxx.view的包用来存放所有的图形界面类&#xff0c; 创建一个com.xxx.controller的包用来存放启动的入口类(控制类) …

C语言精选练习题:(7)计算最大值和最小值的差

每日一言 欲把西湖比西子&#xff0c;淡妆浓抹总相宜。 --饮湖上初晴后雨二首其二 题目 输入10个整数&#xff0c;找出其中的最大和最小值&#xff0c;计算两者的差&#xff0c;并打印出来 解题思路 创建一个数组用循环将10个整数存到数组中用打擂台的方式求出最大和最小值打…

浅谈二叉树

✏️✏️✏️今天给大家分享一下二叉树的基本概念以及性质、二叉树的自定义实现&#xff0c;二叉树的遍历等。 清风的CSDN博客 &#x1f61b;&#x1f61b;&#x1f61b;希望我的文章能对你有所帮助&#xff0c;有不足的地方还请各位看官多多指教&#xff0c;大家一起学习交流&…

讲座录播 | 邹磊教授:图数据库的概念和应用

2023年10月16日 由中国计算机学会主办的 “CCF Talk”直播间 进行了题目为 术语解读:“图计算”的内涵与应用 主题直播活动 讲座吸引7708人观看 图作为一种灵活表达复杂关联关系的数据结构&#xff0c;目前已广泛地应用于社会治理、医疗健康、电网分析、计算材料、计算育…

嵌入式软件工程师面试题——2025校招社招通用(十三)

说明&#xff1a; 面试题来源于网络书籍&#xff0c;公司题目以及博主原创或修改&#xff08;题目大部分来源于各种公司&#xff09;&#xff1b;文中很多题目&#xff0c;或许大家直接编译器写完&#xff0c;1分钟就出结果了。但在这里博主希望每一个题目&#xff0c;大家都要…