重构
This commit is contained in:
+51
-47
@@ -1,65 +1,69 @@
|
||||
#include <c_PtrLinkBag.h>
|
||||
#include <c_Memory.h>
|
||||
|
||||
c_err_t c_PtrLinkBag_Init(c_PtrLinkBag_t* self) {
|
||||
|
||||
|
||||
/* ------------------------------------------------------------------------------------------------------------------ */
|
||||
/* */
|
||||
|
||||
// 原地初始化:绑定分配器并建立哑哨兵头节点
|
||||
c_err_t c_PtrLinkBag_Init(c_PtrLinkBag_t* self, c_Allocator_t* allocator) {
|
||||
if (!self) return C_ERR_PARAM;
|
||||
self->head= NULL;
|
||||
|
||||
// 内置绑定:如果传入 NULL,无缝降级为系统默认分配器
|
||||
self->allocator = (allocator != NULL) ? *allocator : c_DefaultAllocator;
|
||||
self->size = 0;
|
||||
self->head = 0;
|
||||
return C_ERR_OK;
|
||||
}
|
||||
|
||||
void c_PtrLinkBag_Destroy(c_PtrLinkBag_t* self) {
|
||||
if (!self) return;
|
||||
c_PtrLinkBagNode_t* p = self->head;
|
||||
while (p) {
|
||||
c_PtrLinkBagNode_t* q = p->next;
|
||||
C_FREE(p);
|
||||
p = q;
|
||||
}
|
||||
self->head = NULL;
|
||||
// 快速头插法 (真正的 O(1) 尾部或头部无抖动挂载)
|
||||
c_PtrLinkNode_t* c_PtrLinkBag_Add(c_PtrLinkBag_t* self, void* ptr) {
|
||||
if (!self || !ptr) return NULL;
|
||||
|
||||
// 内部闭环调用自身的内置管理器
|
||||
c_PtrLinkNode_t* new_node = (c_PtrLinkNode_t*)c_Allocator_Alloc(&self->allocator, sizeof(c_PtrLinkNode_t));
|
||||
if (!new_node) return NULL;
|
||||
|
||||
new_node->ptr = ptr;
|
||||
new_node->next = self->head;
|
||||
self->head = new_node;
|
||||
|
||||
self->size++;
|
||||
return new_node;
|
||||
}
|
||||
|
||||
c_err_t c_PtrLinkBag_Add(c_PtrLinkBag_t* self, void* item) {
|
||||
if (!self) return C_ERR_PARAM;
|
||||
c_PtrLinkBagNode_t* p;
|
||||
C_NEW(p);
|
||||
if (!p) {
|
||||
return C_ERR_NOMEM;
|
||||
}
|
||||
p->ptr = item;
|
||||
p->next = self->head;
|
||||
self->head = p;
|
||||
return C_ERR_OK;
|
||||
}
|
||||
// 基于二级指针的自主安全裁剪 (O(N) 线性过滤)
|
||||
c_err_t c_PtrLinkBag_Remove(c_PtrLinkBag_t* self, void* ptr) {
|
||||
if (!self || !self->head || !ptr) return C_ERR_PARAM;
|
||||
|
||||
c_err_t c_PtrLinkBag_Remove(c_PtrLinkBag_t* self, const void* item) {
|
||||
if (!self) return C_ERR_PARAM;
|
||||
c_PtrLinkBagNode_t** curr = &self->head;
|
||||
while (*curr != NULL) {
|
||||
if ((*curr)->ptr == item) {
|
||||
c_PtrLinkBagNode_t* entry = *curr;
|
||||
*curr = entry->next;
|
||||
C_FREE(entry);
|
||||
// 二级指针指向 Dummy Head 的下一个节点指针坑位物理地址
|
||||
c_PtrLinkNode_t** pp = &(self->head->next);
|
||||
|
||||
while (*pp != NULL) {
|
||||
c_PtrLinkNode_t* entry = *pp;
|
||||
if (entry->ptr == ptr) {
|
||||
// 精妙裁剪:前驱节点的 next 直接指去被删节点的下一跳
|
||||
*pp = entry->next;
|
||||
|
||||
// 内部自主物理销毁,账实同步
|
||||
c_Allocator_Free(&self->allocator, entry);
|
||||
self->size--;
|
||||
return C_ERR_OK;
|
||||
}
|
||||
curr = &(*curr)->next;
|
||||
pp = &(entry->next);
|
||||
}
|
||||
|
||||
return C_ERR_NOTFOUND;
|
||||
}
|
||||
|
||||
void c_PtrLinkBagIter_Remove(c_PtrLinkBagIter_t* self) {
|
||||
// 防呆檢查:確保迭代器有效,且當前指向的節點不為空
|
||||
if (!self || !self->node || !*(self->node)) return;
|
||||
|
||||
c_PtrLinkBagNode_t* to_delete = *(self->node);
|
||||
// 彻底解体
|
||||
void c_PtrLinkBag_Destroy(c_PtrLinkBag_t* self) {
|
||||
if (!self) return;
|
||||
|
||||
// 將當前結構中維護的指標(可能是上一節點的 next,或是 bag 的 head)
|
||||
// 修改為指向下一個節點,直接從鏈結串列中斷開
|
||||
*(self->node) = to_delete->next;
|
||||
|
||||
// 釋放記憶體
|
||||
C_FREE(to_delete);
|
||||
|
||||
// 注意:此時 self->node 自動更新指向了原本的下一個節點
|
||||
// 使用者不需要再呼叫 Next(),即可直接對新節點進行 Get() 或再次 Remove()
|
||||
while (self->head != NULL) {
|
||||
c_PtrLinkNode_t* entry = self->head;
|
||||
self->head = entry->next;
|
||||
c_Allocator_Free(&self->allocator, entry);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user