Foros del Web » Programación para mayores de 30 ;) » C/C++ »

¿Porque esta lista enlazada funciona rara? (C)

Estas en el tema de ¿Porque esta lista enlazada funciona rara? (C) en el foro de C/C++ en Foros del Web. Hola de nuevo! Estoy ahora estudiando listas enlazadas y estoy teniendo una ardua lucha con una. Compilado con Eclipse. El programa lo que hace es ...
  #1 (permalink)  
Antiguo 05/04/2008, 05:25
 
Fecha de Ingreso: enero-2008
Mensajes: 22
Antigüedad: 16 años, 4 meses
Puntos: 0
De acuerdo ¿Porque esta lista enlazada funciona rara? (C)

Hola de nuevo!

Estoy ahora estudiando listas enlazadas y estoy teniendo una ardua lucha con una.

Compilado con Eclipse.

El programa lo que hace es cargar una lista enlazada de 5 elementos y busca el elemento que le pidas.

Problemas:

Introduzco los datos: 1,2,3,4 y 5.

Si busco cualquiera esos números dice que existe el elemento en la lista. Eso esta bien.

Pero por ejemplo si busco el 6, no me dice absolutamente nada, cuando debería decirme algo.

Código:
	if(pA->data==num)
		printf("El elemento se encuentra en la lista");
	else
		printf("El elemento no se encuentra en la lista");
Código:
#include <stdio.h>
#include <stdlib.h>
#define NUMREG 5

struct FINT{
	int data;
	struct FINT *next;
};

void buscar (struct FINT *pA,int num)
{

	while(pA!=NULL && pA->data!=num)
	{
		pA=pA->next;
	}
	
	
	if(pA->data==num)
		printf("El elemento se encuentra en la lista");
	else
		printf("El elemento no se encuentra en la lista");
	// Esto no lo imprime nunca
}

int main()
{
	setbuf(stdout,NULL);
	struct FINT *pA,*nuevo;
	pA=NULL;
	nuevo=NULL;
	
	
	int x;
	for(x=0;x<NUMREG;x++)
	{
		nuevo=(struct FINT*)malloc(sizeof(struct FINT));
		printf("Introduzca un dato:");
		scanf("%d",&nuevo->data);
		nuevo->next=pA;
		pA=nuevo;
	}

	
	int num;
	puts("Introduzca el numero que desea buscar en la lista");
	scanf("%d",&num);
	buscar(pA,num);
		
	return 0;
}
Saludos y gracias anticipadas por cualquier ayuda que puedan prestarme :D

Última edición por athiria; 05/04/2008 a las 06:34
  #2 (permalink)  
Antiguo 05/04/2008, 05:53
 
Fecha de Ingreso: marzo-2008
Mensajes: 22
Antigüedad: 16 años, 2 meses
Puntos: 1
Re: ¿Porque esta lista enlazada funciona rara?

Código:
// ....................
void buscar (struct FINT *pA,int num)
{
	int found = FALSE;
	
	while(pA != NULL)
	{
		if(pA->data == num)
		{
			found = TRUE;
			break;
		}
		pA = pA->next;
	}
	if(found)
		printf("El elemento se encuentra en la lista\n");
	else
		printf("El elemento no se encuentra en la lista\n");
	// Esto no lo imprime nunca
}
  #3 (permalink)  
Antiguo 05/04/2008, 06:05
 
Fecha de Ingreso: enero-2008
Mensajes: 22
Antigüedad: 16 años, 4 meses
Puntos: 0
Re: ¿Porque esta lista enlazada funciona rara?

Gracias Germancho.

Sin embargo no buscaba la solución del programa, sino el porque del fallo.

No me vale de nada saber esta solución, si el siguiente programa que haga va a fallar :)

Saludos

Última edición por athiria; 05/04/2008 a las 06:14
  #4 (permalink)  
Antiguo 05/04/2008, 06:45
 
Fecha de Ingreso: abril-2008
Mensajes: 31
Antigüedad: 16 años, 1 mes
Puntos: 1
Re: ¿Porque esta lista enlazada funciona rara? (C)

Puedes probar a poner una traza despues del if/else para saber si el programa se muere o sigue vivo en ese punto, porque debería de pintar o bien lo del if o bien lo del else.

Otra posibilidad (remota) es que necesites vaciar el buffer de stdout con fflush(stdout) despues de hacer el printf.
  #5 (permalink)  
Antiguo 05/04/2008, 07:03
 
Fecha de Ingreso: enero-2008
Mensajes: 22
Antigüedad: 16 años, 4 meses
Puntos: 0
Re: ¿Porque esta lista enlazada funciona rara? (C)

Cita:
Iniciado por 0absolut0 Ver Mensaje
Puedes probar a poner una traza despues del if/else para saber si el programa se muere o sigue vivo en ese punto, porque debería de pintar o bien lo del if o bien lo del else.

Otra posibilidad (remota) es que necesites vaciar el buffer de stdout con fflush(stdout) despues de hacer el printf.
Lo de fpurge(stdout) (Mi máquina es UNIX) no funciona.

