#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifndef Class
#define Class struct
#endif
Class ArrayList;
typedef Class ArrayList * List;
bool ArrayList_isEmpty(List list);
int ArrayList_size(List list);
void ArrayList_clear(List list);
bool outOfBound(List list, int index);
void adjustCapacity(List list);
void ArrayList_add(List list, int val);
int ArrayList_get(List list, int index);
bool ArrayList_set(List list, int index, int val);
bool ArrayList_remove(List list, int index);
int ArrayList_indexOf(List list, int val);
bool ArrayList_contains(List list, int val);
void destroy(void * p)
{
if(p != NULL)
{
free(p);
}
}
Class ArrayList
{
int capacity;
int * datas;
int count;
bool (*isEmpty)(List list);
int (*size)(List list);
void (*clear)(List list);
void (*add)(List list, int val);
int (*get)(List list, int index);
bool (*set)(List list, int index, int val);
bool (*remove)(List list, int index);
int (*indexOf)(List list, int val);
bool (*contains)(List list, int val);
};
List ArrayList()
{
List obj = (List)malloc(sizeof(Class ArrayList));
obj->capacity = 10;
obj->count = 0;
obj->datas = (int *)malloc(obj->capacity * sizeof(int));
for(int i=0, len=obj->capacity; i<len; i++)
{
obj->datas[i] = 0;
}
obj->isEmpty = ArrayList_isEmpty;
obj->size = ArrayList_size;
obj->clear = ArrayList_clear;
obj->add = ArrayList_add;
obj->get = ArrayList_get;
obj->set = ArrayList_set;
obj->remove = ArrayList_remove;
obj->indexOf = ArrayList_indexOf;
obj->contains = ArrayList_contains;
return obj;
}
bool ArrayList_isEmpty(List list)
{
return list->count == 0;
}
int ArrayList_size(List list)
{
return list->count;
}
void ArrayList_clear(List list)
{
list->count = 0;
int i;
int len = list->capacity;
for(i = 0; i<len; i++)
{
list->datas[i] = 0;
}
}
void ArrayList_add(List list, int val)
{
adjustCapacity(list);
list->datas[list->count++] = val;
}
void adjustCapacity(List list)
{
int * p = NULL;
if(list->count == list->capacity)
{
p = (int *)malloc(list->capacity * 2 * sizeof(int));
if(p == NULL)
{
exit(0);
}
else
{
memcpy(p, list->datas, list->capacity * sizeof(int));
list->capacity = list->capacity * 2;
list->datas = p;
}
}
}
bool outOfBound(List list, int index)
{
return index < 0 || index > list->size(list)-1;
}
int ArrayList_get(List list, int index)
{
if(outOfBound(list, index))
{
return -1;
}
return list->datas[index];
}
bool ArrayList_set(List list, int index, int val)
{
if(outOfBound(list, index))
{
return false;
}
list->datas[index] = val;
return true;
}
bool ArrayList_remove(List list, int index)
{
if(outOfBound(list, index))
{
return false;
}
int i=index, len = list->size(list) - 1;
for(; i < len; i++)
{
list->datas[i] = list->datas[i+1];
list->datas[i+1] = 0;
}
list->count--;
return true;
}
int ArrayList_indexOf(List list, int val)
{
int i;
int len = list->capacity;
for(i = 0; i<len; i++)
{
if(list->datas[i] == val)
{
return i;
}
}
return -1;
}
bool ArrayList_contains(List list, int val)
{
if(list->indexOf(list, val) == -1)
{
return false;
}
else
{
return true;
}
}
void printList(List list)
{
int i=0, len = list->capacity;
for(; i<len; i++)
{
printf("%d\n", list->datas[i]);
}
}
int main()
{
List list = ArrayList();
printList(list);
printf("%s\n", "------------------");
int i;
for(i=0; i<20; i++)
{
list->add(list, (i+1) * 100);
}
printList(list);
printf("%d\n", list->size(list));
printf("%s\n", "------------------");
bool b = list->contains(list, 200);
printf("%d\n",b);
printf("%s\n", "------------------");
printf("%d\n",list->indexOf(list, 100));
printf("%d\n",list->indexOf(list, 300));
printf("%d\n",list->indexOf(list, 2000));
printf("%s\n", "------------------");
printf("%d\n",list->get(list, 19));
printf("%d\n",list->get(list, 20));
printf("%s\n", "------------------");
list->set(list, 19, 10000);
printf("%d\n",list->get(list, 19));
printf("%s\n", "------------------");
list->remove(list, 0);
printf("%d\n",list->size(list));
printList(list);
printf("%s\n", "------------------");
printf("%d\n",list->isEmpty(list));
list->clear(list);
printf("%d\n",list->isEmpty(list));
printf("%d\n",list->get(list, 0));
destroy(list);
return 0;
}
纯c实现ArrayList
最新推荐文章于 2023-07-06 22:03:55 发布