数据结构及接口(Dynamic_Array.h):
#ifndef DYNAMIC_ARRAY_H_INCLUDED
#define DYNAMIC_ARRAY_H_INCLUDED
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Dynamic_Array{
int *pAddr;
int Asize;
int capacity;
}Dynamic_Array;
typedef Dynamic_Array DArray;
DArray* Create_Array();
void Destroy_Array(DArray *arr);
void PushBack_Array(DArray *arr,int val);
void RemoveByPos_Array(DArray *arr,int pos);
void RemoveByVal_Array(DArray *arr,int val);
void Clear_Array(DArray *arr);
int FindByPos_Array(DArray *arr,int pos);
int FindByVal_Array(DArray *arr,int val);
void Print_Array(DArray *arr);
int GetSize_Array(DArray *arr);
int GetCapacity_Array(DArray *arr);
#endif
功能实现(Dynamic_Array.c):
#include "Dynamic_Array.h"
#define CAPACITY_INIT_VALUE 20
DArray* Create_Array(){
DArray *arr = (DArray*)malloc(sizeof(DArray));
arr->Asize = 0;
arr->capacity = CAPACITY_INIT_VALUE;
arr->pAddr = (int*)malloc(sizeof(int)*arr->capacity);
return arr;
}
void Destroy_Array(DArray *arr)
{
if(arr->pAddr == NULL){
fprintf(stderr,"The array doesn't exist,can't destroy it.\n");
return ;
}
else
{
free(arr->pAddr);
arr->Asize = 0;
arr->capacity = 0;
}
}
void PushBack_Array(DArray *arr,int val)
{
if(arr == NULL){
fprintf(stderr,"The array doesn't exist,can't push back.\n");
return ;
}
else
{
if(arr->Asize == arr->capacity){
int* newspace = (int*)malloc(sizeof(int)*arr->capacity*2);
memcpy(newspace,arr->pAddr,sizeof(int)*arr->Asize);
free(arr->pAddr);
arr->pAddr = newspace;
arr->capacity *= 2;
}
arr->pAddr[arr->Asize] = val;
arr->Asize++;
}
}
void RemoveByPos_Array(DArray *arr,int pos)
{
if(arr == NULL){
fprintf(stderr,"The array doesn't exist,can't remove by pos.\n");
return ;
}
if(pos < 0 || pos > arr->Asize){
fprintf(stderr,"Invalid pos to remove.\n");
return ;
}
for(int i=pos;i<arr->Asize-1;i++){
arr->pAddr[i] = arr->pAddr[i+1];
}
arr->Asize --;
}
void RemoveByVal_Array(DArray *arr,int val)
{
if(arr == NULL){
fprintf(stderr,"The array doesn't exist,can't remove by val.\n");
return ;
}
int pos = FindByVal_Array(arr,val);
if(pos == -1){
fprintf(stderr,"Failed to remove by val,element not found.\n");
return ;
}
RemoveByPos_Array(arr,pos);
}
void Clear_Array(Dynamic_Array *arr)
{
if(arr == NULL)
fprintf(stderr,"The array doesn't exist,can't clear it.\n");
else
arr->Asize = 0;
}
int FindByPos_Array(DArray *arr,int pos)
{
if(arr == NULL){
fprintf(stderr,"The array doesn't exist,can't find by POS.\n");
return 0x7FFFFFFF;
}
if(pos < 0 || pos > arr->Asize){
fprintf(stderr,"Invalid pos to find.\n");
return 0x7FFFFFFF;
}
return arr->pAddr[pos];
}
int FindByVal_Array(DArray *arr,int val)
{
if(arr == NULL){
fprintf(stderr,"The array doesn't exist,can't find by VAL.\n");
return -1;
}
int pos = -1;
for(int i=0;i<arr->Asize;i++)
{
if(val == arr->pAddr[i]){
pos = i;
break;
}
}
if(pos == -1){
fprintf(stderr,"%d is not found in the array!\n",val);
return -1;
}
return pos;
}
void Print_Array(DArray *arr)
{
if(arr == NULL)
fprintf(stderr,"The array doesn't exist,can't print it.\n");
else{
for(int i=0;i<arr->Asize;i++)
printf("%d\t",arr->pAddr[i]);
printf("\n");
}
}
int GetSize_Array(Dynamic_Array *arr)
{
if(arr == NULL){
fprintf(stderr,"The array doesn't exist,can't get size.\n");
return -1;
}
else
return arr->Asize;
}
int GetCapacity_Array(Dynamic_Array *arr)
{
if(arr == NULL){
fprintf(stderr,"The array doesn't exist,can't get capacity.\n");
return -1;
}
else
return arr->capacity;
}
功能测试(main.c):
#include "Dynamic_Array.h"
void test_Array(int Asize)
{
DArray *arr = Create_Array();
for(int i=0;i<Asize;i++)
PushBack_Array(arr,i);
printf("The array now is:\n");
Print_Array(arr);
printf("The size is %d\n",GetSize_Array(arr));
printf("The capacity is %d\n",GetCapacity_Array(arr));
int pos = arr->Asize/2;
printf("arr->pAddr[%d] = %d\n",pos,FindByPos_Array(arr,pos));
pos --;
printf("arr->pAddr[%d] = %d\n",pos,FindByPos_Array(arr,pos));
RemoveByPos_Array(arr,Asize-1);
RemoveByVal_Array(arr,Asize-3);
printf("\n\tAfter remove,the array is:\n");
Print_Array(arr);
Clear_Array(arr);
printf("\n\tAfter Clear:\n\n");
printf("The size is %d\n",GetSize_Array(arr));
printf("The capacity is %d\n\n",GetCapacity_Array(arr));
}
int main()
{
test_Array(2);
system("pause");
system("cls");
test_Array(30);
return 0;
}