C/Visual C - Listas Dinamicas C.

 
Vista:
sin imagen de perfil

Listas Dinamicas C.

Publicado por SEBASTIAN (4 intervenciones) el 16/09/2022 00:31:10
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;
}
1
 
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Listas Dinamicas C.

Publicado por Tom (619 intervenciones) el 17/09/2022 12:10:48
Probablemente no has hecho caso a ninguno de los warnings que genera el compilador ...
1
if(current->adn == 'g' && current->next->adn == 'g' && current->next->next->adn == 'g') {

Además ... debes separar las condiciones en ese if porque current->next puede ser null (y current->next->next también).

Algo parecido a esto debería valer:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* */
bool new_detectar_g(list_l *l) {
	int c = 0;
 
	if(l) {
		node_t *cur = l->head;
		while(cur) {
			if(cur->adn == 'g') {
				if(c == 2) {
					return true;
				}
				c++;
			} else {
				c = 0;
			}
			cur = cur->next;
		}
	}
	return false;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Listas Dinamicas C.

Publicado por SEBASTIAN (4 intervenciones) el 18/09/2022 01:42:55
muchas gracias , me ayudo bastante a entenderlo y solucionar mi problema !!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Listas Dinamicas C.

Publicado por SEBASTIAN (4 intervenciones) el 18/09/2022 02:41:09
bool new_detectarA_C(list_t* l){
int c = 0;

if(l) {
node_t* current = l->head;
while(current){
if((current->ADN == 'a') || (current->ADN == 'c')){
if(c == 1){
return true;
}
c++;
}else{
c = 0;
}
current = current->next;
}
}
return false;


Estaba probando ese codigo para detectar cuando hay 2 a seguidas O 2 c seguidas pero creo que no esta correcto, seria mucha molestia que me puedas ayudar en esa ultima funcion por favor?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar