{"id":878,"date":"2024-05-19T10:38:24","date_gmt":"2024-05-19T08:38:24","guid":{"rendered":"https:\/\/www.blackhats.es\/wordpress\/?page_id=878"},"modified":"2024-06-02T20:41:33","modified_gmt":"2024-06-02T18:41:33","slug":"estructuras-de-datos","status":"publish","type":"page","link":"https:\/\/www.blackhats.es\/wordpress\/?page_id=878","title":{"rendered":"Estructuras de datos"},"content":{"rendered":"<p>Estructuras de datos fundamentales:<\/p>\n<ul>\n<li>listas enlazadas simples<\/li>\n<li>listas enlazadas dobles<\/li>\n<li>listas circulares<\/li>\n<li>listas doblemente enlazadas<\/li>\n<li>pilas<\/li>\n<li>colas<\/li>\n<li>arboles<\/li>\n<li>arboles binarios de busqueda<\/li>\n<li>arboles AVL<\/li>\n<li>arboles rojinegros<\/li>\n<li>mmaps<\/li>\n<li>sets<\/li>\n<li>tablas hash<\/li>\n<li>monticulos<\/li>\n<li>grafos<\/li>\n<\/ul>\n<p>Otros temas relacionados:<\/p>\n<ul>\n<li>se\u00f1ales<\/li>\n<li>semaforos<\/li>\n<li>sockets UDP<\/li>\n<li>sockets TCP<\/li>\n<li>sockets RAW<\/li>\n<li>threads<\/li>\n<\/ul>\n<h2>Listas enlazadas simples<\/h2>\n<h3>list.h<\/h3>\n<pre style=\"padding-left: 40px;\">#ifndef LIST_H\r\n#define LIST_H\r\n\r\n#include \r\n\r\ntypedef struct ListElement_ {\r\n    void *data;\r\n    struct ListElement_ *next;\r\n} ListElement;\r\n\r\ntypedef struct List_ {\r\n    int size;\r\n\r\n    int (*match*)(const void *key1, const void *key2);\r\n    void (*destroy)(void *data);\r\n\r\n    ListElement *head;\r\n    ListElement *tail;\r\n} List;\r\n\r\nvoid list_init(List *list, void (*destroy)(void *data));\r\nvoid list_destroy(List *list);\r\nint list_ins_next(List *list, ListElement *element, const void *data);\r\nint list_rem_next(List *list, ListElement *element, void **data);\r\n\r\n#define list_size(list) ((list)-&gt;size)\r\n#define list_head(list) ((list)-&gt;head)\r\n#define list_tail(list) ((list)-&gt;tail)\r\n#define list_is_head(list, element) ((element) == (list)-&gt;head ? 1 : 0)\r\n#define list_is_tail(element) ((element)-&gt;next == NULL ? 1 : 0)\r\n#define list_data(element) ((element)-&gt;data)\r\n#define list_next(element) ((element)-&gt;next)\r\n\r\n#endif\r\n<\/pre>\n<h3>list.c<\/h3>\n<pre style=\"padding-left: 40px;\">#include \r\n#include \r\n\r\n#include \"list.h\"\r\n\r\nvoid list_init(List *list, void (*destroy)(void *data)){\r\n    list-&gt;size = 0;\r\n    list-&gt;destroy = destroy;\r\n    list-&gt;head = NULL;\r\n    list-&gt;tail = NULL;\r\n}\r\n\r\nvoid list_destroy(List *list){\r\n    void *data;\r\n\r\n    while(list_size(list) &gt; 0){\r\n        if(list_rem_next(list, NULL, (void **)&amp;data) == 0 &amp;&amp; list-&gt;destroy != NULL){\r\n            list-&gt;destroy(data);\r\n        }\r\n    }\r\n\r\n    memset(list, 0, sizeof List);\r\n}\r\n\r\nint list_ins_next(List *list, ListElement *element, const void *data){\r\n    ListElement *new_element;\r\n\r\n    if((new_element = (ListElement *)malloc(sizeof ListElement)) == NULL)\r\n        return -1;\r\n\r\n    new_element-&gt;data = (void *)data;\r\n\r\n    if(element == NULL){\r\n        if(list_size(list) == 0)\r\n            list-&gt;tail = new_element;\r\n\r\n        new_element-&gt;next = list-&gt;head;\r\n        list-&gt;head = new_element;\r\n    }else{\r\n        if(element-&gt;next == NULL)\r\n            list-&gt;tail = new_element;\r\n\r\n        new_element-&gt;next = element-&gt;next;\r\n        element-&gt;next = new_element;\r\n    }\r\n\r\n    list-&gt;size++;\r\n    return 0;\r\n}\r\n\r\nint list_rem_next(List *list, ListElement *element, void **data){\r\n    ListElement *old_element;\r\n\r\n    if(list_size(list) == 0)\r\n        return -1;\r\n\r\n    if(element == NULL){\r\n        *data = list-&gt;head-&gt;data;\r\n        old_element = list-&gt;head;\r\n        list-&gt;head = list-&gt;head-&gt;next;\r\n\r\n        if(list-&gt;tail(list) == 1)\r\n            list-&gt;tail = NULL;\r\n    }else{\r\n        if(element-&gt;next == NULL)\r\n            return -1;\r\n\r\n        *data = element-&gt;next-&gt;data;\r\n        old_element = element-&gt;next;\r\n        element-&gt;next = element-&gt;next-&gt;next;\r\n\r\n        if(element-&gt;next == NULL)\r\n            list-&gt;tail = element;\r\n    }\r\n\r\n    free(old_element);\r\n    list-&gt;size--;\r\n    return 0;\r\n}\r\n<\/pre>\n<h3>TBD<\/h3>\n","protected":false},"excerpt":{"rendered":"<p>Estructuras de datos fundamentales: listas enlazadas simples listas enlazadas dobles listas circulares listas doblemente enlazadas pilas colas arboles arboles binarios de busqueda arboles AVL arboles rojinegros mmaps sets tablas hash monticulos grafos Otros temas relacionados: se\u00f1ales semaforos sockets UDP sockets TCP sockets RAW threads Listas enlazadas simples list.h #ifndef LIST_H #define LIST_H #include typedef struct [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-878","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/pages\/878"}],"collection":[{"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=878"}],"version-history":[{"count":5,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/pages\/878\/revisions"}],"predecessor-version":[{"id":890,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/pages\/878\/revisions\/890"}],"wp:attachment":[{"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=878"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}