[ Foro de C ]

Listas dinamicas C

16-Sep-2022 00:35
Invitado (SEBASTIAN)
1 Respuestas

Muy buenas tardes quisiera saber si alguien me puede ayudar a encontrar la solucion en este codigo, en la funcion detectar_g() quisiera comprobar que 3 caracteres seguidos de mi lista sean "g" y en caso de que si esten muestren que es mutante , caso contrario muestre que es humano pero en mi codigo siempre me muestra humano a pesar de que el archivo de entrada que le estoy pasando si tiene 3 "g" seguidas, alguien podria ayudarme con la solucion?



#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

typedef struct __list_node_t *__link;

typedef struct __list_node_t {
   char ADN;
   __link next;
} node_t;

// Podría definirse la lista como un puntero a node_t, de modo que no se maneje una estructura
// independiente para esta
typedef struct {
   node_t *head;
} list_t;
node_t* list_create_node(char x){
   node_t* new = malloc(sizeof(node_t));
   // Importante no llegar y terminar el programa, pues puede haber memoria por liberar fuera
   // de esta función
   if(!new){
       fprintf(stderr, "Memoria insuficiente.\n");
       return NULL;
   }

   // Inicializa los valores del nodo, particularmente el puntero al próximo, que debe partir nulo
   new->ADN = x;
   new->next = NULL;

   return new;
}


list_t* list_insert_node(list_t* l, char x){
   node_t* new = list_create_node(x);

   if(!new){
       return l;
   }

   // La forma "natural" de insertar en una lista es buscar dónde hay un espacio y esto suele
   // pasar al final
   if(!l->head){
       // Si no hay nada, inserta al inicio
       l->head = new;
   } else {
       // Si no, busca el último nodo
       node_t *x = l->head;
       while(x->next){
           x = x->next;
       }
       x->next = new;
   }

   return l;
}


void list_clean(list_t* l){
   node_t* current = l->head;
   while(current){
       node_t* t = current->next;
       free(current);
       current = t;
   }

   l->head = NULL;
}



void list_print(list_t* l){
   node_t* next = l->head;
   while(next){
       printf("%c -> ", next->ADN);
       next = next->next;
   }
}
int detectar_g(list_t* l, int x){
   node_t* current = l->head;
   int i;
   i = 0;
   while(current){
       if(current->ADN == "g" && current->next == "g" && current->next->next == "g"){

           i = 1;
           current = NULL;
       }else{
           current = current->next;

       }

  }
   return i;
}

int main(){
   char filename[] = "entrada2.txt";
   // Inicializa lista
   list_t list;
   list.head = NULL;

   FILE *input = fopen(filename, "r");
   if(!input){
       perror(filename);
       return -1;
   }


   char letter = fgetc(input);
   while( letter != EOF ){

       list_insert_node(&list, letter);
       letter = fgetc(input);
   }


   fclose(input);
   list_print(&list);
   if(detectar_g(&list, letter) == 1){
       printf("es mutante");


      } else{
           printf("es humano");
       }









   return 0;
}


19-Sep-2022 22:51
Invitado (ignacio)

hola sebastian

he visto fallos en el código, creo que lo más sencillo es que veas un par de videos de makigas que lo explica muy bien y rápido

en el primer video explica las listas enlazadas y en el segundo escribe todo el código en c, cada video es de unos 15min

verás que bien lo explica y lo claro que queda el código

https://www.makigas.es/series/estructuras-de-datos/listas-enlazadas-teoria
https://www.makigas.es/series/estructuras-de-datos/listas-enlazadas-en-c

suerte ;-)






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)