C语言 数据结构 动态数组

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
请按任意键继续. . .

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值