C语言实现动态数组-针对int数据类型

      基于c语言的动态数组(顺序表)编写,仅针对单一数据类型。代码经过检查,没有内存泄漏。

Dynamic_Array.h

#pragma once
//动态内存增长策略,将内存放在堆上
//动态数组 引入 capcity容量
//容量capcity表示最多存放多少数据
//size 记录当前数组中的元素个数
//动态数组旧定义完了

typedef struct DYNAMICARRAY
{
	int* pAddr;//存放数据类型
	int size;//当前元素个数
	int capacity;//容量
}Dynamic_Array;

//提供针对Dynamic_Array的一系列操作函数

//初始化
Dynamic_Array* Init_Array();

//插入
void PushBack_Array(Dynamic_Array* arr, int value);

//根据位置删除
void PopBackByPos_Array(Dynamic_Array* arr, int pos);

//根据值删除
void PopBackByValue_Array(Dynamic_Array* arr, int value);

//查找
int Find_Array(Dynamic_Array* arr, int value);

//打印
void Print_Array(Dynamic_Array* arr);

//释放动态内存
void FreeSpace_Array(Dynamic_Array* arr);

//请空数组 
void Clear_Array(Dynamic_Array* arr);

//获取数组容量
int GetCapcity_Array(Dynamic_Array* arr);

//获取当前元素个数
int GetSize_Array(Dynamic_Array* arr);

//根据位置获取某个元素
int At_Array(Dynamic_Array* arr, int pos);

Dynamic_Array.c

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#include "Dynamic_Array.h"

//初始化
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;
}

//插入
void PushBack_Array(Dynamic_Array* arr, int value)
{

	if (arr == NULL)
	{
		return;
	}
	//判断空间是否足够
	if (arr->size == arr->capacity)
	{
		//申请新空间
		int* newpAddr = (int*)malloc(sizeof(int)*arr->capacity*2);
		
	/*	for (int i = 0; i < arr->size; i++)
		{
			newpAddr[i] = arr->pAddr[i];
		}*/

		memcpy(newpAddr, arr->pAddr, arr->capacity * sizeof(int));

		free(arr->pAddr);


		arr->pAddr = newpAddr;
		arr->capacity = arr->capacity * 2;
	}

	arr->pAddr[arr->size] = value;
	arr->size++;
}

//根据位置删除
void PopBackByPos_Array(Dynamic_Array* arr, int pos)
{
	//结构体判空
	if (arr == NULL)
	{
		return;
	}
    
	//判断位置是否有效
	if (pos < 0 || pos >= arr->size)
	{
		return;
	}
    
	//删除元素
	for (int i = pos; i < arr->size; i++)
	{
		arr->pAddr[i] = arr->pAddr[i + 1];
	}
	arr->size--;
}

//根据值删除
void PopBackByValue_Array(Dynamic_Array* arr, int value)
{
	if (arr == NULL)
	{
		return;
	}

	int pos = Find_Array(arr, value);

	PopBackByPos_Array(arr, pos);

}

//查找
int Find_Array(Dynamic_Array* arr, int value)
{
	int pos = -1;

	if (arr == NULL)
	{
		return -1;
	}
    
	for (int i = 0; i < arr->size; i++)
	{
		if (arr->pAddr[i] == value)
		{
			pos = i;
			break;
		}
	}
	return pos;
}

//打印
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");
}

//释放动态内存
void FreeSpace_Array(Dynamic_Array* arr)
{

	if (arr == NULL)
	{
		return;
	}

	if (arr->pAddr != NULL)//注意释放顺序
	{
		free(arr->pAddr);
	}

	free(arr);
}

//请空数组 
void Clear_Array(Dynamic_Array* arr)
{
	if (arr == NULL)
	{
		return;
	}

	arr->size = 0;

}

//获取数组容量
int GetCapcity_Array(Dynamic_Array* arr)
{
	if (arr == NULL)
	{
		return -1;
	}
	return arr->capacity;
}

//获取当前元素个数
int GetSize_Array(Dynamic_Array* arr)
{
	if (arr == NULL)
	{
		return -1;
	}
	return arr->size;
}

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

动态数组.c

#include"Dynamic_Array.h"

void test01()
{
	//初始化
	Dynamic_Array* myArray = Init_Array();
	
	printf("数组容量= %d \n", GetCapcity_Array(myArray));
	printf("数组大小= %d \n", GetSize_Array(myArray));

	for (int i = 0; i < 30; i++)
	{
		PushBack_Array(myArray, i);
	}

	printf("数组容量= %d \n", GetCapcity_Array(myArray));
	printf("数组大小= %d \n", GetSize_Array(myArray));

	Print_Array(myArray);

	PopBackByValue_Array(myArray, 0);
	PopBackByValue_Array(myArray, 27);
	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;
}

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值