开始设计

This commit is contained in:
2026-08-10 01:21:15 +08:00
commit e45398991f
228 changed files with 20827 additions and 0 deletions
+98
View File
@@ -0,0 +1,98 @@
#include <c_LinkStack.h>
#include <c_Memory.h>
#include "c_Alignment.h"
/* ------------------------------------------------------------------------------------------------------------------ */
/* */
c_err_t c_LinkStack_Init(c_LinkStack_t* self, int obj_size) {
if (!self || obj_size <= 0) return C_ERR_PARAM;
self->head = NULL;
self->obj_size = obj_size;
self->size = 0;
return C_ERR_SUCCESS;
}
// 銷毀堆疊並釋放所有配置的節點與資料記憶體
void c_LinkStack_Destroy(c_LinkStack_t* self) {
if (!self) return;
c_LinkStackNode_t* current = self->head;
while (current != NULL) {
c_LinkStackNode_t* next = current->next;
C_FREE(current);
current = next;
}
self->head = NULL;
self->size = 0;
}
// 推入元素:採用頭插法實作 O(1) 頂端推入,並深複製資料內容
c_err_t c_LinkStack_Push(c_LinkStack_t* self, void* obj) {
if (!self || !obj) return C_ERR_PARAM;
int size = sizeof(c_LinkStackNode_t) + self->obj_size;
size = C_ALIGN_UPB(size, C_ALIGN_SIZE);
c_LinkStackNode_t* new_node = (c_LinkStackNode_t*)C_ALLOC(size);
if (!new_node) return C_ERR_NOMEM;
new_node->data = new_node+1;
// 值複製 (Value Copy)
memcpy(new_node->data, obj, self->obj_size);
// 頭插法連結
new_node->next = self->head;
self->head = new_node;
self->size++;
return C_ERR_SUCCESS;
}
// 彈出頂端元素:將 `head` 的資料值複製給使用者,隨後釋放該前端節點 (O(1))
c_err_t c_LinkStack_Pop(c_LinkStack_t* self, void* obj) {
if (!self || !obj) return C_ERR_PARAM;
if (self->size == 0 || !self->head) return C_ERR_EMPTY;
c_LinkStackNode_t* to_delete = self->head;
// 將資料複製到呼叫端提供的緩衝區
memcpy(obj, to_delete->data, self->obj_size);
// 斷開頂端節點,head 指向下一個
self->head = to_delete->next;
// 釋放資源
C_FREE(to_delete);
self->size--;
return C_ERR_SUCCESS;
}
// 查看目前最頂端的元素指標 (O(1),不移除節點)
void* c_LinkStack_Peek(c_LinkStack_t* self) {
if (!self || !self->head || self->size == 0) return NULL;
return self->head->data;
}
void c_LinkStackIter_Remove(c_LinkStackIter_t* self) {
// 防呆檢查:確保迭代器有效、繫結的堆疊存在,且當前指向的節點不為空
if (!self || !self->stack || !self->node || !*(self->node)) return;
c_LinkStackNode_t* to_delete = *(self->node);
// 關鍵指標轉移:
// 將當前結構中維護的指標(可能是前一節點的 next,或是 stack 的 head
// 修改為指向下一個節點,直接從鏈結串列中斷開該節點
*(self->node) = to_delete->next;
// 釋放節點內深複製的資料空間與節點結構本體
C_FREE(to_delete);
// 同步遞減堆疊的總大小
self->stack->size--;
// 注意:由於 *(self->node) 已被賦值為 to_delete->next
// self->node 目前已自動指向了原本的下一個節點。
// 使用者不需要再手動呼叫 Next(),即可直接對新位置進行 Get()、Next() 或再次 Remove()。
}