Autor
|
Tema: cambiar for a do-while (Leído 5,574 veces)
|
m@o_614
Desconectado
Mensajes: 389
|
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\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\n\n",p ->ciudad_residencia ); p = p->sig; }while(p!=ult); }
gracias
|
|
« Última modificación: 1 Noviembre 2013, 23:32 pm por m@o_614 »
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
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\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
|
|
|
En línea
|
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
Desconectado
Mensajes: 389
|
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) } 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
|
|
« Última modificación: 2 Noviembre 2013, 06:35 am por m@o_614 »
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
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) } 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". solo 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
|
|
|
En línea
|
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
|
|
|
|
|