ArrayList

あってるのかよく分からず。

…てゆーか、ポインタで要素を保持してるのはまずいか…


#include
#include

typedef struct _List {
int initial_capacity;
int capacity;
int size;
void **items;
} List;

void List_chcapa(List *l) {
void **new_items;
int new_capacity;
int i;

new_capacity = (l->size - (l->size % l->initial_capacity)) + l->initial_capacity;
new_items = calloc(new_capacity, sizeof(void*));

for(i=0; isize; i++)
new_items[i] = l->items[i];

if(l->items != NULL)
free(l->items);

l->items = new_items;
l->capacity = new_capacity;
}

List *new_List() {
List *l;

l = malloc(sizeof(List));
l->initial_capacity = 10;
l->capacity = 10;
l->size = 0;
l->items = NULL;
List_chcapa(l);
return l;
}

void List_add(List *l, void *item) {
l->size++;

if(l->size > l->capacity)
List_chcapa(l);

l->items[l->size - 1] = item;
}

void *List_get(List *l, int idx) {
int i;

if(idx >= l->size)
return NULL;

return l->items[idx];
}

void *List_delete(List *l, int idx) {
void *item;
int i;

if(idx >= l->size)
return NULL;

item = l->items[idx];

for(i=(idx+1); isize; i++)
l->items[i-1] = l->items[i];

l->size--;

if(l->size <= (l->capacity - l->initial_capacity))
List_chcapa(l);

return item;
}

void List_release(List *l) {
free(l->items);
free(l);
}

int main() {
List *l;
char *str;
int i;

l = new_List();
List_add(l, "aaaaa");
List_add(l, "bbbbb");
List_add(l, "ccccc");
List_add(l, "ddddd");
List_add(l, "eeeee");
List_add(l, "fffff");
List_add(l, "AAAAA");
List_add(l, "BBBBB");
List_add(l, "CCCCC");
List_add(l, "DDDDD");
List_add(l, "EEEEE");
List_add(l, "FFFFF");

List_delete(l, 6);
List_delete(l, 6);
List_delete(l, 6);

for(i=0; isize; i++) {
str = List_get(l, i);
printf("%s\n", str);
}

List_release(l);
return 0;
}