01黑马数据结构笔记之动态搭建数组(vector)

01黑马数据结构笔记之动态搭建数组(vector)

1 思路:类似STL的容器vector,动态的开辟内存存放数据,内存不够时以两倍增长。提供相应的增、删、查等函数。主要是利用一个结构体来管理数组。

//记录数组的成员
typedef struct MyArray{
	int size;    //数组实际大小
	int *addr;   //存放数据的实际内存
	int capacity; //数据的容量
}DynamicArray;

代码实现:
1)头文件.h:

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

//记录数组的成员
typedef struct MyArray{
	int size;    //数组实际大小
	int *addr;   //存放数据的实际内存
	int capacity; //数据的容量
}DynamicArray;


//给动态数据初始化
DynamicArray *DynamicArray_Init();

//在尾部插入一个元素
int Push_Back(DynamicArray *arr,int value);

//删除一个元素--位置
int Remove_By_Pos(DynamicArray *arr,int pos);

//删除一个元素--值
int Remove_By_value(DynamicArray *arr,int value);

//查找元素
int Find_Ele(DynamicArray *arr,int value);

//打印
int Print_Array(DynamicArray *arr);

//清空数组
int Clear_Array(DynamicArray *arr);

//获取容量大小
int Gain_Capacity(DynamicArray *arr);

//获取当前数组元素的大小
int Gain_Size(DynamicArray *arr);

//根据位置获取某个元素的位置
int Gain_Element_Pos(DynamicArray *arr,int pos);

//释放内存
int Destory_Space(DynamicArray *arr);

2) .cpp文件:

#include"DynamicArray.h"

DynamicArray *DynamicArray_Init(){

	DynamicArray *str=(DynamicArray *)malloc(sizeof(DynamicArray));
	//memset(str,0,sizeof(DynamicArray));
	str->size=0;
	str->capacity=20;
	str->addr=(int *)malloc(sizeof(int)*(str->capacity));
	//memset(str->addr,0,sizeof(int)*(str->capacity));

	return str;
}

//在尾部插入一个元素
int Push_Back(DynamicArray *arr,int value){

	if(arr==NULL){
		return -1;
	}


	//内存不够
	if(arr->size==arr->capacity){
		//1.开辟新的内存
		int *NewSpace=(int *)malloc(sizeof(int)*arr->capacity*2);
		//2.拷贝数据到新开辟的内存
		memcpy(NewSpace,arr->addr,arr->size*sizeof(int));
		//3.释放内存
		free(arr->addr);


		//更新内存地址和容量
		arr->addr=NewSpace;
		arr->capacity*=2;
	}

	//在尾部插入元素
	arr->addr[arr->size]=value;  //----我这里没写value赋值!!!!!!!
	(arr->size)++;             //更新当前数组大小

	return 0;
}

//删除一个元素 --位置
int Remove_By_Pos(DynamicArray *arr,int pos){
	
	if(arr==NULL){
		return -1;
	}
	if(pos<0 || pos >(arr->size)){
		printf("数组越界删除\n");
		return -2;
	}

	//依次将后一个元素往前移就行,但是最后那个元素没有改变,因为只执行到size-1,防止未知的值前移代替
	for(int i=pos; i<arr->size-1 ;i++){
		arr->addr[i] = arr->addr[i+1];   //!!!!!注意是i不是pos
	}

	//删除后需要减少数组元素个数
	arr->size--;

	return 0;

}
//删除一个元素 --值
int Remove_By_value(DynamicArray *arr,int value){

	if(arr == NULL){
		return -1;
	}

	//调用封装好的函数,利用值删除元素
	int pos = Find_Ele(arr,value);
	Remove_By_Pos(arr,pos);

	return 0;
}
//查找元素,返回第一个元素的下标值
int Find_Ele(DynamicArray *arr,int value){

	if(arr==NULL){
		return -1;
	}

    int pos=-1;

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

	return pos;
}
//打印
int Print_Array(DynamicArray *arr){

	if(arr==NULL){
		return -1;
	}

	for(int i=0; i<arr->size ;i++){
		printf("%d ",arr->addr[i]);
	}
	printf("\n");

	return 0;
}
//释放内存
int Destory_Space(DynamicArray *arr){

	//结构体为空直接返回

	if(arr==NULL){
		return -1;
	}


	if(arr->addr!=NULL){
		free(arr->addr);
		arr->addr=NULL;
	}

	free(arr);

	return 0;
}


//清空数组
int Clear_Array(DynamicArray *arr){

	//结构体为空直接返回
	if(arr==NULL){
		return -1;
	}

	//直接让size=0就是将数组清空,打印时就不会执行for
	arr->size=0;

	return 0;


}
//获取容量大小
int Gain_Capacity(DynamicArray *arr){
	return arr->capacity;
}
//获取当前数组元素的大小
int Gain_Size(DynamicArray *arr){

	return arr->size;

}
//根据位置获取某个元素的位置
int Gain_Element_Pos(DynamicArray *arr,int pos){

	return arr->addr[pos];

}


3) 主函数测试:

#include"DynamicArray.h"

void test01(){

	DynamicArray *arr=DynamicArray_Init();
	
	//尾部插入元素
	for(int i=0;i<30;i++){
		Push_Back(arr,i);
	}
	Print_Array(arr);

	//根据值查找元素
	int pos = Find_Ele(arr,8);
	printf("find:%d \n",arr->addr[pos]);

	//根据位置删除元素
	Remove_By_Pos(arr,8);
	Print_Array(arr);

	//根据值删除元素
	Remove_By_value(arr,20);
	Print_Array(arr);

	//获取相应数据
	printf("%d\n",Gain_Size(arr));
	printf("%d\n",Gain_Capacity(arr));
	printf("%d\n",Gain_Element_Pos(arr,10));

	//清空数组的意思是不执行for循环而已
	Clear_Array(arr);
	Print_Array(arr);

	//销毁内存
	Destory_Space(arr);

}

int main(){

	test01();

	return 0;
}


//总结:C语言局部变量的定义要写在前面,否则出现很多“类型缺少;”
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值