動態數組C語言實現


/*
 * DynamicArray.h
 *
 *  Created on: 2019年7月22日
 *      Author: Jarvis
 */

#ifndef SRC_DYNAMICARRAY_H_
#define SRC_DYNAMICARRAY_H_

//動態增長內存 策略 將數據放到堆上
//動態數組 如果5個元素 申請內存 拷貝數據 釋放內存
// 容量 capacity 表示我的這塊內存空間一共可以存放多少個元素
// size  記錄當前數組中具體的元素個數

//定義動態數組的結構體
typedef struct DYNAMICARRAY {
	int *pAddr;// 存放數據的地址
	int size;//當前有多少個元素
	int capacity;//容量, 容器當前能容納多少個元素
}Dynamic_Array;

//操作函數
//初始化
Dynamic_Array *Init_Array();

//插入
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);






#endif /* SRC_DYNAMICARRAY_H_ */

/*
 * DynamicArray.c
 *
 *  Created on: 2019年7月22日
 *      Author: Administrator
 */

#include <stdlib.h>



#include "DynamicArray.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){
		//第一步 申請一塊更大的內存空間 ,新空間是舊空間的2倍
		int *newSpace = 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--;

}

//根據值刪除
void RemoveByValue_Array(Dynamic_Array *arr, int value) {
	if(arr == NULL){
		return;
	}
	//找到值的位置
	int pos = -1;
	for(int i = 0; i< arr->size; i++){
		if(arr->pAddr[i] == value){
			pos = i;
			break;
		}
	}
	//根據位置 刪除值
	RemoveByPos_Array(arr, pos);
}

//查找
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 Print_Array(Dynamic_Array *arr) {
	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 0;
	}
	return arr->size;
}

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



/*
 * mian.c
 *
 *  Created on: 2019年7月22日
 *      Author: Administrator
 */


#include "DynamicArray.h"

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

void test01(){
	//初始化動態數組
	Dynamic_Array *arr = Init_Array();

	//打印 capacity size
	printf("after create arr, capacity: %d, size: %d \n",arr->capacity, arr->size);
	//插入元素
	for(int i = 0; i < 10; i++){
		PushBack_Array(arr, i);
	}

	//打印
	printf("插入10個元素后 \n");
	Print_Array(arr);

	//插入元素

	for(int i = 0; i < 30; i++){
		PushBack_Array(arr, i);
	}
	//打印
	printf("重新插入30個元素后 \n");
	Print_Array(arr);

	//刪除
	RemoveByPos_Array(arr, 0);
	RemoveByValue_Array(arr, 5);
	//
	printf("刪除兩個元素后 \n");
	Print_Array(arr);


	//查找
	int pos = Find_Array(arr, 30);
	printf("位置 5查找到  pos: %d  value: %d \n",pos, At_Array(arr, pos));
	//銷毀
	FreeSpace_Array(arr);

}

int main(){
	printf("動態數組  \n");
	test01();
	system("pause");
	return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM