线性表--动态数组

动态数组模仿STL之中的vector的一部分功能

main.c

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

int main()
{
	Dynamic_Array *arr=Array_Init();
	printf("初始化后Capcapity: %d\n", Capacity_Array(arr));
	printf("初始化后size:%d\n", Size_Array(arr));
	//插入元素
	for (int i = 0; i < 30; i++)
	{
		Push_Back(arr, i);
	}
	printf("插入元素后:Capcapity : %d\n", Capacity_Array(arr));
	printf("插入元素后size:%d\n", Size_Array(arr));

	printf("根据位置删除\n");
	printf("删除前\n");
	Print_Array(arr);
	//根据位置删除
	int n = Remove_Array(arr, 3);
	if (n==1)  //删除第三个位置的元素
	{
		printf("删除成功\n");
	}
	else if (n==-1)
	{
		printf("删除失败\n");
	}
	printf("删除后\n");
	Print_Array(arr);
	printf("根据值删除\n");
	//根据值删除 删除第一次出现的位置的值
	n = Remove_Array_Value(arr, 5);
	if (n==1)
	{
		printf("删除成功\n");
	}
	else if (n==-1)
	{
		printf("删除失败\n");
	}
	printf("删除后\n");
	Print_Array(arr);
	printf("根据值查找位置\n");
	n = Find_Array(arr, 3);
	if (n >0)
	{
		printf("查找成功,是第%d个\n",n);
	}
	else if (n == -1)
	{
		printf("查找失败\n");
	}
	printf("根据位置查找值\n");
	Get_Array(arr, 6);
	//清空数组
	Clear_Array(arr);
	printf("Capcapity : %d\n", Capacity_Array(arr));
	printf("size:%d\n", Size_Array(arr));
	Free_Array(arr);
	return 0;
}

DynamicArray.h

#ifndef DYNAMICARRAY_H
#define DYNAMICARRAY_H
#include <stdlib.h>
#include <stdio.h>

//动态内存策略
//容量capacity表示我的内存空间一共可以存放多少个元素
//size概念,记录当前数据中具体的个数

typedef struct DynamicArray
{
	int *pAddr; //存放数据的地址
	int size;  //有多少个元素
	int capacity; //容量 ,我容器当前最大能容纳多少元素
}Dynamic_Array;

//写一系列的相关的对结构体的函数
//初始化
Dynamic_Array * Array_Init();
//插入
void Push_Back(Dynamic_Array *arr, int val);
//根据位置删除
int Remove_Array(Dynamic_Array *arr, int pos);
//根据值删除
int Remove_Array_Value(Dynamic_Array *arr, int value);
//根据值查找是第几个位置
int Find_Array(Dynamic_Array *arr, int value);
//根据位置查找该位置的元素
void Get_Array(Dynamic_Array *arr, int pos);
//获得动态数组容量
int Capacity_Array(Dynamic_Array*arr);
//根据动态数组当前元素个数
int Size_Array(Dynamic_Array *arr);
//遍历打印
void Print_Array(Dynamic_Array *arr);
//释放动态数组的内存
void Free_Array(Dynamic_Array *arr);
//清空数组
void Clear_Array(Dynamic_Array *arr);
#endif

DynamicArray.c

#include "DynamicArray.h"

//初始化
Dynamic_Array * 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 Push_Back(Dynamic_Array *arr, int val)
{
	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)); //拷贝的是字节,所以要*sizeof(int)
		free(arr->pAddr);
		arr->pAddr = NULL;
		//更新容量
		arr->capacity = arr->capacity * 2;
		//更新指向空间
		arr->pAddr = newSpace;
	}

	//插入新元素
	arr->pAddr[arr->size] = val;
	arr->size++;

}
//根据位置删除
int Remove_Array(Dynamic_Array *arr, int pos)
{
	if (arr->pAddr == NULL)
		return -1;
	if (pos<0||pos > arr->size)
	{
		return -1;
	}
	else
	{
		for (int i = pos; i < arr->size; i++)
		{
			arr->pAddr[i - 1] = arr->pAddr[i];
		}
		arr->size--;
		return 1;
	}
}
//根据值删除 只删除第一次删除得位置
int Remove_Array_Value(Dynamic_Array *arr, int value)
{
	if (arr->pAddr == NULL)
		return -1;
	//找到值得位置
	int n=Find_Array(arr, value);
	if (n == -1)
	{
		return n;
	}
	else
	{
		Remove_Array(arr, n);
	}
}
//查找 只查找第一个
int Find_Array(Dynamic_Array *arr, int value)
{
	if (arr->pAddr == NULL)
		return -1;
	int i;
	for ( i = 0; i < arr->size; i++)
	{
		if (arr->pAddr[i] == value)
		{
			return i + 1;
			break;
		}
	}
	if (i == arr->size)
	{
		return -1;
	}
}
//打印
void Print_Array(Dynamic_Array *arr)
{
	if (arr->pAddr == NULL)
		return;
	for (int i = 0; i < arr->size; i++)
	{
		printf("%d  ", arr->pAddr[i]);
	}
	printf("\n");
}
//释放动态数组的内存
void Free_Array(Dynamic_Array *arr)
{
	if (arr->pAddr == NULL)
		return;
	if (arr->pAddr != NULL)
	{
		free(arr->pAddr);
		arr->pAddr == NULL;
	}
	free(arr);
	arr = NULL;
}

//清空数组
void Clear_Array(Dynamic_Array *arr)
{
	if (arr->pAddr == NULL)
		return;
	arr->size = 0;



}
//获得动态数组容量
int Capacity_Array(Dynamic_Array*arr)
{
	if (arr->pAddr == NULL)
		return;
	return arr->capacity;
}
//根据动态数组当前元素个数
int Size_Array(Dynamic_Array *arr)
{
	if (arr->pAddr == NULL)
		return;
	return arr->size;
}
//根据位置获得值
void Get_Array(Dynamic_Array *arr, int pos)
{
	if (arr->pAddr == NULL)
		return;
	if (pos >= arr->size)
	{
		printf("获得失败\n");
	}
	else
	{
		printf("获得成功,该值为%d\n", arr->pAddr[pos-1]);
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值