#include #include #include #include struct __LLNode { int val; struct __LLNode *next; }; typedef struct __LLNode LLNode; size_t LL_length(LLNode *root); void LL_free(LLNode **root); LLNode *LL_create_node(int val) { LLNode *node = (LLNode*)malloc(sizeof(LLNode)); node->val = val; node->next = NULL; return node; } void LL_push_back(LLNode **root, LLNode *val) { if (root == NULL) { *root = val; return; } LLNode *current = *root; while (current->next != NULL) { current = current->next; } current->next = val; } bool LL_insert_at(LLNode **root, LLNode *val, size_t index) { if (index == 0) { LLNode *tmp = *root; *root = val; val->next = tmp; return true; } if (LL_length(*root) < index) { return false; } LLNode *current = *root; index--; while (index--) { current = current->next; } LLNode *tmp = current->next; current->next = val; val->next = tmp; return false; } bool LL_delete_at(LLNode **root, size_t index) { if (index == 0 && root != NULL) { *root = (*root)->next; return true; } if (LL_length(*root) < index) { return false; } LLNode *current = *root; index--; while (index--) { current = current->next; } LLNode *tmp = current->next->next; LLNode *del = current->next; del->next = NULL; LL_free(&del); current->next = tmp; return true; } size_t LL_length(LLNode *root) { if (root == NULL) return 0; LLNode *current = root; size_t len = 1; while (current->next != NULL) { current = current->next; len++; } return len; } void LL_display(LLNode *root) { if (root == NULL) { printf("\n"); return; } printf("%d", root->val); LLNode *current = root->next; while (current) { printf(" -> %d", current->val); current = current->next; } printf("\n"); } void LL_free(LLNode **node) { LLNode *current = *node; while (current->next) { LLNode *tmp = current; current = current->next; free(tmp); } free(current); *node = NULL; } typedef struct { LLNode *root; size_t sz; } Stack; Stack *Stack_new() { Stack *stack = (Stack *)malloc(sizeof(Stack)); if (!stack) return NULL; stack->root = LL_create_node(INT_MAX); stack->sz = 0; return stack; } int Stack_top(Stack *stack) { return stack->root->next->val; } void Stack_push(Stack *stack, int val) { LLNode *cur = stack->root; while (cur->next) { cur = cur->next; } cur->next = LL_create_node(val); } int Stack_pop(Stack *stack) { LLNode *prev = stack->root; LLNode *cur = stack->root->next; while (cur->next) { prev = cur; cur = cur->next; } prev->next = NULL; return cur->val; } bool Stack_is_empty(Stack *stack) { return stack->root->next == NULL; } int main() { Stack *st = Stack_new(); for (int i = 1; i <= 10; i++) { Stack_push(st, i); } printf("Stack is %s\n", Stack_is_empty(st) ? "empty" : "not empty"); while (!Stack_is_empty(st)) { printf("%d ", Stack_pop(st)); } printf("\n"); return 0; }