cambiar for a do-while

Iniciado por m@o_614, 1 Noviembre 2013, 23:28 PM

0 Miembros y 1 Visitante están viendo este tema.

m@o_614

Saludos tengo la siguiente funcion que tiene un for el cual quiero convertirlo a un do-while, pero no se bien como hacerlo

void imprimirLista(Nodo *cabeza)
{
   Nodo *p,*ult;
   for(p = cabeza,ult = fin(cabeza);p!=ult;p = p->sig)
   {
       printf("%s\t",p->nombre);
       printf("%d\t",p->edad);
       printf("%s\n\n",p->ciudad_residencia);
   }
}

Nodo *fin(Nodo *cabeza)
{
   Nodo *ptr = cabeza;
   while(ptr->sig!= NULL)
       ptr = ptr->sig;
   return ptr;
}


el principal problema es que no se donde poner el p = p->sig en el do while?? probe con lo siguiente pero me marca errores

void imprimirLista(Nodo *cabeza)
{
   Nodo *p,*ult;
    p = cabeza;
    ult = fin(cabeza);
   do
   {
       printf("%s\t",p->nombre);
       printf("%d\t",p->edad);
       printf("%s\n\n",p->ciudad_residencia);
        p = p->sig;
   }while(p!=ult);
}


gracias

rir3760

Tu función "fin" esta mal implementada ya que reventara si la lista esta vacía y la función para imprimir una lista con un bucle for:
void imprimirLista(Nodo *cabeza)
{
   Nodo *p,*ult;
   for(p = cabeza,ult = fin(cabeza);p!=ult;p = p->sig)
   {
       printf("%s\t",p->nombre);
       printf("%d\t",p->edad);
       printf("%s\n\n",p->ciudad_residencia);
   }
}

Imprimirá el contenido de todos los nodos menos el ultimo, en lugar de la función "fin" es mejor simplemente la comparación habitual "p != NULL").

Tampoco es una buena idea utilizar un bucle "do .. while" para imprimir la lista ya que el programa reventara en el mismo caso (lista vacía).

Si no tienes un curso de calidad sobre listas vinculadas puedes descargar uno cortesía de la Universidad de Stanford.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

m@o_614

#2
gracias rir3760, de hecho ya me habia fijado que la funcion no me imprime el ultimo elemento de la lista, por esto pense que era buena idea hacer un do-while() porque como la condicion se realiza al final si me imprimiria el ultimo elemento y ya despues se saldria. y pues tambien quedaria pendiente lo de verificar que no este vacia, la funcion me imprimiria correctamente si en la funcion fin cambiara el p->sig!= NULL por p!=NULL, tal como me dijiste :

void imprimirLista(Nodo *cabeza)
{
   Nodo *p,*ult;
   for(p = cabeza,ult = fin(cabeza);p!=ult;p = p->sig)
      printf("%d\t",p->elemento);
}

Nodo *fin(Nodo *cabeza)
{
   Nodo *ptr = cabeza;
   while(ptr!=NULL)
       ptr = ptr->sig;
   return ptr;
}


solo que como tambien quiero hacer un CASE  para que tenga la opcion de ingresarme por el final, entonces a fuerzas tengo que hacer la comparacion while(p->sig !=NULL) porque p seria el puntero que apunta al ultimo elemento que es el que necesito para ingresar por la cola,por eso pense que necesitaba el do while a fuerzas,porque quiero que la funcion fin me regrese el puntero que en su campo siguiente tiene NULL, no se si me di a entender en esto ultimo, de todos modos gracias

rir3760

Cita de: m@o_614 en  2 Noviembre 2013, 06:27 AMla funcion me imprimiria correctamente si en la funcion fin cambiara el p->sig!= NULL por p!=NULL, tal como me dijiste:

void imprimirLista(Nodo *cabeza)
{
    Nodo *p,*ult;
    for(p = cabeza,ult = fin(cabeza);p!=ult;p = p->sig)
       printf("%d\t",p->elemento);
}

Nodo *fin(Nodo *cabeza)
{
    Nodo *ptr = cabeza;
    while(ptr!=NULL)
        ptr = ptr->sig;
    return ptr;
}
Con todo respeto tu función "fin" no tiene sentido ya que ella siempre retornara NULL y para ese caso y como ya te comente antes simplemente usa "p != NULL".

Cita de: m@o_614 en  2 Noviembre 2013, 06:27 AMsolo que como tambien quiero hacer un CASE  para que tenga la opcion de ingresarme por el final
Para agregar un nodo al final de una lista bien la recorres hasta encontrar el ultimo o tomas nota de los nodos primero y ultimo cuando agregas/eliminas un nodo. En tu caso lo mejor por sencillo es utilizar la primera forma.

Y como ya te comente en mi mensaje anterior ponte a practicar el uso de listas, empieza con la introducción (Linked List Basics) y continuas con los ejercicios (Linked List Problems).

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language