commit 8ec22d2f462b18812f82b9b2e6f33e23a1a4bab4
Author: x0tero <gxoelotero@gmail.com>
Date: Tue, 5 Mar 2024 11:06:46 +0100
lista dinamica de nodos en C
Diffstat:
4 files changed, 218 insertions(+), 0 deletions(-)
diff --git a/lista_nodos/Makefile b/lista_nodos/Makefile
@@ -0,0 +1,14 @@
+EXEC := test
+CFLAGS := -Wall
+LDFLAGS :=
+LIBS :=
+CC := gcc
+SRCS := lista_nodos.c main.c
+OBX := $(SRCS:.c=.o)
+all: $(EXEC)
+$(EXEC): ${OBX}
+ $(CC) $(LDFLAGS) $^ -o $@ $(LIBS)
+main.o: main.c lista_nodos.o
+ $(CC) $(CFLAGS) $< -c -o $@
+clean:
+ rm -f $(EXEC) $(OBX)
diff --git a/lista_nodos/lista_nodos.c b/lista_nodos/lista_nodos.c
@@ -0,0 +1,111 @@
+#include <stdlib.h>
+#include "lista_nodos.h"
+
+
+NODE_LIST_T* init_node_list() {
+ NODE_LIST_T* list = malloc(sizeof(NODE_LIST_T));
+ list->head = NULL;
+ list->tail = NULL;
+ list->length = 0;
+ return list;
+}
+
+
+int node_list_append(void* item, NODE_LIST_T* list) {
+ NODE_T* node = malloc(sizeof(NODE_T));
+ node->item = item;
+ node->sig = NULL;
+ if (list->head == NULL) list->head = node;
+ else list->tail->sig = node;
+
+ list->tail = node;
+ list->length++;
+ return 1;
+}
+
+
+// Devolve NULL se o indice e maior que o tamanho da lista
+// ou se a lista e baleira, de outra forma devolve void* item
+void* node_list_get(int index, NODE_LIST_T* list) {
+ if (list->head == NULL) return NULL;
+ else{
+ NODE_T* tmp = list->head;
+ for(int i = 0; i < index; i++){
+ if(tmp->sig == NULL) return NULL;
+ else tmp = tmp->sig;
+ }
+ return tmp->item;
+ }
+}
+
+
+void node_list_print(NODE_LIST_T* list, void (*print_method)(void* x, int y)) {
+ NODE_T* tmp = list->head;
+ for(int i = 0; i < list->length; i++){
+ print_method(tmp->item, i);
+ tmp = tmp->sig;
+ }
+}
+
+
+// Devolve o indice do obxeto ou -1 senon esta
+int node_list_find(NODE_LIST_T* list, void* item, int (*equals_method)(void* x, void* y)) {
+ NODE_T* tmp = list->head;
+ for(int i = 0; i < list->length; i++){
+ if (equals_method(tmp->item, item)){
+ return i;
+ }
+ tmp = tmp->sig;
+ }
+ return -1;
+}
+
+
+// Elimina un elemento dada a posicion na lista (devolve 0 se non se puido eliminar, 1 se si se puido)
+int node_list_delete(int index, NODE_LIST_T* list, void (*free_method)(void* x)) {
+ if (list->head == NULL) return 0;
+ else if (list->head == list->tail) {
+ // Deixar a lista baleira
+ if (free_method) free_method(list->head->item);
+ free(list->head);
+ list->head = NULL;
+ list->tail = NULL;
+ }
+ else if (index == 0) {
+ NODE_T* tmp = list->head;
+ list->head = list->head->sig;
+ if (free_method) free_method(tmp->item);
+ free(tmp);
+ }
+ else{
+ NODE_T** tmp = &list->head;
+ NODE_T* aux;
+ for(int i = 0; i < index; i++){
+ if((*tmp)->sig == NULL) return 0;
+ else {
+ tmp = &((*tmp)->sig);
+ }
+ }
+ aux = *tmp;
+ *tmp = (*tmp)->sig;
+
+ free_method(aux->item);
+ free(aux);
+ }
+ list->length--;
+ return 1;
+}
+
+
+void node_list_free(NODE_LIST_T* list, void(*free_method)(void* x)) {
+ if (list->head == NULL) return;
+ NODE_T* tmp = list->head;
+ NODE_T* aux;
+ for(int i = 0; i < list->length; i++){
+ aux = tmp;
+ tmp = tmp->sig;
+ free_method(aux->item);
+ free(aux);
+ }
+ free(list);
+}
diff --git a/lista_nodos/lista_nodos.h b/lista_nodos/lista_nodos.h
@@ -0,0 +1,27 @@
+#ifndef NODE_LIST_H
+#define NODE_LIST_H
+
+// Typedef declaration
+
+typedef struct NODE{
+ void* item;
+ struct NODE* sig;
+} NODE_T;
+
+typedef struct NODE_LIST{
+ NODE_T* head;
+ NODE_T* tail;
+ int length;
+} NODE_LIST_T;
+
+// Function declaration
+
+NODE_LIST_T* init_node_list();
+int node_list_append(void* item, NODE_LIST_T* list);
+void* node_list_get(int index, NODE_LIST_T* list);
+void node_list_print(NODE_LIST_T* list, void (*print_method)(void* x, int y));
+int node_list_find(NODE_LIST_T* list, void* item, int (*equals_method)(void* x, void* y));
+int node_list_delete(int index, NODE_LIST_T* list, void (*free_method)(void* x));
+void node_list_free(NODE_LIST_T* list, void(*free_method)(void* x));
+
+#endif
diff --git a/lista_nodos/main.c b/lista_nodos/main.c
@@ -0,0 +1,66 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include "lista_nodos.h"
+
+
+struct TEST_STRUCT{
+ int id;
+ char* name;
+};
+
+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;
+}
+
+void test_print(void* item, int index){
+ printf("Elemento %d: %s\n", index, ((struct TEST_STRUCT*)(item))->name );
+}
+
+
+int main(){
+ NODE_LIST_T* list = init_node_list();
+ struct TEST_STRUCT* item1 = init_test_struct("test1");
+
+ printf("list size: %d\n", list->length);
+
+ node_list_append(item1, list);
+ node_list_append(init_test_struct("test2"), list);
+ node_list_append(init_test_struct("test3"), list);
+ node_list_append(init_test_struct("test4"), list);
+ node_list_append(init_test_struct("test5"), list);
+ node_list_append(init_test_struct("test6"), list);
+
+ node_list_delete(2, list, test_free);
+
+ node_list_print(list, test_print);
+ printf("list size: %d\n", list->length);
+
+ int indexf = node_list_find(list, init_test_struct("test6"), test_equals);
+ printf("Index found: %d", indexf);
+
+ node_list_free(list, test_free);
+ return 0;
+
+}