C语言实现支持多类型的ArrayList
来源:互联网 发布:不用网络的好玩游戏 编辑:程序博客网 时间:2024/04/30 14:27
//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\n",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\n",arr->index); printf("getElement(18)->%d\n",*t); setElement(arr,10255,18); removeElement(arr,10255); printf("size is %d\n",arr->index); t = getElement(arr,18); printf("getElement(18)->%d\n",*t); printf("contains(101)->%d\n",contains(arr,101)); printf("indexOF(12)->%d\n",arrLstIndexof(arr,12)); printArrayList(arr); desrotyArrList(arr); getchar(); return 0;}