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语言局部变量的定义要写在前面,否则出现很多“类型缺少;”