From 9e4b7bc4b108aafda28451fd6847ef0ea0a9b54a Mon Sep 17 00:00:00 2001 From: guishenking Date: Tue, 19 Aug 2025 21:02:54 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=8F=92=E5=85=A5=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E7=9A=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 5 ++++ src/lib/list/list.c | 60 ++++++++++++++++++++++++++++++++++++++++--- src/lib/list/list.h | 10 +++++--- src/main.c | 6 ++--- 4 files changed, 70 insertions(+), 11 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..20d5904 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "files.associations": { + "stdbool.h": "c" + } +} \ No newline at end of file diff --git a/src/lib/list/list.c b/src/lib/list/list.c index 1cf0fec..3eb7596 100644 --- a/src/lib/list/list.c +++ b/src/lib/list/list.c @@ -37,9 +37,9 @@ bool list_init(list_t *list, size_t elem_size) { * @return true * @return false */ -bool list_enlist(list_t *list, const void *value) { +bool list_push(list_t *list, const void *value) { // 分配新节点 - if (list->size >= list_MAX_SIZE) { + if (list->size >= LIST_MAX_SIZE) { return false; } list_node_t *node = (list_node_t *)malloc(sizeof(list_node_t)); @@ -80,7 +80,7 @@ bool list_enlist(list_t *list, const void *value) { * @return true * @return false */ -bool list_delist_head(list_t *list, void *value) { +bool list_pop_head(list_t *list, void *value) { // 检查队列是否为空 if (list->size == 0) { return false; @@ -109,7 +109,7 @@ bool list_delist_head(list_t *list, void *value) { * @return true * @return false */ -bool list_delist_tail(list_t *list, void *value) { +bool list_pop_tail(list_t *list, void *value) { if (list->size == 0) { return false; } @@ -156,6 +156,58 @@ bool list_peek_at(const list_t *list, size_t index, void *value) { return true; } +/** + * @brief 插入一个数据到队列指定位置 + * + * @param list + * @param index + * @param value + * @return true + * @return false + */ +bool list_insert_at(list_t *list, size_t index, const void *value){ + if (index > list->size || list->size >= LIST_MAX_SIZE) { + return false; // 越界或队列已满 + } + list_node_t *node = (list_node_t *)malloc(sizeof(list_node_t)); + if (!node) { + return false; // 内存分配失败 + } + node->data = malloc(list->elem_size); + if (!node->data) {// 数据分配失败,释放节点 + free(node); + return false; // 数据分配失败 + } + memcpy(node->data, value, list->elem_size); + + if (index == 0) { + // 插入到头部 + node->next = list->head; + list->head = node; + if (list->size == 0) { + list->tail = node; // 如果队列之前为空,更新尾部指针 + } + } else { + // 插入到中间或尾部 + list_node_t *prev = NULL; + list_node_t *current = list->head; + for (size_t i = 0; i < index; ++i) { + prev = current; + current = (current ? current->next : NULL); + } + node->next = current; + if (prev) { + prev->next = node; + } + if (current == NULL) { + list->tail = node; // 如果插入到尾部,更新尾部指针 + } + } + + list->size++; + return true; +} + /** * @brief 遍历队列 * diff --git a/src/lib/list/list.h b/src/lib/list/list.h index de75b16..64aa79d 100644 --- a/src/lib/list/list.h +++ b/src/lib/list/list.h @@ -14,7 +14,7 @@ #include #include -#define list_MAX_SIZE (1024) +#define LIST_MAX_SIZE (1024) // 定义队列节点 typedef struct list_node { void *data; @@ -33,15 +33,17 @@ typedef struct { bool list_init(list_t *list, size_t elem_size); // 入队操作 -bool list_enlist(list_t *list, const void *value); +bool list_push(list_t *list, const void *value); // 出队操作 // 从队列头部出队 -bool list_delist_head(list_t *list, void *value); +bool list_pop_head(list_t *list, void *value); // 从队列尾部出队 -bool list_delist_tail(list_t *list, void *value); +bool list_pop_tail(list_t *list, void *value); // 查询队列指定位置的数据 bool list_peek_at(const list_t *list, size_t index, void *value); +// 插入数据 +bool list_insert_at(list_t *list, size_t index, const void *value); // 遍历队列 void list_foreach(const list_t *list, void (*func)(void *data, size_t index)); // 抛弃队列前n个数据 diff --git a/src/main.c b/src/main.c index 6697465..e94378f 100755 --- a/src/main.c +++ b/src/main.c @@ -27,7 +27,7 @@ int main(void) { // 入队 for (int i = 1; i <= 10; ++i) { - ret = list_enlist(&q, &i); + ret = list_push(&q, &i); printf("Enlist %d: %s\n", i, ret ? "OK" : "FAIL"); } list_foreach(&q, print_int); @@ -40,14 +40,14 @@ int main(void) { // 从头部出队 for (int i = 0; i < 2; ++i) { - if (list_delist_head(&q, &val)) { + if (list_pop_head(&q, &val)) { printf("Delist head: %d\n", val); } } list_foreach(&q, print_int); // 从尾部出队 - if (list_delist_tail(&q, &val)) { + if (list_pop_tail(&q, &val)) { printf("Delist tail: %d\n", val); } list_foreach(&q, print_int);