#include /* ------------------------------------------------------------------------------------------------------------------ */ /* */ // 原地初始化:绑定分配器并建立哑哨兵头节点 c_err_t c_PtrLinkBag_Init(c_PtrLinkBag_t* self, c_Allocator_t* allocator) { if (!self) return C_ERR_PARAM; // 内置绑定:如果传入 NULL,无缝降级为系统默认分配器 self->allocator = (allocator != NULL) ? *allocator : c_DefaultAllocator; self->size = 0; self->head = 0; return C_ERR_OK; } // 快速头插法 (真正的 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; } // 基于二级指针的自主安全裁剪 (O(N) 线性过滤) c_err_t c_PtrLinkBag_Remove(c_PtrLinkBag_t* self, void* ptr) { if (!self || !self->head || !ptr) return C_ERR_PARAM; // 二级指针指向 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; } pp = &(entry->next); } return C_ERR_NOTFOUND; } // 彻底解体 void c_PtrLinkBag_Destroy(c_PtrLinkBag_t* self) { if (!self) return; while (self->head != NULL) { c_PtrLinkNode_t* entry = self->head; self->head = entry->next; c_Allocator_Free(&self->allocator, entry); } }