arr2.h
#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
struct list{
void **pArr;
int size;
int length;
};
typedef void * array;
// 创建动态数组
array create_array(int size);
// 向数组后面添加元素
void array_push(array arr,void *value);
// 向数组前添加元素
void array_unshift(array arr,void *value);
// 在数组指定位置添加元素
void array_insert(array arr,int pos,void *value);
// 删除数组第一个元素
void * array_shift(array arr);
// 删除数组最后一个元素
void * array_pop(array arr);
// 删除数组指定元素
void * array_splice(array arr,int pos);
// 遍历数组
void array_print(array arr,void(*print)(void *));
// 获取数组指定为元素
void * array_index(array arr,int pos);
// 获取数组已有元素的位数
int array_length(array arr);
// 获取数组总长度
int array_size(array arr);
// 清空数组
void array_clear(array arr);
// 销毁数组
void array_destory(array arr);
arr2.c
#include "arr2.h"
array create_array(int size){
if(size<0)
return NULL;
struct list *plist=(struct list *)malloc(sizeof(struct list));
if(!plist)
return NULL;
plist->pArr=(void **)malloc(sizeof(void*)*size);
plist->size=size;
plist->length=0;
return plist;
}
void array_push(array arr,void *value){
if(!arr||!value)
return ;
struct list *plist=(struct list *)arr;
if(plist->size==plist->length){
plist->pArr=(void **)realloc(plist->pArr,sizeof(void *)*(plist->size+100));
plist->size+=100;
}
plist->pArr[plist->length]=value;
plist->length++;
}
void array_unshift(array arr,void *value){
if(!arr||!value)
return ;
struct list *plist=(struct list *)arr;
if(plist->size==plist->length){
plist->pArr=(void **)realloc(plist->pArr,sizeof(void *)*(plist->size+100));
plist->size+=100;
}
for(int i=plist->length;i>0;i--){
plist->pArr[i]=plist->pArr[i-1];
}
plist->pArr[0]=value;
plist->length++;
}
void array_insert(array arr,int pos,void *value){
if(!arr||!value)
return ;
struct list *plist=(struct list *)arr;
if(pos<0||pos>plist->length){
pos=plist->length;
}
for(int i=plist->length;i>=pos;--i){
plist->pArr[i]=plist->pArr[i-1];
}
plist->pArr[pos]=value;
plist->length++;
}
void * array_shift(array arr){
if(!arr)
return NULL;
struct list *plist=(struct list *)arr;
void *data=plist->pArr[0];
for(int i=0;i<plist->length;++i){
plist->pArr[i]=plist->pArr[i+1];
}
plist->length--;
return data;
}
void * array_pop(array arr){
if(!arr)
return NULL;
struct list *plist=(struct list *)arr;
void *data=plist->pArr[plist->length-1];
plist->pArr[plist->length-1]=NULL;\
plist->length--;
return data;
}
void * array_splice(array arr,int pos){
if(!arr)
return NULL;
struct list *plist=(struct list *)arr;
if(pos<0||pos>plist->length){
return NULL;
}
void *data=plist->pArr[pos];
for(int i=pos;i<plist->length;++i){
plist->pArr[pos]=plist->pArr[i+1];
}
plist->length--;
return data;
}
void array_print(array arr,void(*print)(void *)){
if(!arr||!print)
return ;
struct list *plist=(struct list *)arr;
for(int i=0;i<plist->length;i++){
print(plist->pArr[i]);
}
}
void * array_index(array arr,int pos){
if(!arr)
return NULL;
struct list *plist=(struct list *)arr;
if(pos<0||pos>plist->length)
return NULL;
return plist->pArr[pos];
}
int array_length(array arr){
if(!arr)
return 0;
struct list *plist=(struct list*)arr;
return plist->length;
}
int array_size(array arr){
if(!arr)
return 0;
struct list *plist=(struct list *)arr;
return plist->size;
}
void array_clear(array arr){
if(!arr)
return ;
struct list *plist=(struct list *)arr;
for(int i=plist->length-1;i>=0;i--){
plist->pArr[i]=NULL;
}
plist->length=0;
}
void array_destory(array arr){
if(!arr)
return ;
array_clear(arr);
struct list *plist=(struct list *)arr;
free(plist->pArr);
free(plist);
}
struct person{
int id;
char name[30];
int age;
};
void myPrint(void *data){
struct person *p=(struct person *)data;
printf("id: %d, name: %s, age: %d\n",p->id,p->name,p->age);
}
void test(){
struct person p1={1,"Andy",21};
struct person p2={2,"Andy",21};
struct person p3={3,"Andy",21};
struct person p4={4,"Andy",21};
struct person p5={6,"Andy",21};
struct person p6={7,"Andy",21};
struct person p7={8,"Andy",21};
struct person p8={9,"Andy",21};
struct person p9={10,"Andy",21};
struct person p10={11,"Andy",21};
array arr=create_array(3);
array_push(arr,&p1);
array_push(arr,&p2);
array_push(arr,&p3);
array_push(arr,&p4);
array_unshift(arr,&p5);
array_insert(arr,4,&p6);
array_shift(arr);
array_pop(arr);
array_splice(arr,3);
array_print(arr,myPrint);
struct person *p=(struct person *)array_index(arr,1);
printf("id: %d, name: %s, age: %d\n",p->id,p->name,p->age);
printf("array length: %d,array size: %d\n",array_length(arr),array_size(arr));
array_clear(arr);
printf("array length: %d,array size: %d\n",array_length(arr),array_size(arr));
array_destory(arr);
printf("----------------------------------\n");
arr=create_array(5);
array_insert(arr,0,&p1);
array_insert(arr,1,&p2);
array_insert(arr,2,&p3);
array_insert(arr,3,&p4);
array_print(arr,myPrint);
printf("array length: %d,array size: %d\n",array_length(arr),array_size(arr));
array_clear(arr);
array_push(arr,&p7);
printf("array length: %d,array size: %d\n",array_length(arr),array_size(arr));
array_destory(arr);
}
int main(){
test();
system("pause");
return EXIT_SUCCESS;
}
运行结果
id: 1, name: Andy, age: 21
id: 2, name: Andy, age: 21
id: 3, name: Andy, age: 21
id: 2, name: Andy, age: 21
array length: 3,array size: 103
array length: 0,array size: 103
----------------------------------
id: 1, name: Andy, age: 21
id: 2, name: Andy, age: 21
id: 3, name: Andy, age: 21
id: 4, name: Andy, age: 21
array length: 4,array size: 5
array length: 1,array size: 5
请按任意键继续. . .