{"id":16243359,"url":"https://github.com/werbenhu/cstl","last_synced_at":"2025-04-08T10:55:12.688Z","repository":{"id":208254718,"uuid":"721101071","full_name":"werbenhu/cstl","owner":"werbenhu","description":"Common Datastructure Library for C language.","archived":false,"fork":false,"pushed_at":"2023-11-29T02:26:57.000Z","size":42,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-02-14T07:17:56.828Z","etag":null,"topics":["array","c","c-language","data-structure","dynamic-array","list","map","queue","stack","vector"],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/werbenhu.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-11-20T11:05:19.000Z","updated_at":"2025-01-01T13:48:55.000Z","dependencies_parsed_at":"2023-11-29T03:32:25.494Z","dependency_job_id":"9df0538e-74f8-40cb-8283-97c25f77c642","html_url":"https://github.com/werbenhu/cstl","commit_stats":null,"previous_names":["werbenhu/cstl"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/werbenhu%2Fcstl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/werbenhu%2Fcstl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/werbenhu%2Fcstl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/werbenhu%2Fcstl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/werbenhu","download_url":"https://codeload.github.com/werbenhu/cstl/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247829472,"owners_count":21002994,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["array","c","c-language","data-structure","dynamic-array","list","map","queue","stack","vector"],"created_at":"2024-10-10T14:14:41.643Z","updated_at":"2025-04-08T10:55:12.638Z","avatar_url":"https://github.com/werbenhu.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n# Common Datastructure Library for **C language**\n\n\u003cdiv\u003e\n\u003ca href=\"https://github.com/werbenhu/cstl/actions\"\u003e\u003cimg src=\"https://img.shields.io/github/actions/workflow/status/werbenhu/cstl/cmake-single-platform.yml?branch=master\u0026label=Build\"\u003e\u003c/a\u003e\n\u003c/div\u003e\n\n### Dynamic Array\n\n```c\n#include \u003cstdio.h\u003e\n#include \u003cstdlib.h\u003e\n#include \u003ctime.h\u003e\n#include \"array.h\"\n\n// Comparison function for sorting and locating the data.\nint data_cmp(void *i, void *j) {\n    return *(int*)i - *(int*)j;\n}\n\n// Swap function for sorting\nint data_swap(void *arr, size_t i, size_t j) {\n    void *i_ptr = NULL;\n    void *j_ptr = NULL;\n\n    // Get elements at indices i and j\n    array_get_by_index(arr, i, \u0026i_ptr);\n    array_get_by_index(arr, j, \u0026j_ptr);\n\n    // Swap the elements\n    void *temp = i_ptr;\n    array_set_by_index(arr, i, j_ptr);\n    array_set_by_index(arr, j, temp);\n    return OK;\n}\n\n// Function to destroy data during array destruction\nvoid data_destroy(void* ctx, void* data) {\n    STL_FREE(data);\n}\n\n// Function to visit data during array traversal\nint data_visit(void* ctx, size_t index, void* data) {\n    printf(\"i:%zu, data:%d\\n\", index, *(int*)data);\n    return OK;\n}\n\nint main() {\n    // Create an array with a data destruction function\n    Array *array = array_create(data_destroy, NULL);\n\n    // Seed the random number generator\n    unsigned int seed = (unsigned int)(time(NULL) + clock());\n    srand(seed);\n\n    int elements_size = 1000000;\n\n    // Populate the array with random integers\n    for (int i = 0; i \u003c elements_size; i++) {\n        int* value = (int*) STL_MALLOC(sizeof(int));\n        *value = rand();\n        array_append(array, value);\n    }\n\n    // Traverse and print the array before sorting\n    array_foreach(array, data_visit, NULL);\n\n    // Sort the array using the defined comparison and swap functions\n    array_sort(array, data_cmp, data_swap);\n\n    // Destroy the array, freeing allocated memory\n    array_destroy(array);\n\n    return 0;\n}\n```\n\n## List\n\n```c\n#include \u003cstdio.h\u003e\n#include \u003cstdlib.h\u003e\n#include \"list.h\"\n\n// Comparison function for locating the data.\nint data_cmp(void *i, void *j) {\n    return (int)(*(size_t *) i - *(size_t *) j);\n}\n\n// Function to destroy data during list destruction\nvoid data_destroy(void* ctx, void* data) {\n    STL_FREE(data);\n}\n\n// Function to visit data during list traversal\nint data_visit(void* ctx, size_t index, void* data) {\n    printf(\"visit index:%zu, data:%d\\n\", index, *(int*)data);\n    return OK;\n}\n\nint main() {\n    // Create a list with a data destruction function\n    List *list = list_create(data_destroy, NULL);\n\n    // Seed the random number generator\n    unsigned int seed = (unsigned int)(time(NULL) + clock());\n    srand(seed);\n\n    int elements_size = 10;\n\n    // Populate the list with random integers\n    for (int i = 0; i \u003c elements_size; i++) {\n        int *data = (int*) STL_MALLOC(sizeof(int));\n        *data = rand();\n        list_append(list, data);\n    }\n\n    // Traverse and print the list before deletion\n    list_foreach(list, data_visit, NULL);\n\n    // Delete the element at index 0\n    list_delete(list, 0);\n    printf(\"size:%zu\\n\", list_length(list));\n\n    // Destroy the list, freeing allocated memory\n    list_destroy(list);\n    return 0;\n}\n```\n\n## Stack\n```c\n#include \u003cstdio.h\u003e\n#include \u003cstdlib.h\u003e\n#include \"stack.h\"\n\n// Function to destroy data during stack destruction\nvoid data_destroy(void* ctx, void* data) {\n    STL_FREE(data);\n}\n\n// Function to visit data during stack traversal\nint data_visit(void* ctx, size_t index, void* data) {\n    printf(\"Visit index:%zu, Data:%d\\n\", index, *(int*)data);\n    return OK;\n}\n\nint main() {\n    // Create a stack with a data destruction function\n    Stack *stack = stack_create(data_destroy, NULL);\n\n    int elements_size = 10;\n\n    // Populate the stack with random integers\n    for (int i = 0; i \u003c elements_size; i++) {\n        int *data = (int*) STL_MALLOC(sizeof(int));\n        *data = rand();\n        stack_push(stack, data);\n    }\n\n    printf(\"Size:%zu\\n\", stack_length(stack));\n    // Traverse and print the stack before deletion\n    stack_foreach(stack, data_visit, NULL);\n\n    for (int i = 0; i \u003c elements_size; i++) {\n        int* top = NULL;\n        stack_top(stack, (void**)\u0026top);\n        printf(\"Top:%d\\n\", *top);\n        stack_pop(stack);\n        printf(\"Size:%zu\\n\", stack_length(stack));\n    }\n\n    // Destroy the stack, freeing allocated memory\n    stack_destroy(stack);\n    return 0;\n}\n```\n\n## Queue\n```c\n#include \u003cstdio.h\u003e\n#include \u003cstdlib.h\u003e\n#include \"queue.h\"\n\n// Function to destroy data during list destruction\nvoid data_destroy(void* ctx, void* data) {\n    STL_FREE(data);\n}\n\n// Function to visit data during list traversal\nint data_visit(void* ctx, size_t index, void* data) {\n    printf(\"Visited index:%zu, data:%d\\n\", index, *(int*)data);\n    return OK;\n}\n\nint main() {\n    // Create a queue with a data destruction function\n    Queue *queue = queue_create(data_destroy, NULL);\n\n    int elements_size = 10;\n\n    // Populate the queue with random integers\n    for (int i = 0; i \u003c elements_size; i++) {\n        int *data = (int*) STL_MALLOC(sizeof(int));\n        *data = rand();\n        queue_push(queue, data);\n    }\n\n    printf(\"Queue size:%zu\\n\", queue_length(queue));\n\n    // Traverse and print the queue before dequeueing\n    printf(\"Queue elements before dequeueing:\\n\");\n    queue_foreach(queue, data_visit, NULL);\n\n    // Dequeue and print the head of the queue\n    for (int i = 0; i \u003c elements_size; i++) {\n        int* head = NULL;\n        queue_head(queue, (void**)\u0026head);\n        printf(\"Dequeued head:%d\\n\", *head);\n        queue_pop(queue);\n        printf(\"Queue size after dequeueing:%zu\\n\", queue_length(queue));\n    }\n\n    // Destroy the queue, freeing allocated memory\n    queue_destroy(queue);\n    return 0;\n}\n```\n\n## Map\n\n```c\n#include \u003cstdio.h\u003e\n#include \u003ctime.h\u003e\n#include \u003cstdlib.h\u003e\n#include \"map.h\"\n#include \u003cstring.h\u003e\n\n// Comparison function for keys\nint kv_cmp(void *i, void *j) {\n    return strcmp((char *) i, (char *) j);\n}\n\n// Key-Value pair destruction function\nvoid kv_destroy(void* ctx, void* key, void* value) {\n    STL_FREE(key);\n    STL_FREE(value);\n}\n\n// Key-Value pair visit function\nint kv_visit(void* ctx, void* key, void* value) {\n    printf(\"ctx:%s, key:%s, value:%s\\n\", (char*)ctx, (char*)key, (char*)value);\n    return OK;\n}\n\n// Hash function for keys\nint hash(void* key) {\n    int k = *(int*)key;\n    return k % 10000;\n}\n\nint main() {\n    // Create a map with key-value destruction function and hash function\n    Map *map = map_create(kv_destroy, NULL, hash);\n\n    // Seed the random number generator\n    unsigned int seed = (unsigned int)(time(NULL) + clock());\n    srand(seed);\n\n    int elements_size = 18;\n\n    // Populate the map with key-value pairs\n    for (int i = 0; i \u003c elements_size; i++) {\n        // Create a key\n        char *key = (char*) STL_MALLOC(16);\n        snprintf(key, 16, \"key%d\", i);\n\n        // Create a value\n        char *value = (char*) STL_MALLOC(16);\n        snprintf(value, 16, \"value%d\", i);\n\n        // Set the key-value pair in the map\n        map_set(map, key, value);\n    }\n\n    // Example of getting a value by key\n    char *k = \"key11\";\n    void* val = NULL;\n    if (map_get(map, kv_cmp, k, \u0026val) != OK) {\n        printf(\"can't find key:%s in map\\n\", k);\n    }\n\n    // Example of deleting keys\n    for (int i = 0; i \u003c 6; i++) {\n        char key[16] = {0};\n        snprintf(key, 16, \"key%d\", i);\n        map_delete(map, kv_cmp, key);\n    }\n\n    // Example of traversing the map and printing key-value pairs\n    char *ctx = \"visit-ctx\";\n    map_foreach(map, kv_visit, ctx);\n\n    printf(\"val:%s\\n\", (char*)val);\n\n    // Destroy the map, freeing allocated memory\n    map_destroy(map);\n    return 0;\n}\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwerbenhu%2Fcstl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwerbenhu%2Fcstl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwerbenhu%2Fcstl/lists"}