También he comprobado lo de la traza. Si introduzco un valor a buscar que se que no está en la tabla, no me muestra la traza despues del else. Hmmm...

Código:
if(pA->data==num)
		printf("El elemento se encuentra en la lista");
	else
		printf("El elemento no se encuentra en la lista");
	printf("Error");
No me imprime ni printf("El elemento no se encuentra en la lista"); ni printf("Error");
  #6 (permalink)  
Antiguo 05/04/2008, 07:25
 
Fecha de Ingreso: abril-2008
Mensajes: 31
Antigüedad: 16 años, 1 mes
Puntos: 1
Re: ¿Porque esta lista enlazada funciona rara? (C)

Creo que el problema es que cuando sale del bucle while la variable pA vale NULL.
En ese caso no puedes referenciarla, es decir no puedes consultar pA->data ya que estás intententando leer de una posicion de memoria no reservada.
Esto en algunos Sistemas Operativos como Solaris produce un core, otros sistemas como HP son algo mas tolerantes, pero en cualquier caso es un error intentar leer de un puntero NULL.

La solucion de Germancho7186 parece correcta.
  #7 (permalink)  
Antiguo 05/04/2008, 07:27
 
Fecha de Ingreso: enero-2008
Mensajes: 22
Antigüedad: 16 años, 4 meses
Puntos: 0
Re: ¿Porque esta lista enlazada funciona rara? (C)

Cita:
Iniciado por 0absolut0 Ver Mensaje
Creo que el problema es que cuando sale del bucle while la variable pA vale NULL.
En ese caso no puedes referenciarla, es decir no puedes consultar pA->data ya que estás intententando leer de una posicion de memoria no reservada.
Esto en algunos Sistemas Operativos como Solaris produce un core, otros sistemas como HP son algo mas tolerantes, pero en cualquier caso es un error intentar leer de un puntero NULL.

La solucion de Germancho7186 parece correcta.
Ahh justo lo que estaba pensando

Pues a ver como se soluciona...sin usar el código de Germancho jeje

Supongo que la usare pero me gustaría saber si hay alguna que no use TRUE, FALSE y todo eso ^_^
  #8 (permalink)  
Antiguo 07/04/2008, 12:04
Avatar de Mephisto  
Fecha de Ingreso: enero-2006
Ubicación: Mexico DF
Mensajes: 184
Antigüedad: 18 años, 4 meses
Puntos: 3
Re: ¿Porque esta lista enlazada funciona rara? (C)

Esta puede ser una sin TRUE y FALSE, e incluso optimiza tiempo de procesamiento ya que si encuentra el numero ya no sigue la busqueda...

Código:
int buscar (struct FINT *pA,int num)
{

	while(pA!=NULL)
	{
                           if(pA->data==num)
                           {
                                printf("El elemento se encuentra en la lista");
                                return 0;
                            }
                            else
		pA=pA->next;
	}
	
	printf("El elemento no se encuentra en la lista");
return -1;
}
__________________
Saludos...

Todos somos sabios, solo que en diferentes disciplinas...
  #9 (permalink)  
Antiguo 07/04/2008, 13:06
 
Fecha de Ingreso: marzo-2008
Mensajes: 22
Antigüedad: 16 años, 2 meses
Puntos: 1
Re: ¿Porque esta lista enlazada funciona rara? (C)

Cuando buscas un elemento, la unica manera de salir del bucle
es cuando has encontrado el elemento, o cuando se llega al final de la lista
Código:
	while(pA != NULL && pA->data != null)
O sea que si el elemento a buscar no esta en la lista el bucle termina cuando pA == NULL.
Al salir del bucle luego ejecutas:
Código:
	if(pA->data == num)
Ahí esta el problema, estás accediendo a un dato que es NULO.
  #10 (permalink)  
Antiguo 07/04/2008, 13:14
 
Fecha de Ingreso: marzo-2008
Mensajes: 22
Antigüedad: 16 años, 2 meses
Puntos: 1
Re: ¿Porque esta lista enlazada funciona rara? (C)

Me equivoque, quise decir:
Código:
	while(pA != NULL && pA->data != num)
  #11 (permalink)  
Antiguo 09/04/2008, 13:19
 
Fecha de Ingreso: enero-2008
Mensajes: 22
Antigüedad: 16 años, 4 meses
Puntos: 0
Re: ¿Porque esta lista enlazada funciona rara? (C)

Cita:
Iniciado por Mephisto Ver Mensaje
Esta puede ser una sin TRUE y FALSE, e incluso optimiza tiempo de procesamiento ya que si encuentra el numero ya no sigue la busqueda...

Código:
int buscar (struct FINT *pA,int num)
{

	while(pA!=NULL)
	{
                           if(pA->data==num)
                           {
                                printf("El elemento se encuentra en la lista");
                                return 0;
                            }
                            else
		pA=pA->next;
	}
	
	printf("El elemento no se encuentra en la lista");
return -1;
}
Gracias, es lo que estaba buscando
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:35.