array_list.h:
/**************************************************************************
*
* @Author : LYB
* @Date : 2021-02-21 18:58:41
* @LastEditors : LYB
* @LastEditTime : 2021-02-21 18:58:59
* @FilePath : \code\ArrayList\array_list.h
* @Description : 该文件定义为线性链表相关的实现
* 线性链表的特性:
* 1、在内存中的存放地址是连续的
* 优点:
* 1、由于地址的连续性,所以CPU的pc指针寻址的地址空间的范围不会太大,所以随机访问链表的速度非常快,遍历的速度非常快,释放空间也比较快
* 缺点:
* 2、也正是地址的连续性,所以当每次随机插入的时候都要进行链表剩余空间的检查,如果空间不够,然后又要重新分配内存,
* 如果随机插入的位置后面有元素,需要把该位置的元素都要依次往后挪一位,然后在当前位置进行插入,所以这样就造成速度非常慢
*
**************************************************************************/
#ifndef _ARRAY_LIST_H_
#define _ARRAY_LIST_H_
#ifdef __cplusplus
extern "C"
{
#endif
// 链表初始化大小
#define ARRAY_LIST_INIT_SIZE 100
// 链表存满每次增加的大小
#define ARRAY_LIST_INCREASE_SIZE 200
// 定义节点
typedef struct array_node {
void *data; //数据域
} array_node_t;
// 定义链表结构
typedef struct array_list {
array_node_t *node; //数据域
unsigned long length; //链表的当前长度
unsigned long size; //链表的整体大小
} array_list_t;
/**
* 功能:初始化链表
* 返回值:如果成功,则返回链表的地址,如果失败返回NULL
*/
array_list_t *array_list_init();
/**
* @description:
* @param:
* @return:成功返回0,失败返回-1
*/
/**
* 功能:随机插入链表
* 参数:
*pList:链表地址
*pData:插入的数据节点
*index:要插入的位置,如果为0,则默认从链表的开始处插入,如果为-1,则默认从链表的最后插入
* 返回值:成功返回0,失败返回-1
*/
int array_list_insert(array_list_t *pList, void *pData, long index);
/**
* 功能:从某个位置取出元素
* 参数:
*pList:链表地址
*index:位置
* 返回值:返回数据体指针
*/
void *array_list_getat(array_list_t *pList, unsigned long index);
/**
* 功能:通过索引删除元素,删除元素只是将data域置为NULL,并不会释放data指针,由调用者释放
* 参数:
*pList:链表地址
*index:位置
*/
void array_list_removeat(array_list_t *pList, unsigned long index);
/**
* 功能:清空链表
* 参数:
*pList:链表地址
*/
void array_list_clear(array_list_t *pList);
/**
* 功能:释放链表空间
* 参数:
*pList:链表地址
*/
void array_list_free(array_list_t *pList);
/**
* 功能:Array测试
*/
void array_list_test();
#ifdef __cplusplus
} /* end of the 'extern "C"' block */
#endif
#endif
array_list.c:
#include "string.h"
#include "stdio.h"
#include "stdbool.h"
#include "array_list.h"
array_list_t *array_list_init()
{
int i = 0;
array_list_t *list = (array_list_t *)malloc(sizeof(array_list_t));
if (NULL == list) {
return NULL;
}
list->node = (array_node_t *)malloc(sizeof(array_node_t) * ARRAY_LIST_INIT_SIZE);
if (NULL == list->node) {
return NULL;
}
for (i = 0; i < ARRAY_LIST_INIT_SIZE; i++) {
list->node[i].data = 0;
}
list->length = 0;
list->size = ARRAY_LIST_INIT_SIZE;
return list;
}
/**
* @description:
* @param:
* @return:成功返回0,失败返回-1
*/
/**
* 功能:随机插入链表
* 参数:
*list:链表地址
*data:插入的数据节点
*index:要插入的位置,如果为0,则默认从链表的开始处插入,如果为-1,则默认从链表的最后插入
* 返回值:成功返回0,失败返回-1
*/
int array_list_insert(array_list_t *list, void *data, long index)
{
int relloc_size = 0;
int i = 0;
if (NULL == list) {
return -1;
}
if (index < -1 || (index > list->length && index != -1)) {
return -1;
}
if (list->length == list->size -1) {
relloc_size = list->size + ARRAY_LIST_INCREASE_SIZE;
list->node = (array_node_t *)relloc(sizeof(array_node_t) * relloc_size);
if (NULL == list->node) {
return -1;
}
for (i = list->length; i < relloc_size; i++) {
list->node[i].data = 0;
}
list->size = relloc_size;
}
if (0 == index) { /* 从list头部插入数据 */
for (i = list->length; i > 0; i--) {
list->node[i].data = list->node[i - 1].data;
}
list->node[0].data = data;
} else if (-1 == index) { /* 从list尾部插入数据 */
list->node[list->length].data = data;
} else { /* 从list的index位置插入数据 */
for (i = list->length; i > index; i++) {
list->node[i] = list->node[i - 1];
}
list->node[index].data = data;
}
list->length++;
return 0;
}
/**
* 功能:从某个位置取出元素
* 参数:
*list:链表地址
*index:位置
* 返回值:返回数据体指针
*/
void *array_list_getat(array_list_t *list, unsigned long index)
{
void *data = NULL;
if (NULL == list) {
return;
}
if (index < 0 || index > list->length) {
return;
}
data = list->node[index - 1].data;
return data;
}
/**
* 功能:通过索引删除元素,删除元素只是将data域置为NULL,并不会释放data指针,由调用者释放
* 参数:
*list:链表地址
*index:位置
*/
void array_list_removeat(array_list_t *list, unsigned long index)
{
int i = 0;
if (NULL == list) {
return;
}
if (index < 0 || index > list->length) {
return;
}
/* index之后的node全部前移一位 */
for (i = index; i < list->length; i++) {
list->node[i] = list->node[i + 1];
}
/* 最后一个node数据置为NULL */
list->node[list->length - 1].data =NULL;
/* list长度自减1 */
list->length--;
return;
}
/**
* 功能:清空链表
* 参数:
*list:链表地址
*/
void array_list_clear(array_list_t *list)
{
int i = 0;
if (NULL == list) {
return;
}
for (i = 0; i < list->length; i++) {
list->node[i].data = NULL;
}
list->length = 0;
return;
}
/**
* 功能:释放链表空间
* 参数:
*list:链表地址
*/
void array_list_free(array_list_t *list)
{
if (NULL == list) {
return;
}
if (NULL != list->node) {
free(list->node);
list->node = NULL;
}
if (NULL != list) {
free(list);
list = NULL;
}
return;
}
/**
* 功能:Array测试
*/
void array_list_test()
{
}