造轮子之-C语言实现ArrayList

简介: 造轮子之-C语言实现ArrayList

造轮子之-C语言实现ArrayList


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()
{
}
相关文章
|
存储 Linux C语言
生产者消费者模式保姆级教程 (阻塞队列解除耦合性) 一文帮你从C语言版本到C++ 版本, 从理论到实现 (一文足以)
生产者消费者模式保姆级教程 (阻塞队列解除耦合性) 一文帮你从C语言版本到C++ 版本, 从理论到实现 (一文足以)
生产者消费者模式保姆级教程 (阻塞队列解除耦合性) 一文帮你从C语言版本到C++ 版本, 从理论到实现 (一文足以)
|
存储 C语言
c语言实现扫雷(含循环递归展开)
本笔记通过c语言实现扫雷小游戏(包含递归展开) 游戏实现逻辑位于test.c文件,整个游戏头文件位于game.h,游戏进程的具体操作于game.c中实现。
188 0
c语言实现扫雷(含循环递归展开)
|
C语言
c语言实现三子棋(内含阅读思路,简单易实现)
本文如果按顺序来阅读可能不太好接受,建议阅读顺序为,由test.c的逻辑顺序读下去,遇见具体函数的实现跳转到game.c中来理解
150 0
c语言实现三子棋(内含阅读思路,简单易实现)
|
搜索推荐 C语言
【指针进阶三】实现C语言快排函数qsort&回调函数
【指针进阶三】实现C语言快排函数qsort&回调函数
113 0
【指针进阶三】实现C语言快排函数qsort&回调函数
|
C语言
【让你从0到1学会c语言】字符串函数详解及模拟实现(二)
【让你从0到1学会c语言】字符串函数详解及模拟实现(二)
209 0
【让你从0到1学会c语言】字符串函数详解及模拟实现(二)
|
程序员 C语言
【让你从0到1学会c语言】字符串函数详解及模拟实现(一)
【让你从0到1学会c语言】字符串函数详解及模拟实现(一)
128 0
【让你从0到1学会c语言】字符串函数详解及模拟实现(一)
|
C语言
C语言实现学生管理系统(顺序表版)
C语言实现学生管理系统(顺序表版)
C语言实现学生管理系统(顺序表版)
|
C语言
C语言之回调函数(非常重要)附带回调函数版本实现整型的加减乘除四则运算
C语言之回调函数(非常重要)附带回调函数版本实现整型的加减乘除四则运算
145 0
C语言之回调函数(非常重要)附带回调函数版本实现整型的加减乘除四则运算
|
存储 Java Linux
纯C语言Socket实现聊天室
最近在学习嵌入式开发,练习C语言小项目,基本是参考别人的代码,做了些修改实现了聊天室,纯C语言编写。
322 0
纯C语言Socket实现聊天室
|
C语言
C语言,实现爱心代码
纯C语言代码,实现动态爱心的效果
378 0
C语言,实现爱心代码