This commit is contained in:
JiXieShi
2024-06-21 15:21:42 +08:00
parent 9d4fd5a082
commit cd1bb16183
8 changed files with 207 additions and 184 deletions

View File

@@ -1,3 +1,4 @@
#pragma once
#ifndef HW_LIB_LIST_H
#define HW_LIB_LIST_H
#ifdef __cplusplus
@@ -6,59 +7,59 @@ extern "C" {
#include <stdbool.h>
typedef struct node { //节点结构
typedef struct List_Node_t { //节点结构
void *data;
struct node *next;
} node;
struct List_Node_t *next;
} List_Node_t;
typedef struct { //链表结构
struct node *head;
struct node *tail;
struct List_Node_t *head;
struct List_Node_t *tail;
long len;
} List;
} List_t;
/**
* @brief 初始化链表
* @param list: [输入] 链表指针
* @return void
* @example list_init(&myList);
* @example list_init(&myList_t);
*/
extern void list_init(List *list);
extern void list_init(List_t *list);
/**
* @brief 检查链表是否为空
* @param list: [输入] 链表指针
* @return bool 若链表为空返回true否则返回false
* @example if (list_is_empty(&myList)) { // do something }
* @example if (list_is_empty(&myList_t)) { // do something }
*/
extern bool list_is_empty(List *list);
extern bool list_is_empty(List_t *list);
/**
* @brief 在链表尾部插入元素
* @param list: [输入] 链表指针
* @param data: [输入] 待插入的数据指针
* @return void
* @example list_insert(&myList, newData);
* @example list_insert(&myList_t, newData);
*/
extern void list_insert(List *list, void *data);
extern void list_insert(List_t *list, void *data);
/**
* @brief 在链表头部插入元素
* @param list: [输入] 链表指针
* @param data: [输入] 待插入的数据指针
* @return void
* @example list_insert_at_head(&myList, newData);
* @example list_insert_at_head(&myList_t, newData);
*/
extern void list_insert_at_head(List *list, void *data);
extern void list_insert_at_head(List_t *list, void *data);
/**
* @brief 在链表尾部插入元素
* @param list: [输入] 链表指针
* @param data: [输入] 待插入的数据指针
* @return void
* @example list_insert_at_tail(&myList, newData);
* @example list_insert_at_tail(&myList_t, newData);
*/
extern void list_insert_at_tail(List *list, void *data);
extern void list_insert_at_tail(List_t *list, void *data);
/**
* @brief 在指定位置插入元素
@@ -66,9 +67,9 @@ extern void list_insert_at_tail(List *list, void *data);
* @param data: [输入] 待插入的数据指针
* @param idx: [输入] 插入位置索引
* @return void
* @example list_insert_at_index(&myList, newData, 2);
* @example list_insert_at_index(&myList_t, newData, 2);
*/
extern void list_insert_at_index(List *list, void *data, long idx);
extern void list_insert_at_index(List_t *list, void *data, long idx);
/**
* @brief 删除链表中指定元素
@@ -76,9 +77,9 @@ extern void list_insert_at_index(List *list, void *data, long idx);
* @param key: [输入] 待删除的数据指针
* @param compare: [输入] 比较函数指针
* @return void* 返回被删除元素的数据若未找到返回NULL
* @example deletedData = list_delete(&myList, keyData, compareFunc);
* @example deletedData = list_delete(&myList_t, keyData, compareFunc);
*/
extern void *list_delete(List *list, void *key, int (*compare)(const void *, const void *));
extern void *list_delete(List_t *list, void *key, int (*compare)(const void *, const void *));
/**
* @brief 在链表中查找指定元素
@@ -86,61 +87,61 @@ extern void *list_delete(List *list, void *key, int (*compare)(const void *, con
* @param key: [输入] 待查找的数据指针
* @param compare: [输入] 比较函数指针
* @return void* 返回找到的元素的数据若未找到返回NULL
* @example foundData = list_search(&myList, keyData, compareFunc);
* @example foundData = list_search(&myList_t, keyData, compareFunc);
*/
extern void *list_search(List *list, void *key, int (*compare)(const void *, const void *));
extern void *list_search(List_t *list, void *key, int (*compare)(const void *, const void *));
/**
* @brief 对链表进行排序
* @param list: [输入] 链表指针
* @param compare: [输入] 比较函数指针
* @return void
* @example list_sort(&myList, compareFunc);
* @example list_sort(&myList_t, compareFunc);
*/
extern void list_sort(List *list, int (*compare)(const void *, const void *));
extern void list_sort(List_t *list, int (*compare)(const void *, const void *));
/**
* @brief 遍历链表并对每个元素执行指定操作
* @param list: [输入] 链表指针
* @param handle: [输入] 处理函数指针
* @return void
* @example list_traverse(&myList, handleFunc);
* @example list_traverse(&myList_t, handleFunc);
*/
extern void list_traverse(List *list, void (*handle)(void *));
extern void list_traverse(List_t *list, void (*handle)(void *));
/**
* @brief 反转链表
* @param list: [输入] 链表指针
* @return void
* @example list_reverse(&myList);
* @example list_reverse(&myList_t);
*/
extern void list_reverse(List *list);
extern void list_reverse(List_t *list);
/**
* @brief 获取链表长度
* @param list: [输入] 链表指针
* @return long 返回链表中元素个数
* @example length = list_get_lenth(&myList);
* @example length = list_get_lenth(&myList_t);
*/
extern long list_get_lenth(List *list);
extern long list_get_lenth(List_t *list);
/**
* @brief 获取链表指定位置的元素
* @param list: [输入] 链表指针
* @param idx: [输入] 元素索引
* @return void* 返回指定位置的元素指针若索引无效返回NULL
* @example element = list_get_element(&myList, 3);
* @example element = list_get_element(&myList_t, 3);
*/
extern void *list_get_element(List *list, int idx);
extern void *list_get_element(List_t *list, int idx);
/**
* @brief 销毁链表
* @param list: [输入] 链表指针
* @param destroy: [输入] 数据销毁函数指针
* @return void
* @example list_destroy(&myList, destroyFunc);
* @example list_destroy(&myList_t, destroyFunc);
*/
extern void list_destroy(List *list, void (*destroy)(void *data));
extern void list_destroy(List_t *list, void (*destroy)(void *data));
#ifdef __cplusplus
}

