diff --git a/CMakelists.txt b/CMakelists.txt index f3ff5ce..c1f602d 100644 --- a/CMakelists.txt +++ b/CMakelists.txt @@ -17,8 +17,8 @@ add_subdirectory(test) # 2. 支持GDB set(CMAKE_BUILD_TYPE "Debug") -set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb") -set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall") +set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g --std=c99") +set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall --std=c99") # install set(CMAKE_INSTALL_PREFIX "release") diff --git a/README.md b/README.md index d197205..a6f046c 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,8 @@ 基于C语言实现的通用C库。包含常用数据结构和算法 +> 标准:--std=c99 + ## 数据结构 |数据结构 | 原理 |说明 | |---|---|---| diff --git a/include/deque.h b/include/deque.h index 7e987a8..17f48b5 100644 --- a/include/deque.h +++ b/include/deque.h @@ -54,7 +54,11 @@ struct _deque void (*print)(struct _deque* self); void (*print_obj)(void* obj); }; +typedef struct _deque* deque_t; -bool deque_init(struct _deque* deque, uint32_t obj_size); +bool deque_init(struct _deque* self, uint32_t obj_size); + +deque_t deque_new(void); +void deque_free(deque_t deque); #endif diff --git a/include/queue.h b/include/queue.h index d412c7a..0908255 100644 --- a/include/queue.h +++ b/include/queue.h @@ -84,8 +84,12 @@ struct _queue void (*print)(struct _queue* self); void (*print_obj)(void* obj); }; +typedef struct _queue* queue_t; bool queue_init(struct _queue * queue, uint32_t obj_size); bool queue2_init(struct _queue * queue, uint32_t obj_size, uint32_t capacity); +queue_t queue_new(void); +void queue_free(queue_t queue); + #endif // _QUEUE_H_ diff --git a/src/deque.c b/src/deque.c index f99492c..d41ad80 100644 --- a/src/deque.c +++ b/src/deque.c @@ -294,41 +294,55 @@ void deque_print(struct _deque* self) } } -bool deque_init(struct _deque* deque, uint32_t obj_size) +bool deque_init(struct _deque* self, uint32_t obj_size) { // attribute - deque->_obj_size = obj_size; - deque->_size = 0; - // deque->_capacity = 64; - // deque->_ratio = 2; + self->_obj_size = obj_size; + self->_size = 0; + // self->_capacity = 64; + // self->_ratio = 2; // function - deque->back = deque_back; - deque->clear = deque_clear; - deque->destory = deque_destory; - deque->empty = deque_empty; - deque->erase = deque_erase; - deque->front = deque_front; - deque->get = deque_get; - deque->index = deque_index; - deque->insert = deque_insert; - deque->pop_back = deque_pop_back; - deque->pop_front = deque_pop_front; - deque->push_back = deque_push_back; - deque->push_front = deque_push_front; - deque->print = deque_print; - deque->remove = deque_remove; - deque->set = deque_set; - deque->size = deque_size; + self->back = deque_back; + self->clear = deque_clear; + self->destory = deque_destory; + self->empty = deque_empty; + self->erase = deque_erase; + self->front = deque_front; + self->get = deque_get; + self->index = deque_index; + self->insert = deque_insert; + self->pop_back = deque_pop_back; + self->pop_front = deque_pop_front; + self->push_back = deque_push_back; + self->push_front = deque_push_front; + self->print = deque_print; + self->remove = deque_remove; + self->set = deque_set; + self->size = deque_size; - deque->_head = (struct _deque_node*)malloc(sizeof(struct _deque_node)); - if (deque->_head == NULL) + self->_head = (struct _deque_node*)malloc(sizeof(struct _deque_node)); + if (self->_head == NULL) { return false; } - deque->_head->obj = NULL; - deque->_head->prev = NULL; - deque->_head->next = NULL; + self->_head->obj = NULL; + self->_head->prev = NULL; + self->_head->next = NULL; return true; } + +deque_t deque_new(void) +{ + return (struct _deque*)malloc(sizeof(struct _deque)); +} + +void deque_free(deque_t deque) +{ + if(deque != NULL) + { + deque->destory(deque); + free(deque); + } +} diff --git a/src/list.c b/src/list.c index 6e87e77..a9615b1 100644 --- a/src/list.c +++ b/src/list.c @@ -205,3 +205,17 @@ bool list_init2(struct _list* list, uint32_t obj_size, uint32_t capacity) } return true; } + +list_t list_new(void) +{ + return (struct _list*)malloc(sizeof(struct _list)); +} + +void list_free(list_t list) +{ + if(list != NULL) + { + list->destory(list); + free(list); + } +} diff --git a/src/queue.c b/src/queue.c index 6daaf31..9ff57d2 100644 --- a/src/queue.c +++ b/src/queue.c @@ -462,3 +462,17 @@ bool queue2_init(struct _queue * queue, uint32_t obj_size, uint32_t capacity) queue->_index_front = 0; queue->_index_back = 0; } + +queue_t queue_new(void) +{ + return (struct queue_t *)malloc(sizeof(struct _queue)); +} + +void queue_free(queue_t queue) +{ + if(queue != NULL) + { + queue->destory(queue); + free(queue); + } +} diff --git a/src/stack.c b/src/stack.c index ce512f9..8bf32a8 100644 --- a/src/stack.c +++ b/src/stack.c @@ -304,6 +304,7 @@ void stack_free(stack_t stack) { if(stack) { + stack->destory(stack); free(stack); } } diff --git a/test/test.c b/test/test.c index 03235e9..a714968 100644 --- a/test/test.c +++ b/test/test.c @@ -27,9 +27,9 @@ int main() printf("----- unicstl test -----\n"); // while (1) { - list_test(); + // list_test(); // test_stack(); - // deque_test(); + deque_test(); // queue_test(); // tree_test(); diff --git a/test/test_list.c b/test/test_list.c index ef7cd4f..25dce4c 100644 --- a/test/test_list.c +++ b/test/test_list.c @@ -262,8 +262,12 @@ static void test_list_struct(void) list.print_obj(&temp); printf("\n"); index = -10; - temp.id = 97; - sprintf(temp.name, "robot_%02d", temp.id); + //temp.id = 97; + //sprintf(temp.name, "robot_%02d", temp.id); + // temp = data[0]; + // struct _student robot = {"robot", 97}; + // temp = robot; + temp = (struct _student){"robot", 97}; list.set(&list, index, &temp); printf("list[%4d] = ", index); list.print_obj(&temp); printf("\n");