数据结构学习篇之顺序表(一)(底层是数组)

前言

  1. 通过一些数据结构,来管理单片机的一些资源

头文件

/*******************************************************************************
 Copyright (c) [scl]。保留所有权利。
 ******************************************************************************/
#ifndef STM32_F1XX_TEMPLATE_LINK_TABLE_ARRAY_H
#define STM32_F1XX_TEMPLATE_LINK_TABLE_ARRAY_H

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <stdint.h>

typedef uint32_t E;
#define LIST_ALLOW_DYNAMIC_REALLOC (1) /*允许动态分配内存空间*/
#define LIST_DEFAULT_LEN (10)
#define LIST_REALLOC realloc
#define LIST_MALLOC malloc
struct List {
    E *array; /*数据存放位置*/
    int size; /*表里面存储的元素*/
    int capacity; /*容量*/
};
typedef struct List *ArrayList;

/**
 * 初始化列表
 * @param list
 * @param cap 容量,-1时,使用默认大小
 */
bool init_list(ArrayList list, int cap);
/**
 * 插入数据
 * @param list
 * @param data
 * @param idx
 * @return
 */
bool insert_list(ArrayList list, E data, int idx);
/**
 * 删除数据
 * @param list
 * @param idx
 * @return
 */
bool delete_list(ArrayList list, int idx);

/**
 * 获取指定下标的数据
 * @param list
 * @param idx
 * @return
 */
E *data_list(ArrayList list, int idx);

/**
 * 获取指定元素的下标
 * @param list
 * @param data
 * @return
 */
int idx_list(ArrayList list, const E *data);

/**
 * 获取集合大小
 * @param list
 * @return
 */
static inline int size_list(ArrayList list) {
    return list->size;
}

/**
 * 获取集合容量
 * @param list
 * @return
 */
static inline int capacity_list(ArrayList list) {
    return list->capacity;
}

static inline bool is_full_list(ArrayList list) {
    return list->size == list->capacity;
}

static inline bool is_empty_list(ArrayList list) {
    return list->size == 0;
}

#endif //STM32_F1XX_TEMPLATE_LINK_TABLE_ARRAY_H

源文件

/*******************************************************************************
 Copyright (c) [scl]。保留所有权利。
 ******************************************************************************/
#include "link_table_array.h"

bool init_list(ArrayList list, int cap) {
    if (cap <= 0) cap = LIST_DEFAULT_LEN;
    list->array = (E *) LIST_MALLOC(sizeof(E) * cap);
    if (list->array == NULL) return false;/*申请内存空间失败*/
    list->capacity = cap;
    return true;
}

bool insert_list(ArrayList list, E data, int idx) {
    /*数据验证*/
    if (is_full_list(list)) {
#if LIST_ALLOW_DYNAMIC_REALLOC
        printf("list is full,need realloc memory\r\n");
        int new_cap = list->capacity + list->capacity / 2;
        E *new_arr = LIST_REALLOC(list->array, new_cap);
        if (new_arr == NULL) return false;
        /*指向新开辟的空间,防止内存块被释放*/
        list->array = new_arr;
        list->capacity = new_cap;
#else
        printf("list is full,if need dynamic memory please use LIST_ALLOW_DYNAMIC_REALLOC\r\n");
        return false;
#endif


    }


    /*将位置空出来*/
    for (int i = list->size; i - 1 >= idx; --i) {
        list->array[i] = list->array[i - 1];
    }
    /*添加元素*/
    list->array[idx] = data;
    list->size++;
    return true;
}

bool delete_list(ArrayList list, int idx) {
    if (list->size < idx || idx < 0) return false;
    if (is_empty_list(list)) return true; /*集合为空*/
    for (int i = idx; i < list->size; ++i) {
        list->array[i] = list->array[i + 1];
    }
    list->size--;

    return true;
}

E *data_list(ArrayList list, int idx) {
    if (is_empty_list(list)) return NULL;
    if (list->size < idx || idx < 0) return NULL;

    return &list->array[idx];
}

int idx_list(ArrayList list, const E *data) {
    if (is_empty_list(list) || data == NULL) return -1;

    for (int i = 0; i < list->size; ++i) {
        if (list->array[i] == *data) {
            return i;
        }
    }
    return -1;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

詩不诉卿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值