C语言之动态数组

来源:互联网 发布:edius mac 编辑:程序博客网 时间:2024/05/20 02:54
/********************************************* Function 根据需要动态分配内存空间*************************************************//*********** DyNaArray.h ****************/#pragma once#include <stdio.h>#include <stdlib.h>#define MAX 100#define true 1#define false 0#ifdef __cplusplusextern "C"{#endiftypedef void (*mPtr)(void *);typedef struct DayNode    {      void **mPtname;         int capacity;  //容量      int size;      //大小    }DynamArray;/**** 动态数组初始化 ****/DynamArray *InitDynamArr();/**** 插入元素 ****/int InsertDataArr(DynamArray *arr,int pos, void *data);/**** 删除元素 ****/int DeleteDataArr(DynamArray *arr,int pos);/**** 遍历元素 ****/void TraveDataDayArr(DynamArray *arr,mPtr List);/**** 清空元素 ****/void FreeDynamArr(DynamArray *arr);/**** 动态数组大小 ****/int GetSizeDynamArr(DynamArray *arr);#ifdef __cplusplus    }#endif/************* DyNaArray.c  *****************/#include "DyNaArray.h"#if 0typedef struct DayNode    {    void **mPname;       int capacity;  //容量  存放有capacity个mPname的地址    int size;      //大小    }DynamArray;#endif/**** 动态数组初始化 ****/DynamArray *InitDynamArr()    {       DynamArray *mDynam = (DynamArray*)malloc (sizeof(DynamArray));       mDynam->mPtname = (void **)malloc (sizeof(void*));       mDynam->capacity = 5;       mDynam->size = 0;       return mDynam;    }/**** 插入元素 ****/int InsertDataArr(DynamArray *arr,int pos, void *data)    {     int i = 0;     if (NULL == arr || NULL == data)     {      return false;     }     /***若插入的pos位置不正确,重新调整位置***/    if (pos < 0 || pos >arr->size)    {      pos = arr->size;    }    if (pos >= arr->capacity)    {      arr->mPtname = (void*)realloc (arr->mPtname,sizeof(void*)*(arr->capacity+1));      arr->capacity++;    }    for (i=arr->size-1;i>=pos;i--)    {      arr->mPtname[i+1] = arr->mPtname[i];    }    arr->mPtname[pos]=data;    arr->size++;    return true;    }/**** 删除元素 ****/int DeleteDataArr(DynamArray *arr,int pos)    {    int i;    if (NULL == arr)    {    return false;    }    if (pos<0 || pos>arr->size-1)    {      return false;    }    for (i=pos;i<arr->size-1;i++)    {      arr->mPtname[i]=arr->mPtname[i+1];    }    arr->size--;    return true;    }/**** 遍历元素 ****/#if 0*****************************mPtr List;定义了一个函数指针变量函数指针的定义有3种方法:a) 先定义函数类型,根据类型定义指针变量(不常用)如:typedef int (mPtr)(int a,int b);    mPtr *mPoint = Func; /*Func为函数名*/b) 先定义函数指针类型,根据类型定义指针变量(常用)    typedef int (*mPtr)(int a,int b);    mPtr mPoint = Func;c) 直接定义函数指针变量(常用)    int (*mPtr)(int a,int b);    mPtr = Func;*****************************#endifvoid TraveDataDayArr(DynamArray *arr,mPtr List)    {     int i = 0;     if (NULL == arr || NULL == List)     {     return ;     }     for (i=0;i<arr->size-1;i++)     {       List(arr->mPtname[i]);     }    return ;    }/**** 清空元素 ****/void FreeDynamArr(DynamArray *arr)    {     if (NULL == arr)     {     return;     }     if (arr->mPtname!=NULL)     {       free(arr->mPtname);       arr->mPtname = NULL;     }     if (arr != NULL)         {           free (arr);           arr =NULL;         }     return;    }/**** 动态数组大小 ****/int GetSizeDynamArr(DynamArray *arr)    {     if (NULL == arr)     {      return false;     }     printf ("size = %d\n",arr->size);     return true;    }/***************** Test.c   ******************/#include "DyNaArray.h"typedef struct Student    {      char name[MAX];      int age;    }Stu;/****打印接口****/void ListPrintArr(void *data)    {      Stu *mPtr = (Stu*)data;      printf ("name = %s\n age = %d\n",mPtr->name,mPtr->age);    }/****初始化Stu的成员变量****/void ActDataFunc()    {     /**** 数组初始化 ****/      DynamArray *mPtr = NULL;      Stu s1 = {"lixiaogang",24};      Stu s2 = {"wang",23};      Stu s3 = {"tian",22};      Stu s4 = {"zhang",25};      Stu s5 = {"xiao",26};      mPtr = InitDynamArr();     /****插入元素****/      InsertDataArr (mPtr,0,&s1);      InsertDataArr (mPtr,0,&s2);      InsertDataArr (mPtr,0,&s3);      InsertDataArr (mPtr,0,&s4);      InsertDataArr (mPtr,0,&s5);      /****通过函数指针调用函数****/      TraveDataDayArr (mPtr,ListPrintArr);    }int main(int argc,char *argv[])    {    ActDataFunc ();    system ("pause");#if 0#define EXIT_SUCCESS    0#define EXIT_FAILURE    1#endif    return EXIT_SUCCESS;     }
1 0