动态数组源码

来源:互联网 发布:淘宝客推广网站怎么建 编辑:程序博客网 时间:2024/05/18 11:25

动态数组源码

1.头文件

/*MyDynamicArray.h*/#pragma #include <stdio.h>#include <stdlib.h>/*动态数组结构体*/typedef struct _MyDynamicArray{void **address;int capacity;int size;}MyDynamicArray;typedef void *DynamicArray;/*比较函数指针*/typedef int(DATACOMPARE)(void *, void *);/*打印函数指针*/typedef void(DATAPRINT)(void *);/*初始化数组*/DynamicArray Init_DynamicArray();/*指定位置插入*/void Insert_DynamicArray(DynamicArray Darray, int pos, void *data);/*指定位置删除*/void Remove_DynamicArray(DynamicArray Darray, int pos);/*获取指定位置元素*/void *GetData_DynamicArray(DynamicArray Darray, int pos);/*获取数组的大小*/int GetSize_DynamicArray(DynamicArray Darray);/*遍历打印数组*/void Print_DynamicArray(DynamicArray Darray, DATAPRINT print);/*内存释放*/void Destroy_DynamicArray(DynamicArray Darray);

2.实现文件

/*MyDynamicArray.c*/#include "DynamicArray.h"#define CAPACITY 5/*数组容量*//*初始化动态数组*/DynamicArray Init_DynamicArray(){MyDynamicArray *MyDarray = (MyDynamicArray *)malloc(sizeof(MyDynamicArray));if (MyDarray == NULL){return NULL;}MyDarray->capacity = CAPACITY;MyDarray->size = 0;MyDarray->address = (void **)malloc(sizeof(void *)* MyDarray->capacity);return MyDarray;}/*指定位置插入数据*/void Insert_DynamicArray(DynamicArray Darray, int pos, void *data){if (Darray == NULL){return;}if (data == NULL){return;}MyDynamicArray *MyDarray = (MyDynamicArray *)Darray;/*判断空间是否足够*/if (MyDarray->size == MyDarray->capacity){/*扩展2倍的空间*/int newCapacity = MyDarray->capacity * 2;/*申请空间*/void **newSpace = (void **)malloc(sizeof(void*)*newCapacity);/*拷贝原空间数据到新空间*/memcpy(newSpace, MyDarray->address, sizeof(void *)*MyDarray->capacity);/*释放旧空间*/free(MyDarray->address);MyDarray->address = newSpace;MyDarray->capacity = newCapacity;}/*判断位置是否有效 如果pos越界 调整为在尾部插入*/if (pos < 0 || pos > MyDarray->size){pos = MyDarray->size;}/*移动元素*/int i = MyDarray->size - 1;for (; i >= pos; i--){MyDarray->address[i + 1] = MyDarray->address[i];}MyDarray->address[pos] = data;MyDarray->size++;}/*指定位置删除*/void Remove_DynamicArray(DynamicArray Darray, int pos){if (Darray == NULL){return NULL;}MyDynamicArray *MyDarray = (MyDynamicArray *)Darray;/*判断数组是否为空*/if (MyDarray->size == 0){return NULL;}if (pos < 0 || pos >= MyDarray->size){return NULL;}/*删除元素*/for (int i = pos; i < MyDarray->size - 1; i++){MyDarray->address[i] = MyDarray->address[i + 1];}MyDarray->size--;}/*获取指定位置元素*/void *GetData_DynamicArray(DynamicArray Darray, int pos){if (Darray == NULL){return NULL;}MyDynamicArray *MyDarray = (MyDynamicArray*)Darray;if (pos < 0 || pos >= MyDarray->size){return NULL;}return MyDarray->address[pos];}/*获取数组的大小*/int GetSize_DynamicArray(DynamicArray Darray){if (Darray == NULL){return NULL;}MyDynamicArray *MyDarray = (MyDynamicArray *)Darray;return MyDarray->size;}/*遍历打印数组*/void Print_DynamicArray(DynamicArray Darray, DATAPRINT print){if (Darray == NULL){return NULL;}MyDynamicArray *MyDarray = (MyDynamicArray *)Darray;for (int i = 0; i < MyDarray->size; i++){print(MyDarray->address[i]);}}/*内存释放*/void Destroy_DynamicArray(DynamicArray Darray){if (Darray == NULL){return NULL;}free(Darray);}

3.测试文件

/*test.c*/#include "DynamicArray.h"typedef struct _PERSON{char name[64];int age;}Person;/*打印函数*/void MyPrint(void *data){Person *p = (Person *)data;printf("Name:%s Age:%d\n", p->name, p->age);}void test(){DynamicArray Darray = Init_DynamicArray();Person p1 = { "aaa", 11 };Person p2 = { "bbb", 22 };Person p3 = { "ccc", 33 };Person p4 = { "ddd", 44 };Person p5 = { "eee", 55 };Insert_DynamicArray(Darray, 0, &p1);Insert_DynamicArray(Darray, 3, &p2);Insert_DynamicArray(Darray, 2, &p3);Insert_DynamicArray(Darray, 1, &p4);Insert_DynamicArray(Darray, 4, &p5);Print_DynamicArray(Darray, MyPrint);printf("------------------------------------\n");Remove_DynamicArray(Darray, 3);Print_DynamicArray(Darray, MyPrint);printf("-----------------------------------\n");void *GetData = GetData_DynamicArray(Darray, 2);MyPrint(GetData);int pos = GetSize_DynamicArray(Darray);printf("size = %d\n", pos);}int main(){test();system("pause");return 0;}



1 0