C语言动态数组简单实现

动态数组声明

#pragma once

// 动态增长内存,将存放的数据放到堆上


struct DanamicArray
{
	int *pAddr;       // 存放数据的地址
	int size;         // 当前有多少个元素
	int capacity;     // 数组最大容量
};

typedef struct DanamicArray Dynamic_Array;                      // C语言写法

Dynamic_Array * Dynamic_Array_Init();                           // 初始化
void PushBack_Array(Dynamic_Array * arr,int value);             // 插入
void RemoveByPos_Array(Dynamic_Array *arr, int pos);            // 根据位置删除
void RemoveByValue_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 Capacity_Array(Dynamic_Array *arr);                         // 获得动态数组当前容量
int Size_Array(Dynamic_Array* arr);                             // 获得动态数组元素的个数
int At_Array(Dynamic_Array *arr, int pos);                      // 根据位置获得当前元素位置

动态数组函数的实现

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

Dynamic_Array * Dynamic_Array_Init()                          // 初始化
{
	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 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 Capacity_Array(Dynamic_Array *arr)
{
	if (arr == NULL)
		return -1;

	return arr->capacity;
}

int Size_Array(Dynamic_Array *arr)
{
	if (arr == NULL)
		return -1;
	return arr->size;
}

int At_Array(Dynamic_Array *arr, int pos)
{
	/*if (arr == NULL)
		return -1;*/
	
	return arr->pAddr[pos];
}

void PushBack_Array(Dynamic_Array * arr, int value)
{
	if (arr == NULL)
		return;

	if (arr->size == arr->capacity)
	{
		int* newSpace = (int*)malloc(sizeof(int)*arr->capacity * 2);
		memcpy(newSpace, arr->pAddr, arr->capacity * sizeof(int));
		free(arr->pAddr);
		arr->capacity = arr->capacity * 2;
		arr->pAddr = newSpace;
	}

	arr->pAddr[arr->size] = value;        // 插入数据
	arr->size++;


}

void RemoveByPos_Array(Dynamic_Array *arr, int pos)
{
	if (arr == NULL)
		return;
	if (pos < 0 || pos >= arr->size)
		return;

	for (int i = pos; i < arr->size-1; i++)
	{
		arr->pAddr[i] = arr->pAddr[i + 1];
	}
	arr->size--;
}

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;
		}
	}
	return pos;
}

void RemoveByValue_Array(Dynamic_Array *arr, int value)
{
	if (arr == NULL)
		return;
	int pos = Find_Array(arr, value);
	if (pos != -1)
		RemoveByPos_Array(arr, pos);

}

测试函数

#define  _CRT_SECURE_NO_WARNINGS
#include "DynamicArray.h"
#include <stdio.h>
#include <stdlib.h>

void test01()
{
	Dynamic_Array* myArray = Dynamic_Array_Init();
	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);

	RemoveByPos_Array(myArray, 0);
	RemoveByValue_Array(myArray, 27);
	int pos = Find_Array(myArray, 5);
	printf("5查找到:pos:%d %d\n", pos, At_Array(myArray, pos));
	Print_Array(myArray);

	
	FreeSpace_Array(myArray);
	
}
int main()
{
	test01();
	system("pause");
}

 

动态数组是指可以根据需要动态调整大小的数组。使用C语言可以通过动态内存分配来实现动态数组。以下是一个简单C语言动态数组实现源代码: ```c #include <stdio.h> #include <stdlib.h> typedef struct { int capacity; // 动态数组的容量 int size; // 动态数组的实际大小 int *data; // 动态数组的数据 } DynamicArray; void initDynamicArray(DynamicArray *arr, int initialCapacity) { arr->capacity = initialCapacity; arr->size = 0; arr->data = (int *)malloc(sizeof(int) * initialCapacity); } void resizeDynamicArray(DynamicArray *arr, int newCapacity) { arr->data = (int *)realloc(arr->data, sizeof(int) * newCapacity); arr->capacity = newCapacity; } void addElement(DynamicArray *arr, int element) { if (arr->size >= arr->capacity) { resizeDynamicArray(arr, arr->capacity * 2); } arr->data[arr->size] = element; arr->size++; } int getElement(DynamicArray *arr, int index) { if (index < 0 || index >= arr->size) { printf("Error: Index out of range\n"); return -1; } return arr->data[index]; } void freeDynamicArray(DynamicArray *arr) { free(arr->data); } int main() { DynamicArray testArray; initDynamicArray(&testArray, 5); addElement(&testArray, 10); addElement(&testArray, 20); addElement(&testArray, 30); printf("Element at index 1: %d\n", getElement(&testArray, 1)); freeDynamicArray(&testArray); return 0; } ``` 以上源代码通过结构体和相应的函数实现动态数组的初始化、元素添加、元素获取、内存大小调整和内存释放等功能。在主函数中进行了简单的测试,可以看到动态数组的功能正常运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值