动态数组源码
来源:互联网 发布:淘宝客推广网站怎么建 编辑:程序博客网 时间: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
- nginx 源码:动态数组
- 动态数组源码
- Java源码分析 – ArrayList动态数组列表源码分析
- JS - 动态创建2维数组Array (例子源码)
- C++上机试验的源码--多维的动态对象数组
- 《ASCE1885的源码分析》の动态改变数组大小
- 文章2:Nginx源码分析-ngx_array_t动态数组
- Nginx高级数据结构源码分析(二)-----动态数组
- 动态数组
- 动态数组
- 动态数组
- 动态数组
- 动态数组
- 动态数组
- 动态数组
- 动态数组
- 动态数组
- 动态数组
- Sqlite存储日期
- jQuery实现QQ空间图片展示效果
- tomcat各目录(文件)作用
- nodejs设置允许跨域
- Linux信号(一)
- 动态数组源码
- 怎样给Myeclipse配置tomcat服务器
- getVisibleSize 和 getContentSize 和 getWinSize
- Java停止线程及有锁时停止方法
- OpenCms前台添加可拖拽内容只显示部分类型的资源
- JNI基础(二)Android Studio 配置NDK
- 03-Oracle入门之简介
- System类-exit()
- 合并排序