[ Foro de C ]
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;
}
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.)