commit a77dbac157dfeccf7bf19c1492656999dcb8bc98
parent 8ec22d2f462b18812f82b9b2e6f33e23a1a4bab4
Author: x0tero <gxoelotero@gmail.com>
Date:   Tue,  5 Mar 2024 11:26:35 +0100
lista dinamica baseada en array
Diffstat:
7 files changed, 182 insertions(+), 0 deletions(-)
diff --git a/lista_dinamica/Makefile b/lista_dinamica/Makefile
@@ -0,0 +1,16 @@
+EXEC := test
+CFLAGS := -Wall
+LDFLAGS :=
+LIBS :=
+CC := gcc
+SRCS := lista_dinamica.c main.c
+OBX := $(SRCS:.c=.o)
+all: $(EXEC)
+$(EXEC): ${OBX}
+	$(CC) $(LDFLAGS) $^ -o $@ $(LIBS)
+lista_dinamica.o: lista_dinamica.c
+	$(CC) $(CFLAGS) $< -c -o $@
+main.o: main.c lista_dinamica.o
+	$(CC) $(CFLAGS) $< -c -o $@
+clean:
+	rm -f $(EXEC) $(OBX)
diff --git a/lista_dinamica/lista_dinamica.c b/lista_dinamica/lista_dinamica.c
@@ -0,0 +1,88 @@
+#include <stdlib.h>
+#include "lista_dinamica.h"
+
+
+dynamic_list_T* init_dynamic_list(size_t item_size){
+    dynamic_list_T* list = calloc(1, sizeof(dynamic_list_T));
+    list->item_size = item_size;
+    list->length = 0;
+    list->items = (void*) 0;
+
+    return list;
+}
+
+
+// Devolve o indice dun elemento se esta na lista e -1 senon esta na lista
+int dynamic_list_find(dynamic_list_T* dynamic_list, void* item, int (*equals_method)(void* x,  void* y)){
+    for(int i = 0; i < dynamic_list->length; i++){
+        if(equals_method(dynamic_list->items[i], item)){
+            return i;
+        }
+    }
+    return -1;
+}
+
+
+void dynamic_list_append(dynamic_list_T* dynamic_list, void* item){
+    dynamic_list->length += 1;
+    if (dynamic_list->items == (void*) 0){ // Se a lista esta baleira reserva memoria para un so elemento
+        dynamic_list->items = calloc(1, dynamic_list->item_size);
+    } else{
+        // re-estructura a memoria reservada (numero de elementos * tamanho do elemento)
+        dynamic_list->items = realloc(dynamic_list->items, dynamic_list->length * dynamic_list->item_size);
+    }
+    dynamic_list->items[dynamic_list->length-1] = item;
+}
+
+
+
+void dynamic_list_shift_left(dynamic_list_T* dynamic_list, int index){
+    for(int i = index; i < dynamic_list->length-1; i++){
+        dynamic_list->items[i] = dynamic_list->items[i+1];
+    }
+}
+
+
+
+int dynamic_list_delete(dynamic_list_T* dynamic_list, int index){
+    if(dynamic_list->length > index){
+        dynamic_list_shift_left(dynamic_list, index);
+        dynamic_list->length -= 1;
+        dynamic_list->items = realloc(dynamic_list->items, dynamic_list->length * dynamic_list->item_size);
+        return 1;
+    }
+    return 0;
+}
+
+
+
+// Comprobar se o obxeto esta na lista e devolver 1 se esta e foi borrado ou 0 se non esta
+int dynamic_list_remove(dynamic_list_T* dynamic_list, void* item, void (*free_method)(void* x)){
+    for(int i = 0; i < dynamic_list->length; i++){
+        // Se atopas o item na lista borralo
+        if( dynamic_list->items[i] == item ){
+            if (free_method) free_method(item); // Libera memoria do item que se pasa x parametro
+            dynamic_list_shift_left(dynamic_list, i);
+            dynamic_list->length -= 1;
+            dynamic_list->items = realloc(dynamic_list->items, dynamic_list->length * dynamic_list->item_size);
+            return 1;
+        }
+    }
+    return 0;
+}
+
+void* dynamic_list_get(dynamic_list_T* dynamic_list, int idx){
+    return dynamic_list->items[idx];
+} 
+
+
+void dynamic_list_free(dynamic_list_T* dynamic_list, void(*free_method)(void* x)){
+    for(int i = 0; i < dynamic_list->length; i++){
+        free_method(dynamic_list->items[i]);
+    }
+
+    free(dynamic_list->items);
+    free(dynamic_list);
+
+}
+
diff --git a/lista_dinamica/lista_dinamica.h b/lista_dinamica/lista_dinamica.h
@@ -0,0 +1,17 @@
+#ifndef DYNAMIC_LIST_H
+#define DYNAMIC_LIST_H
+
+typedef struct DYNAMIC_LIST_STRUCT{
+    size_t item_size;
+    size_t length;
+    void** items;
+} dynamic_list_T;
+
+dynamic_list_T* init_dynamic_list(size_t item_size);
+void dynamic_list_append(dynamic_list_T* dynamic_list, void* item);
+int dynamic_list_find(dynamic_list_T* dynamic_list, void* item, int (*equals_method)(void* x, void* y));
+int dynamic_list_delete(dynamic_list_T* dynamic_list, int index);
+void dynamic_list_free(dynamic_list_T* dynamic_list, void(*free_method)(void* x));
+
+#endif
+
diff --git a/lista_dinamica/lista_dinamica.o b/lista_dinamica/lista_dinamica.o
Binary files differ.
diff --git a/lista_dinamica/main.c b/lista_dinamica/main.c
@@ -0,0 +1,61 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include "lista_dinamica.h"
+
+
+struct TEST_STRUCT{
+    int id;
+    char* name;
+};
+
+
+
+// Funcion para inicializar o struct test (constructor)
+struct TEST_STRUCT* init_test_struct(const char* name){
+    struct TEST_STRUCT* test_struct = calloc(1, sizeof(struct TEST_STRUCT));
+    test_struct->name = calloc(strlen(name)+1, sizeof(char) );
+    strcpy(test_struct->name, name);
+    test_struct->id = 1;
+    return test_struct;
+}
+
+void test_free(void* x){
+    struct TEST_STRUCT* test = (struct TEST_STRUCT*) x;
+    free(test->name);
+    free(test);
+}
+
+// 1: Son iguais, 0: Son diferentes
+int test_equals(void* x, void* y){
+    if ( !strcmp(((struct TEST_STRUCT*) x)->name, ((struct TEST_STRUCT*) y)->name) ){
+        if( ((struct TEST_STRUCT*) x)->id == ((struct TEST_STRUCT*) y)->id )
+            return 1;
+    }
+    return 0;
+}
+
+int main(){
+    dynamic_list_T* list = init_dynamic_list(sizeof(struct TEST_STRUCT*));
+
+    //struct TEST_STRUCT* un = init_test_struct("test1");
+
+    dynamic_list_append(list, init_test_struct("test1"));
+    dynamic_list_append(list, init_test_struct("test2"));
+    dynamic_list_append(list, init_test_struct("test3"));
+
+    //dynamic_list_delete(list, 0);
+    //dynamic_list_remove(list, un, test_free);
+
+    int index = dynamic_list_find(list, init_test_struct("test3"), test_equals);
+    printf("Posicion a borrar: %d\n", index);
+    
+
+    for (int i = 0; i < list->length; i++){
+        printf("Elemento: %s\n", ((struct TEST_STRUCT*)(list->items[i]))->name);
+    }
+
+    dynamic_list_free(list, test_free);
+
+    return 0;
+}
diff --git a/lista_dinamica/main.o b/lista_dinamica/main.o
Binary files differ.
diff --git a/lista_dinamica/test b/lista_dinamica/test
Binary files differ.