数据结构-动态数组

来源:互联网 发布:terrans force s4 知乎 编辑:程序博客网 时间:2024/05/21 06:37

思路:用一个结构体作控制器,里面放数组的大小,容量,和首地址,这个数组空间可以存放任意类型的数据(void*)

动态数组的优点:随机访问元素效率高

缺点:

1 需要分配一块连续的存储区域(很大区域,有可能分配失败)

2 删除和插入某个元素效率低




DArray.h

#pragma once#include<stdlib.h>#include<string.h>typedef struct DYNAMICARRAY//定义一个动态数组控制器{void** address;//指向数组,这个数组可以存放任意类型int container;//数组容量int size;//数组大小}DArray;//比较函数指针typedef int(*Comparison)(void* data1, void* data2);//打印函数指针typedef void(*PrintData)(void*);//初始化数组void* Init_DynamicArray();//指定位置插入void Insert_DynamicArray(void* darray,int pos,void* data);//尾部插入操作void PushBack_DynamicArray(void* darray, void* data);//头部插入void PushFront_DynamicArray(void* darray, void* data);//指定位置删除void RemoveByPos_DynamicArray(void* darray, int pos);// 尾部删除操作void PopBack_DynamicArray(void* darray);//头部删除操作void PopFront_DynamicArray(void* darray);//值删除void RemoveByVal_DynamicArray(void* darray, void* data, Comparison compare);//获得指定位置元素void* Get_DynamicArray(void* darray, int pos);//数组大小int Size_DynamicArray(void* darray);//数组容量int Capacity_DynamicArray(void* darray);//遍历void Print_DynamicArray(void* darray, PrintData print);//销毁数组void Destroy_DynamicArray(void* darray);


DArray.c

#include"DArray.h"// 初始化数组void* Init_DynamicArray(){DArray* darray = (DArray*)malloc(sizeof(DArray));if (darray == NULL){return NULL;}darray->container = 5;darray->size = 0;darray->address = (void**)malloc(sizeof(void*)*darray->container);return darray;}//指定位置插入void Insert_DynamicArray(void* darray, int pos, void* data){if (darray == NULL){return;}if (data == NULL){return;}DArray* array = (DArray*)darray;//判断空间是否足够if (array->size == array->container){int newcontainer = array->container * 2;//扩展2倍空间void** Newaddress = (void**)malloc(sizeof(void*)*newcontainer);//把旧的数据拷贝到新的空间memcpy(Newaddress, array->address, sizeof(void*)*array->container);//释放旧的空间free(array->address);array->address = Newaddress;array->container = newcontainer;}//判断pos是否越界,越界就往尾部插入if (pos<0 || pos>array->size){pos = array->size;}//往后移动元素int i = array->size - 1;for (; i >= pos; --i){array->address[i + 1] = array->address[i];}array->address[pos] = data;++array->size;return;}//尾部插入操作void PushBack_DynamicArray(void* darray, void* data){if (darray == NULL){return;}if (data == NULL){return;}DArray* array = (DArray*)darray;Insert_DynamicArray(array, array->size, data);}//头部插入void PushFront_DynamicArray(void* darray, void* data){if (darray == NULL){return;}if (data == NULL){return;}DArray* array = (DArray*)darray;Insert_DynamicArray(array, 0, data);}//指定位置删除void RemoveByPos_DynamicArray(void* darray, int pos){if (darray == NULL){return;}DArray* array = (DArray*)darray;//数据是否为空if (array->size == 0){return;}//判断pos是否越界,越界就不删除if (pos<0 || pos>array->size-1){return;}//往前移动元素int i = array->size - 1;for (; i > pos; ++pos){array->address[pos] = array->address[pos+1];}--array->size;}// 尾部删除操作void PopBack_DynamicArray(void* darray){if (darray == NULL){return;}DArray* array = (DArray*)darray;//数组是否为空if (array->size == 0){return;}RemoveByPos_DynamicArray(array, array->size - 1);}//头部删除操作void PopFront_DynamicArray(void* darray){if (darray == NULL){return;}DArray* array = (DArray*)darray;//数组是否为空if (array->size == 0){return;}RemoveByPos_DynamicArray(array, 0);}//值删除void RemoveByVal_DynamicArray(void* darray, void* data, Comparison compare){if (darray == NULL){return;}if (data == NULL){return;}DArray* array = (DArray*)darray;//数组是否为空if (array->size == 0){return;}//查找相同元素删除int i;for (i = 0; i < array->size; ++i){if (compare(data, array->address[i])){RemoveByPos_DynamicArray(array, i);break;}}}//获得指定位置元素void* Get_DynamicArray(void* darray, int pos){if (darray == NULL){return NULL;}DArray* array = (DArray*)darray;//数组是否为空if (pos < 0 || pos >= array->size){return NULL;}return array->address[pos];}//数组大小int Size_DynamicArray(void* darray){if (darray == NULL){return -1;}DArray* array = (DArray*)darray;return array->size;}//数组容量int Capacity_DynamicArray(void* darray){if (darray == NULL){return -1;}DArray* array = (DArray*)darray;return array->container;}//遍历void Print_DynamicArray(void* darray, PrintData print){if (darray == NULL){return;}DArray* array = (DArray*)darray;int i = 0;for (; i < array->size; ++i){print(array->address[i]);}}//销毁数组void Destroy_DynamicArray(void* darray){if (darray == NULL){return;}free(darray);}
main.c

#define _CRT_SECURE_NO_WARNINGS#include "DArray.h"#include<stdio.h>#include<stdlib.h>#include<string.h>typedef struct STUDENT{char name[100];int age;}student;//比较函数指针int MyComparison(void* data1, void* data2){student* s1 = (student*)data1;student* s2 = (student*)data2;return strcmp(s1->name, s2->name)==0 || s1->age==s2->age;}//打印函数指针void MyPrintData(void* data){student* s1 = (student*)data;printf("Name:%s,Age:%d\n", s1->name, s1->age);}int main(){//初始化数组void* darray=Init_DynamicArray();student s1 = { "zhangsan", 0 };student s2 = { "lixi", 1 };student s3 = { "wangwu",2 };student s4 = { "zhaoliu", 3 };student s5 = { "niuqi", 4 };student s6 = { "wuba", 5 };//尾部插入操作PushBack_DynamicArray(darray, &s2);PushBack_DynamicArray(darray, &s1);//头部插入PushFront_DynamicArray(darray, &s3);PushFront_DynamicArray(darray, &s4);//指定位置插入Insert_DynamicArray(darray, 4, &s5);Insert_DynamicArray(darray, 5, &s6);//打印Print_DynamicArray(darray, MyPrintData);printf("------------下面开始删除元素-----------\n");//指定位置删除RemoveByPos_DynamicArray(darray, 1);RemoveByPos_DynamicArray(darray, 0);// 尾部删除操作PopBack_DynamicArray(darray);//头部删除操作PopFront_DynamicArray(darray);//值删除RemoveByVal_DynamicArray(darray, &s1, MyComparison);//获得指定位置元素student* S1 = (student*)Get_DynamicArray(darray, 0);printf("Name:%s,Age:%d\n", S1->name, S1->age);//数组大小int size=Size_DynamicArray(darray);printf("%d\n",size);//数组容量int Cap=Capacity_DynamicArray(darray);printf("%d\n", Cap);//销毁数组Destroy_DynamicArray(darray);getchar();return 0;}

打印结果:





原创粉丝点击