首页 > 其他分享 >数据结构-2. 动态数组1

数据结构-2. 动态数组1

时间:2024-07-25 17:18:21浏览次数:17  
标签:动态 capacity int void pAddr 数组 array 数据结构 size

动态数组设计

struct dynamicArray
{
	void** pAddr;  //维护真实在堆区创建的数组的指针

	int m_capacity; //数组容量

	int m_size; // 数组大小
};

数组初始化

struct dynamicArray * init_DynamicArry(int capacity)
{
	if (capacity <= 0)
	{
		return NULL;
	}

	//给数组分配空间

	struct dynamicArray * array = malloc(sizeof(struct dynamicArray));
	if (array == NULL)
	{
		return NULL;
	}
	
	array->pAddr = malloc(sizeof(void * ) * capacity);
	array->m_capacity = capacity;
	array->m_size = 0;

	return array;
}

插入数组

void insert_DynamicArray(struct dynamicArray* array, int pos, void* data)
{
	if (array == NULL)
	{
		return;
	}
	if (data == NULL)
	{
		return;
	}

	//无效位置 尾插
	if(pos < 0 || pos > array->m_size)
	{
		pos = array->m_size;
	}
	//判断是否满了,满了就动态扩展
	if (array->m_size == array->m_capacity)
	{
		// 申请更大空间
		int newCapacity = array->m_capacity * 2;
		
		// 创建新空间
		void ** newSpace = malloc(sizeof(void*) * newCapacity);
		
		//将原有数据拷贝到新空间下
		memcpy(newSpace, array->pAddr, sizeof(void*) * array->m_capacity);
		
		//释放原有内存
		free(array->pAddr);
		
		//更新新空间指向
		array->pAddr = newSpace;
		
		//更新新容量
		array->m_capacity = newCapacity;

	}

	//插入新元素

	//移动元素 进行插入新元素
	for (int i = array->m_size -1; i >= pos; i--)
	{
		// 数据向后移动
		array->pAddr[i + 1] = array->pAddr[i];

	}
	// 将新元素插入到指定位置上
	array->pAddr[pos] = data;
	//更新大小
	array->m_size++;
}

遍历数组

void foreach_DynamicArray(struct dynamicArray* array, void (*myPrint)(void*))
{
	if (array == NULL)
	{
		return;
	}
	if (myPrint == NULL)
	{
		return;
	}
	for (int i = 0; i < array->m_size; i++)
	{
		myPrint(array->pAddr[i]);
	}
}

标签:动态,capacity,int,void,pAddr,数组,array,数据结构,size
From: https://www.cnblogs.com/ffff5/p/18323708

相关文章

  • 【2024-ZR-C Day 8】动态规划(2):状压 DP、数位 DP
    【2024-ZR-CDay8】动态规划(2)1.状压DP1.1.子集枚举for(ints=m;s;s=(s-1)&m);1.2.状态压缩1.2.1.快速高维前缀和对于一个\(k\)维数组,设每维的大小分别为\((m_1,m_2,\cdots,m_k)\),要访问的位置为\((i_1,i_2,\cdots,i_k)\),则用\((\cdots(i_1\c......
  • 数据结构:双向链表
    文章目录1.双链表的结构定义2.双链表结构的对称性2.双向链表的插入3.双向链表的删除4.顺序表和链表的比较单链表的链式存储结构的结点中只有一个指示直接后继的指针域,由此,从某个结点出发只能顺指针向后寻查其他结点。若要寻查结点的直接前驱,则必须从表头指针出发。换......
  • 数据结构:线性表的应用
    文章目录1.线性表的合并2.有序表的合并1.线性表的合并问题描述:假设利用两个线性表La和Lb分别表示两个集合A和B,现要求一个新的集合A=AUBLa=(7,5,3,11)Lb=(2,6,3)->La=(7,5,3,11,2,6)算法步骤依次取出Lb中的每个元素,执行以下操作:在La中查找该元素如果找不到,则将......
  • 数据结构专题讲解
    数据结构专题讲解总结:1.绝大多数数据结构体题目本身都比较明显的有共通性,往往可以向树上转化2.对于二维的问题,我们往往可以将一维上建立树然后暴力处理另外一维来解决问题例题一P7476「C.E.L.U-02」苦涩题目简述:在YQH的梦中,他看到自己过去的记忆正在不断浮现在......
  • C++中的四种类型转换(静态、动态、常量、重新解释。
    在C++中,类型转换是编程语言中的一个重要概念,它允许我们将一种数据类型的值转换为另一种数据类型。C++提供了四种主要的类型转换方式:静态类型转换(StaticCast)、动态类型转换(DynamicCast)、常量类型转换(ConstCast)和重新解释类型转换(ReinterpretCast)。每种转换都有其特定的用途......
  • Mybatis常用动态标签
    MyBatis动态SQL标签指南MyBatis提供了一组动态SQL处理功能,允许在运行时构建SQL语句。这非常有用,因为你可以根据不同的条件组合查询。下面是常用的动态SQL标签及其使用方法。<if>标签作用:根据表达式的结果决定是否包含某个SQL片段。属性:test属性用于设置判......
  • 在 Python 中动态定义文字字符串排列的并集
    我有一个字符串列表:strings=['a','b','c']我想声明列表中所有可能的有序对的Union类型。硬编码,这看起来像:Literal我如何动态定义CustomType=Literal['ab','ac','aa','ba','bb','bc�......
  • JavaWeb项目中动态拼接sql语句
    业务需求描述:图中的查询框在分条件查询用户信息列表时,前端可能会传回一个条件或多个条件,此时要对不同的条件进行sql语句的不同书写,前端传的情况有很多种,所以如果分情况写sql语句会比较死,并且不够灵活,而且书写的内容会很多,所以要想一种办法来进行不同情况的sql语句拼接。参数......
  • Java入门:05.Java中的数组002
    通过上篇文章,相信大家对数组应该有了一个简单的了解,并对Java中的数据类型有了一个基本的认识,不仅如此我们还明白了怎样定义一个数组类型的变量,在这之后,让我们一起来更加深入的了解一下数组吧。三、如何创建一个数组(对其初始化)上篇文章我们明白了怎样定义一个数组类型的变量,但......
  • 【数据结构】二叉树
    二叉树结构描述:#include<iostream>#include<queue>usingnamespacestd;typedefintDataType;classNode{private:DataTypedata;Node*left;Node*right;friendclassBinaryTree;};typedefclassBinaryTree{private:N......