ArrayList

 

#ifndef SEQUENCE_LIST_H
#define SEQUENCE_LIST_H

typedef void* sequence_list;

sequence_list create_sequence_list();
void destroy_sequence_list(sequence_list list);
void clear_sequence_list(sequence_list list);
int size_sequence_list(sequence_list list);
void* get_sequence_list(sequence_list list, int pos);
int insert_sequence_list(sequence_list list, void *data, int pos);
int remove_by_position_sequence_list(sequence_list list, int pos);
int remove_by_value_sequence_list(sequence_list list, void *data, int(*compare)(void* data1, void* data2));


#endif // !SEQUENCE_LIST_H
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "sequence_list.h"

#define MAX 1024

typedef struct tag_inner_sequence_list{
	void **dataArray;
	int capacity;
	int size;
}inner_sequence_list;


sequence_list create_sequence_list()
{
	//静态开辟链表空间
	inner_sequence_list *inner_list = (inner_sequence_list *)malloc(sizeof(inner_sequence_list));
	//内存分配检查
	if (inner_list == NULL)
	{
		return NULL;
	}
	//初始化开辟的内存空间,做一个负责任的人。
	memset(inner_list, 0, sizeof(inner_sequence_list));

	//给数据域分配内存
	inner_list->dataArray = malloc(sizeof(void* )*MAX);
	if (inner_list->dataArray == NULL)
	{
		return NULL;
	}
	memset(inner_list->dataArray, 0, sizeof(void*)*MAX);

	inner_list->capacity = MAX;
	inner_list->size = 0;
	
	return inner_list;
}

void destroy_sequence_list(sequence_list list)
{
	inner_sequence_list *inner_list = NULL;
	void **dataArray = NULL;

	if (list == NULL)
	{
		return;
	}
	inner_list = (inner_sequence_list *)list;
	dataArray = inner_list->dataArray;
	if (dataArray != NULL)
	{
		free(dataArray);
	}
	free(inner_list);
	return;
}

void clear_sequence_list(sequence_list list)
{
	inner_sequence_list *inner_list = NULL;

	if (list == NULL)
	{
		return;
	}
	inner_list = (inner_sequence_list *)list;
	inner_list->size = 0;

	return;
}

int size_sequence_list(sequence_list list)
{
	inner_sequence_list *inner_list = NULL;
	int size = 0;

	if (list == NULL)
	{
		return -1;
	}
	inner_list = (inner_sequence_list *)list;
	size = inner_list->size;
	return	size;
}

void* get_sequence_list(sequence_list list, int pos)
{
	inner_sequence_list *inner_list = NULL;

	if (list == NULL)
	{
		return NULL;
	}
	inner_list = (inner_sequence_list *)list;
	if ((pos < inner_list->size) && (pos >= 0))
	{
		void *m = inner_list->dataArray[pos];
		return m;
	}
	else
	{
		return NULL;
	}
}

int insert_sequence_list(sequence_list list, void *data, int pos)
{
	inner_sequence_list *inner_list = NULL;
	
	//输入检查
	if ((list == NULL) || (data == NULL))
	{
		return -1;							//无效的链表或者数据
	}
	inner_list = (inner_sequence_list *)list;

	//check pos 
	if ((pos < 0) || (pos > inner_list->size))
	{
		return -1;
	}

	//容量检查
	if (inner_list->size == inner_list->capacity)
	{
		inner_list->capacity = inner_list->capacity * 2;
		//重新开辟内存
		void **data_temp = malloc(sizeof(void *)*inner_list->capacity);
		if (data_temp == NULL)
		{
			return -1;
		}
		memset(data_temp,0, sizeof(void *)*inner_list->capacity);
		//内存数据copy
		memcpy(data_temp,inner_list->dataArray, sizeof(void *)*inner_list->capacity);
		inner_list->dataArray = data_temp;
		//插入数据
		inner_list->dataArray[inner_list->size] = data;
		inner_list->size++;
		return 0;
	}
	else
	{
		int i ;
		for ( i = inner_list->size-1; i >= pos; i--)
		{
			inner_list->dataArray[i+1] = inner_list->dataArray[i];
		}

		//插入数据
		inner_list->dataArray[pos] = data;
		inner_list->size++;
		return	0;
	}
}

int remove_by_position_sequence_list(sequence_list list, int pos)
{
	inner_sequence_list * inner_list = NULL;
	int i = 0;

	if (list == NULL)
	{
		return -1;
	}
	inner_list = (inner_sequence_list *)list;
	if ((pos < 0) || (pos >= inner_list->size))
	{
		return -1;
	}
	for (i = pos; i < inner_list->size - 1; i++)
	{
		inner_list->dataArray[i] = inner_list->dataArray[i + 1];
	}

	inner_list->size--;
	return	0;
}

int remove_by_value_sequence_list(sequence_list list, void *data,int (*compare)(void* data1,void* data2)) {
	int i, flag = 0;

	if ((list == NULL)|| (data == NULL))
	{
		return -1;
	}
	inner_sequence_list *inner_list = (inner_sequence_list *)list;
	for (i = 0; i < inner_list->size; i++)
	{
		if (compare(inner_list->dataArray[i], data)) {
			flag = 1;
			break;
		}
	}
	if (0==flag)
	{
		return 0;
	}
	else
	{
		return remove_by_position_sequence_list(list, i);
	}
}
//link_list test program

#include <stdlib.h>
#include <stdio.h>
#include "sequence_list.h"


int cp(void *t1, void *t2) {
	if (*(int*)t1 == *(int*)t2) {
		return 1;
	}
	else
	{
		return 0;
	}
}


int main(int argc, char** argv)
{

	sequence_list slist = create_sequence_list();
	int a1 = 31;
	int a2 = 32;
	int a3 = 33;
	int a4 = 34;
	int a5 = 35;
	int a6 = 36;
	int i = 0;


	insert_sequence_list(slist, &a1, 0);
	insert_sequence_list(slist, &a2, 0);
	insert_sequence_list(slist, &a3, 0);
	insert_sequence_list(slist, &a4, 0);
	insert_sequence_list(slist, &a5, 0);
	insert_sequence_list(slist, &a6, 0);

	int len = size_sequence_list(slist);
	printf("length: %d\n", len);

	for (i = 0; i < len; i++)
	{
		int* node = (int*)get_sequence_list(slist, i);
		printf("the %dth: %d\n", i, *node);
	}
	remove_by_value_sequence_list(slist, &a1, cp);
	printf("删除后的长度:%d\n", size_sequence_list(slist));

	for (i = 0; i < len; i++)
	{
		remove_by_position_sequence_list(slist, 0);
		printf("正在删除 the %dth\n", i);
	}
	printf("删除后的长度:%d\n", size_sequence_list(slist));

	clear_sequence_list(slist);
	destroy_sequence_list(slist);

	system("pause");
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东风吹柳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值