数据结构-链表1-顺序存储

DynamicArray.h

#ifndef DYNAMIC_ARRAY_H
#define DYNAMIC_ARRAY_H
#define _CRT_SECURE_NO_WARNINGS
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
 
//动态数组结构体
typedef struct DYNAMICARRAY {
	int* pAddr;  //具体存放数据的地址
	int size;    //当前有多少个元素
	int capacity;  //数组容量(当前最大的容量)

} Dynamic_Array;

typedef struct LINKNODE {
	void * data;

}linkNode;
//写一系列对DYNAMICARRAY结构体操作的函数
//初始化
Dynamic_Array * Init_Array();

//插入(默认尾部插入)
void Push_Back_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

DynamicArray.c

#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->pAddr = (int *)malloc(sizeof(int)*myArray->capacity);
	return myArray;
}

//插入(默认尾部插入)
void Push_Back_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)
	{
		arr->size = pos;
	}
	//删除元素
	//将删除元素后面的元素直接往前一个覆盖。最后size--
	for (int i = pos; i < arr->size-1; i++)  //防止最后一个无覆盖,减1
	{
		arr->pAddr[i] = arr->pAddr[i + 1];
	}
	arr->size--;
}
//根据值删除value第一次出现的位置
void RemoveByValue_Array(Dynamic_Array *arr, int value)
{
	if (arr == NULL)
	{
		return;
	}
	//找到值的位置
	int pos = Find_Array(arr, value);
	//根据位置删除
	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)
{
	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;
	}
	//pAddr->空间
	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)
{
	return arr->pAddr[pos];
}

动态数组.c

#define _CRT_SECURE_NO_WARNINGS
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include"DynamicArray.h"
void test01()
{
	//初始化动态数组
	Dynamic_Array* myArray = Init_Array();

	//打印容量
	printf("数组容量:%d\n", Capacity_Array(myArray));
	printf("数组大小:%d\n", Size_Array(myArray));

	//插入元素
	for (int i = 0; i < 30; i++)
	{
		Push_Back_Array(myArray, i);
	}
	//打印容量
	printf("数组容量:%d\n", Capacity_Array(myArray));
	printf("数组大小:%d\n", Size_Array(myArray));
	
	//删除
	RemoveByPOs_Array(myArray, 0);
	RemoveByValue_Array(myArray, 27);

	//打印
	Print_Array(myArray);

	//查找
	int pos=Find_Array(myArray, 5);
	printf("5查找到:pos:%d %d\n", pos, At_Array(myArray, pos));
	//销毁
	FreeSpace_Array(myArray);
}
int main()
{
	test01();
	system("pause");
	return 0;
}


/////////////////////////////运行结果////////////////////////////
/*
数组容量:20
数组大小:0
数组容量:40
数组大小:30
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 28 29
5查找到:pos:4 5
请按任意键继续. . .
*/

运行结果截图:

猜你喜欢

转载自blog.csdn.net/weixin_38383877/article/details/89843696