View File

@@ -1,3 +1,4 @@
#pragma once
#ifndef HW_LIB_QUEUE_H
#define HW_LIB_QUEUE_H
#ifdef __cplusplus
@@ -7,34 +8,36 @@ extern "C" {
/**
* @brief 双向链表节点结构体
*/
typedef struct DoublyListNode {
typedef struct Queue_Node_t {
void *val; // 节点值
struct DoublyListNode *next; // 后继节点
struct DoublyListNode *prev; // 前驱节点
} DoublyListNode;
struct Queue_Node_t *next; // 后继节点
struct Queue_Node_t *prev; // 前驱节点
} Queue_Node_t;
/**
* @brief 双端队列结构体
*/
typedef struct {
DoublyListNode *front, *rear; // 头节点 front ,尾节点 rear
Queue_Node_t *front, *rear; // 头节点 front ,尾节点 rear
int queSize; // 双向队列的长度
} LinkedListDeque;
size_t typeSize; // 元素类型的大小
} Queue_List_t;
/**
* @brief 创建一个新的双端队列
* @return LinkedListDeque* 返回新创建的双端队列指针
* @example deque = newLinkedListDeque();
* @param typeSize: [输入] 元素类型的大小
* @return Queue_List_t* 返回新创建的双端队列指针
* @example deque = newQueue_List(sizeof(int));
*/
extern LinkedListDeque *newLinkedListDeque();
extern Queue_List_t *newQueue_List(unsigned char size);
/**
* @brief 销毁双端队列
* @param deque: [输入] 双端队列指针
* @return void
* @example delLinkedListdeque(deque);
* @example delQueue_List(deque);
*/
extern void delLinkedListdeque(LinkedListDeque *deque);
extern void delQueue_List(Queue_List_t *deque);
/**
* @brief 获取队列大小
@@ -42,7 +45,7 @@ extern void delLinkedListdeque(LinkedListDeque *deque);
* @return int 返回队列中元素个数
* @example size = queue_size(deque);
*/
extern int queue_size(LinkedListDeque *deque);
extern int queue_size(Queue_List_t *deque);
/**
* @brief 检查队列是否为空
@@ -50,7 +53,7 @@ extern int queue_size(LinkedListDeque *deque);
* @return bool 若队列为空返回true否则返回false
* @example if (queue_is_empty(deque)) { // do something }
*/
extern bool queue_is_empty(LinkedListDeque *deque);
extern bool queue_is_empty(Queue_List_t *deque);
/**
* @brief 在队列头部插入元素
@@ -59,7 +62,7 @@ extern bool queue_is_empty(LinkedListDeque *deque);
* @return void
* @example pushFirst(deque, newData);
*/
extern void pushFirst(LinkedListDeque *deque, void *data);
extern void pushFirst(Queue_List_t *deque, void *data);
/**
* @brief 在队列尾部插入元素
@@ -68,7 +71,7 @@ extern void pushFirst(LinkedListDeque *deque, void *data);
* @return void
* @example pushLast(deque, newData);
*/
extern void pushLast(LinkedListDeque *deque, void *data);
extern void pushLast(Queue_List_t *deque, void *data);
/**
* @brief 获取队列头部元素但不移除
@@ -76,7 +79,7 @@ extern void pushLast(LinkedListDeque *deque, void *data);
* @return void* 返回队列头部元素的指针若队列为空返回NULL
* @example firstData = peekFirst(deque);
*/
extern void *peekFirst(LinkedListDeque *deque);
extern void *peekFirst(Queue_List_t *deque);
/**
* @brief 获取队列尾部元素但不移除
@@ -84,24 +87,14 @@ extern void *peekFirst(LinkedListDeque *deque);
* @return void* 返回队列尾部元素的指针若队列为空返回NULL
* @example lastData = peekLast(deque);
*/
extern void *peekLast(LinkedListDeque *deque);
/**
* @brief 弹出队列头部或尾部元素
* @param deque: [输入] 双端队列指针
* @param isFront: [输入] 若为true则从头部弹出否则从尾部弹出
* @return void* 返回被弹出元素的指针若队列为空返回NULL
* @example poppedData = pop(deque, true);
*/
extern void *pop(LinkedListDeque *deque, bool isFront);
extern void *peekLast(Queue_List_t *deque);
/**
* @brief 弹出队列头部元素
* @param deque: [输入] 双端队列指针
* @return void* 返回被弹出的头部元素的指针若队列为空返回NULL
* @example poppedData = popFirst(deque);
*/
extern void *popFirst(LinkedListDeque *deque);
extern void *popFirst(Queue_List_t *deque);
/**
* @brief 弹出队列尾部元素
@@ -109,7 +102,7 @@ extern void *popFirst(LinkedListDeque *deque);
* @return void* 返回被弹出的尾部元素的指针若队列为空返回NULL
* @example poppedData = popLast(deque);
*/
extern void *popLast(LinkedListDeque *deque);
extern void *popLast(Queue_List_t *deque);
#ifdef __cplusplus