C语言实现支持多类型的ArrayList
//ArrayList.h /*----------------------------- * * For 算法数据结构 * IDE DEV-CPP4.9.2 * Auhtor Czp * Date 2012/11/4 *------------------------------ */ //防止重复导入 #ifndef MY_ARRAY_LIST_H #define MY_ARRAY_LIST_H //如果C++里调用,采用C编译器 #ifdef __cplusplus extern "C" { #endif //检查是否成功申请内存 #define Asert(par) if(par==NULL) { printf("%s,%d malloc null",__FILE__,__LINE__); return NULL;} #define INIT_SIZE 10 //默认的数组大小 typedef int Element; //定义List里的元素类型 typedef void (*PrtFun)(Element);//打印函数 typedef int (*CmpFun)(Element,Element);//比较函数 typedef struct _ArrayList{ //定义ArrayList Element *data; //List的元素 size_t size; //List可以容纳个数 size_t index;//当前已有元素索引 CmpFun cmpFun;//比较函数指针 PrtFun ptrFun;//打印函数指针 }ArrayList; /********************************* *@desc:创建ArrayList *@return: NULL->内存申请失败 arr->指向ArrayList的指针 ********************************** */ ArrayList *createArrayList(CmpFun cmp,PrtFun pfun) { //申请数组的内存 ArrayList *arr = (ArrayList *)malloc(sizeof(ArrayList)); Asert(arr); Element *data = (Element *)malloc(INIT_SIZE*sizeof(Element)); Asert(data); arr->data = data; arr->index = 0; arr->size = INIT_SIZE; arr->cmpFun = cmp; arr->ptrFun = pfun; return arr; } /******************************* *@desc: 释放ArrayList占有的内存 ****************************** */ void desrotyArrList(ArrayList *arr) { if(arr!=NULL) { free(arr->data); //释放数组占用的内存 free(arr); //释放结构体占用的内存 } } /************************************* *@desc: 检查链表的剩余空间,不够则申请 *@param: arr->要检查的链表 *@notice: 本函数不检查参数是否合法 ************************************* */ static Element *checkAndPre(ArrayList *arr) { size_t index = arr->index; size_t size = arr->size; //没有足够的空间 if(index>=size) { //申请size+INIT_SIZE size_t newSize = INIT_SIZE+size; Element *newData = (Element*)malloc(newSize*sizeof(Element)); Asert(newData); Element *src = arr->data; //复制原来的数据 size_t i; for(i=0;i<index;i++) newData[i] = src[i]; //释放原来的数据占据的空间 free(src); arr->data = newData; arr->size = newSize; return newData; } return arr->data; } /**************************** *@desc: 在末尾添加元素 *@param: arr->对那个arrlist添加 *@parm: elm->要添加的元素 *@return:1->成功 0->失败 ****************************** */ int addElement(ArrayList *arr, Element elm) { if(arr!=NULL) { //检查剩余空间 if(checkAndPre(arr)!=NULL) { Element *els = arr->data; els[arr->index++] = elm; return 1; } } return 0; } /**************************** *@desc: 把指定的位置设置为elm *@param: arr->待插入的列表 *@param: elm->待插入的元素 *@param: i->待设置的位置 *@return:1->成功 0->失败 ***************************** */ int setElement(ArrayList *arr,Element elm,size_t i) { if(arr!=NULL||i>=arr->index) { Element *els = arr->data; els[i] = elm; return 1; } return 0; } /************************ *@desc: 打印ArrayList *@param:arr->要打印的列表 *@param:fun->打印函数 ************************* **/ void printArrayList(ArrayList *arr) { if(arr!=NULL) { Element *data = arr->data; if(data!=NULL) { size_t i; for(i=0;i<arr->index;i++) arr->ptrFun(*data++); } } } /************************ *@desc:列表是否为空 *param:arr->待检查的列表 *@return:1->非空 0->空 ******************* **** */ int isEmpty(ArrayList *arr) { if(arr!=NULL) return arr->index>0; return 0; } /************************************** *@desc:获取指定位置的元素 *@param:arr->待查找的列表 *@param:index->索引 *@return:NULL->索引错误否则返回元素指针 *************************************** */ Element *getElement(ArrayList *arr,size_t index) { if(arr==NULL||index>=arr->index) return NULL; return &arr->data[index]; } /************************* *@desc:是否包含指定的元素 *@param: elm->元素 *@param: arr->列表 *@param: fun->比较函数 *return 0->包含 -1->不包含 **************************** */ int contains(ArrayList *arr,Element elm) { return arrLstIndexof(arr,elm)>0?0:-1; } /************************** *@desc:获取某个元素的位置 *@param:arr>列表 *@param:elm->元素 *@param: fun->比较函数 *@return:-1->找不到 ************************** */ int arrLstIndexof(ArrayList *arr,Element elm) { if(arr!=NULL) { Element *data = arr->data; size_t i; for(i=0;i<arr->index;i++) if(arr->cmpFun(data[i],elm)==0) return i; } return -1; } /************************ *@desc:移除指定的元素 *@param:arr->待操作的列表 *@param:elm->要移除的元素 *@param:fun->比较函数 *@return:0->失败1->成功 ************************** */ int removeElement(ArrayList *arr,Element elm) { if(arr!=NULL&&arr->data!=NULL) { int i = arrLstIndexof(arr,elm); if(i>0) { Element *data = arr->data; arr->index--; for(;i<arr->index;i++) { data[i] = data[i+1]; } return 1; } } return 0; } #ifdef __cplusplus } #endif #endif //end with ifndef ARRAY_LIST_H //Test.c #include <stdlib.h> #include <stdio.h> #include "MyArrayList.h" void prt(Element x) { printf("%d ",x); } int cmp(int x,int y) { return x==y?0:(x>y?1:-1); } int main(int argc,char *argv[]) { ArrayList *arr=createArrayList(cmp,prt); int i; for(i=0;i<50;i++) { addElement(arr,i); } Element *t = getElement(arr,18); printf("size is %d ",arr->index); printf("getElement(18)->%d ",*t); setElement(arr,10255,18); removeElement(arr,10255); printf("size is %d ",arr->index); t = getElement(arr,18); printf("getElement(18)->%d ",*t); printf("contains(101)->%d ",contains(arr,101)); printf("indexOF(12)->%d ",arrLstIndexof(arr,12)); printArrayList(arr); desrotyArrList(arr); getchar(); return 0; }
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。