C语言实现ArrayList(线性表顺序存储结构)

  

在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(线性表顺序存储结构)