May 19
Estructuras de datos
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ñales
- semaforos
- sockets UDP
- sockets TCP
- sockets RAW
- threads
Listas enlazadas simples
list.h
#ifndef LIST_H #define LIST_H #include typedef struct ListElement_ { void *data; struct ListElement_ *next; } ListElement; typedef struct List_ { int size; int (*match*)(const void *key1, const void *key2); void (*destroy)(void *data); ListElement *head; ListElement *tail; } List; void list_init(List *list, void (*destroy)(void *data)); void list_destroy(List *list); int list_ins_next(List *list, ListElement *element, const void *data); int list_rem_next(List *list, ListElement *element, void **data); #define list_size(list) ((list)->size) #define list_head(list) ((list)->head) #define list_tail(list) ((list)->tail) #define list_is_head(list, element) ((element) == (list)->head ? 1 : 0) #define list_is_tail(element) ((element)->next == NULL ? 1 : 0) #define list_data(element) ((element)->data) #define list_next(element) ((element)->next) #endif
list.c
#include #include #include "list.h" void list_init(List *list, void (*destroy)(void *data)){ list->size = 0; list->destroy = destroy; list->head = NULL; list->tail = NULL; } void list_destroy(List *list){ void *data; while(list_size(list) > 0){ if(list_rem_next(list, NULL, (void **)&data) == 0 && list->destroy != NULL){ list->destroy(data); } } memset(list, 0, sizeof List); } int list_ins_next(List *list, ListElement *element, const void *data){ ListElement *new_element; if((new_element = (ListElement *)malloc(sizeof ListElement)) == NULL) return -1; new_element->data = (void *)data; if(element == NULL){ if(list_size(list) == 0) list->tail = new_element; new_element->next = list->head; list->head = new_element; }else{ if(element->next == NULL) list->tail = new_element; new_element->next = element->next; element->next = new_element; } list->size++; return 0; } int list_rem_next(List *list, ListElement *element, void **data){ ListElement *old_element; if(list_size(list) == 0) return -1; if(element == NULL){ *data = list->head->data; old_element = list->head; list->head = list->head->next; if(list->tail(list) == 1) list->tail = NULL; }else{ if(element->next == NULL) return -1; *data = element->next->data; old_element = element->next; element->next = element->next->next; if(element->next == NULL) list->tail = element; } free(old_element); list->size--; return 0; }
TBD
Comentarios desactivados en Estructuras de datos