在Java中动态数组为ArrayList, c++ STL中为向量。JAVA、c++中均采用泛型来实现,实现了数据结构与存储类型的分离,在C语言中没有泛型,故采用空指针来实现泛型的效果。
arraylist.h
<代码>的ifndef ARRAY_LIST_H #定义ARRAY_LIST_H # include# include # include typedef MyArrayListNode无效; typedef struct _ArrayList { int长度;//当前长度 int能力;//容量 unsigned int *数据;//数组指针 }MyArrayList;//创建并且返回一个空的ArrayList MyArrayList * ArrayList_Create (int帽);//销毁一个线性表ArrayList 空白ArrayList_Destroy (MyArrayList *列表);//将一个线性表ArrayList中的所有元素清空 空白ArrayList_Clear (MyArrayList *列表);//返回一个线性表ArrayList中的所有元素个数 int ArrayList_Length (MyArrayList *列表);//向一个线性表ArrayList的pos位置处插入新元素节点 int ArrayList_Insert (MyArrayList *列表,MyArrayListNode *节点,int pos);//获取一个线性表ArrayList的pos位置处的元素 MyArrayListNode * ArrayList_Get (MyArrayList *列表,int pos);//删除一个线性表ArrayList的pos位置处的元素返回值为被删除的元素,空表示删除失败 MyArrayListNode * ArrayList_Delete (MyArrayList *列表,int pos);//增加ArrayList空间大小,返回新空间大小 int成长(MyArrayList *列表,int大小); # endif//! ARRAY_LIST_H 代码>
arraylist.c
<代码> # include“arraylist.h” MyArrayList * ArrayList_Create (int能力){ MyArrayList *列表=零; 列表=(MyArrayList *) malloc (sizeof (MyArrayList)); 如果(列表==NULL) { 流(stderr,“创建ArrayList失败。\ n”); 返回NULL; } memset(列表,0,sizeof(列表); 列表→数据=https://www.yisu.com/zixun/(unsigned int *) malloc (sizeof (unsigned int *) *能力); 如果(列表->数据==NULL) { 流(stderr,“malloc数据空间失败。\ n”); 返回NULL; } 列表→能力=能力; 列表→长度=0; 返回列表; } 空白ArrayList_Destroy (MyArrayList *列表){ 如果(列表==NULL) { 返回; } 如果(列表→数据){ 自由(列表→数据); } 免费(列表); } 空白ArrayList_Clear (MyArrayList *列表){ 如果(列表==NULL) { 返回; } 列表→长度=0; } int ArrayList_Length (MyArrayList *列表){ MyArrayList * arrayList=(MyArrayList *)名单; 返回数组列表→长度; } int ArrayList_Insert (MyArrayList *列表,MyArrayListNode *节点,int pos) { 如果(列表==NULL) { 返回1; 流(stderr,“ArrayList是零\ n”); } 如果(pos & lt;0){ 返回2; 流(stderr,“ArrayList是零\ n”); } 如果(列表→长度==列表→容量){ 流(stdout, ArrayList,成长能力\ n”); int ret=成长(列表,列表→容量* 2); 如果(ret==1) { 返回3; } } (int i=列表→长度;我在;pos机;我(){ [我]=列表→数据列表→数据(i - 1); } 列表→数据(pos)=(unsigned int)节点; 列表→长度+=1; 返回0; } MyArrayListNode * ArrayList_Get (MyArrayList *列表,int pos) { 如果(列表==NULL | | pos & lt;0 | | pos祝辞列表→长度){ 流(stderr,“错误的参数\ n”); 返回NULL; } 返回列表(MyArrayListNode *)→数据(pos); } MyArrayListNode * ArrayList_Delete (MyArrayList *列表,int pos) { 如果(列表==NULL | | pos & lt;0 | | pos祝辞列表→长度){ 流(stderr,“错误的参数\ n”); 返回NULL; } MyArrayListNode *节点=(MyArrayListNode *)列表→数据(pos); for (int i=pos + 1;我& lt;列表→长度;我+ +){ 列表→数据(张)=列表→数据(我); } 列表→长度,; 返回节点; } int成长(MyArrayList *列表,int大小){ 如果(列表==NULL | |大小& lt;列表→容量){ 流(stderr,“错误的论点。\ n”); 返回1; } int newSize=大小; 如果(大小比;2 *列表→容量){ newSize=2 *列表→能力; } unsigned int * oldData=https://www.yisu.com/zixun/list->数据; unsigned int * newData=malloc (newSize * sizeof (unsigned int *)); 如果(newData==NULL) { 流(stderr,“成长能力失败。\ n”); 返回1; } 列表→数据=https://www.yisu.com/zixun/newData; memset(列表->数据,0,sizeof(列表->数据)); memcpy(列表->数据、oldData sizeof (oldData) *列表->长度); 列表->=newSize能力; 免费(oldData); 返回newSize; }C语言实现ArrayList(线性表顺序存储结构)