前言
- 通过一些数据结构,来管理单片机的一些资源
头文件
#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;
bool init_list(ArrayList list, int cap);
bool insert_list(ArrayList list, E data, int idx);
bool delete_list(ArrayList list, int idx);
E *data_list(ArrayList list, int idx);
int idx_list(ArrayList list, const E *data);
static inline int size_list(ArrayList list) {
return list->size;
}
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
源文件
#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;
}