纯c实现ArrayList

#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;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值