/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Problema: Insertar al final de una lista

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
purplestain



Registrado: 29 Oct 2007
Mensajes: 5

MensajePublicado: 30/11/2007 8:50 am
Título: Problema: Insertar al final de una lista

Hola a todos.
Tengo un problema con el uso de listas. Estoy usando c, cargo desde un archivo binario cada nodo y los voy copiando a una lista en memoria, la funcion que uso me retorna un puntero al primer nodo de la lista (se que esta funcion funciona correctamente).
Utilizo ese puntero que me devuelve como argumento en esta funcion:

Código:

typedef struct {
        int num;
        char nom[30];
        }t_valores;
typedef struct nodo nodo;
struct nodo {
        t_valores val;
        nodo *sig;
        };
       


nodo *nuevo (nodo *p)
{nodo *prim,*nuevo; prim=p;
 nuevo=(nodo*)malloc(sizeof(nodo));
printf ("\nIngrese numero: ");fflush (stdin);scanf ("%d",&(nuevo->val).num);
printf ("Ingrese nombre: ");fflush(stdin);gets((nuevo->val).nom);
do
 {p=p->sig;
 }while(p->sig!=NULL);
p->sig=nuevo;
nuevo->sig=NULL;
return prim;
}


es una funcion que armé que supuestamente devuelve un puntero al primer nodo de la lista a la que se le agrega un nuevo nodo al final.
Y la imprimo con este procedimiento:


Código:

void imprimir (nodo *prim)
{do
 {
 printf("\n%s\n",(prim->val).nom);
 printf("%d\n",(prim->val).num);
 prim=prim->sig;
 }while(prim->sig!=NULL);
}



El tema es que cuando la imprimo con este procedimiento, me muestra todo la lista pero en el ultimo nodo imprime cualquier cosa (caracteres raros en nom y un numero equivocado en num, estos dos valores que muestra son siempre iguales, ingrese lo que ingrese por teclado en la funcion *nuevo).
Agradeceria mucho si alguien puede revisar el codigo.
Saludos!
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 3837
Ubicación: Mexico

MensajePublicado: 01/12/2007 9:36 am
Título:

La funcion "imprimir" esta mal implementada ya que reventaria con una lista vacia o de un solo elemento y si la lista consistiera de dos o mas elementos no imprimiria correctamente el ultimo.

Las modificaciones a esa funcion para que funcione correctamente:
Código:
void imprimir(nodo *p)
{
   while (p != NULL){
      printf("\n%s\n", p->val.nom);
      printf("%d\n", p->val.num);
     
      p = p->sig;
   }
}


En cuanto a la funcion "nuevo" en esta no emulas el paso por referencia, debido a esto tienes que llamar a la funcion en la forma:
Código:
nodo *lista;

/* ... */

lista = NULL;

/* ... */

lista = nuevo(lista);

Ya que de no llamarla en esa forma no podria modificarse el valor de la variable "lista" (el puntero apuntando al primer nodo de la lista).

Esa funcion no maneja el caso de una lista vacia (indicada con el valor NULL) y en caso de una lista con varios elementos el error seria similar al de la funcion "imprimir".

Las modificaciones a esa funcion para que funcione correctamente:
Código:
nodo *nuevo(nodo *p)
{
   nodo *nuevo;
   
   if ((nuevo = malloc(sizeof *nuevo)) == NULL)
      return NULL;
   
   printf("Ingrese numero: ");
   fflush(stdout);
   if (scanf("%d", &nuevo->val.num) != 1)
      return NULL;
   
   printf ("Ingrese nombre: ");
   fflush(stdout);
   if (fgets(nuevo->val.nom, 30, stdin) == NULL)
      return NULL;
   
   nuevo->sig = NULL;
   
   if (p == NULL)
      return nuevo;
   else {
      nodo *ultimo;
     
      for (ultimo = p; ultimo != NULL; ultimo = ultimo->sig)
         ;
      ultimo = nuevo;
     
      return p;
   }
}


Revisa si esto soluciona tu problema, si no es asi habria que revisar el codigo fuente (completo) del programa.

Un saludo
_________________
The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
Volver arriba
purplestain



Registrado: 29 Oct 2007
Mensajes: 5

MensajePublicado: 01/12/2007 12:43 pm
Título:

gracias por la respuesta, te cuento que todas las modificaciones que me recomendas ya las habia contemplado y modificado despues de publicar el tema y me sigue produciendo el mismo error, te muestro el main provisorio que hice para probar las funciones:
Código:


void main ()
{nodo*lista,*lista_aux;
 lista_aux=NULL;
 lista=NULL;
 lista=cargar_lista();/*esta se que funciona, carga los datos de un archivo binario a la lista y retorna un puntero*/
 lista_aux=nuevo(lista);
 imprimir (lista_aux);
 getch();
}
 

tambien probé modificando la funcion nuevo para pasar por referencia la lista y que no me retorne nada (modificando el main), y sigue produciendo el mismo error. La verdad que se me estan acabando las ideas. el error siempre es el mismo:
Cita:
me muestra todo la lista pero en el ultimo nodo imprime cualquier cosa (caracteres raros en nom y un numero equivocado en num, estos dos valores que muestra son siempre iguales, ingrese lo que ingrese por teclado en la funcion *nuevo).
Volver arriba
david_celta



Registrado: 02 Jun 2005
Mensajes: 151

MensajePublicado: 01/12/2007 4:04 pm
Título:

Código:

nodo * inserta final(nodo *p)
{
  nodo *nuevo;
   
   if ((nuevo = malloc(sizeof *nuevo)) == NULL)
      return NULL;
   
   printf("Ingrese numero: ");
   fflush(stdout);
   if (scanf("%d", &nuevo->val.num) != 1)
      return NULL;
   
   printf ("Ingrese nombre: ");
   fflush(stdout);
   if (fgets(nuevo->val.nom, 30, stdin) == NULL)
      return NULL;
   
   nuevo->sig = NULL;
   
   if (p == NULL)
      return nuevo;
   else {
      while (p->sig!=NULL)
      {
        p=p->sig;
      }

      p->sig=nuevo
      return p;
   }
}

_________________
In all your fantasies,
you always knew
that man and mystery...

...were both in you...
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 3837
Ubicación: Mexico

MensajePublicado: 01/12/2007 4:12 pm
Título:

purplestain escribió:
La verdad que se me estan acabando las ideas. el error siempre es el mismo:
Cita:
me muestra todo la lista pero en el ultimo nodo imprime cualquier cosa (caracteres raros en nom y un numero equivocado en num, estos dos valores que muestra son siempre iguales, ingrese lo que ingrese por teclado en la funcion *nuevo).

En ese caso lo mejor que puedes hacer para encontrar el error es publicar el codigo fuente completo del programa.

Un saludo
_________________
The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
Volver arriba
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com