Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: NOB2014 en 31 Julio 2016, 18:18 pm



Título: Agregar nodo a lista doblemente enlazada (lenguaje C)
Publicado por: NOB2014 en 31 Julio 2016, 18:18 pm
Hola, buen día para todos. -
Como me pareció tener claro listas simplemente enlazada http://foro.elhacker.net/programacion_cc/borrar_nodo_en_lista_simplemente_enlazadac-t455556.0.html me metí con lista doblemente enlazada y tengo una parte que no puedo solucionar, me parece que la función crear para el primer nodo funciona, pero cuando agrego 2,3,4 no puede el anterior apuntar a NULL, por más que practique no me sale, por momento parece en mi mente que es una bobada pero cuando lo llevo a la práctica no me resulta. -   
Si le es posible desearía que me digan si la función agregar es correcta. - 

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <limits.h>
  4.  
  5. struct nodo{
  6. int dato;
  7. struct nodo *anterior, *siguiente;
  8. };
  9.  
  10. struct lista{
  11. struct nodo *primero, *ultimo;
  12. int elementos;
  13. };
  14.  
  15. void menu( void );
  16. void limpiar( void );
  17. struct lista *agregar( struct lista *L );
  18. struct nodo *crear( int dato );
  19.  
  20.  
  21. int main( void ){
  22.  
  23. menu();
  24.  
  25. return 0;
  26. }
  27.  
  28.  
  29. void menu( void ){
  30. struct lista *Lista = NULL;
  31. Lista->elementos=0;
  32. int opc, ok, ch;
  33.  
  34. do{
  35. do{
  36. limpiar();
  37. printf( "\n ========== Menu Principal ==========\n" );
  38. if( Lista != NULL)
  39. printf( "\n Total de datos.....:%d\n", Lista->elementos );
  40. printf(" \n 1 - Agregar\n 2 - buscar\n 3 - Ordenar " );
  41. printf(" \n 4 - Total\n 5 - Finalizar\n\n Ingrese Opcion....: "  );
  42. ok = scanf( "%d", &opc ) == 1 && opc > 0 && opc <= 5;
  43. while ((ch = getchar()) != EOF && ch != '\n');
  44. }while( !ok );
  45.  
  46. switch ( opc ){
  47. case 1: Lista = agregar( Lista );
  48. break;
  49. case 2: //Lista = buscar( Lista );
  50. break;
  51. case 3: //ordenar( Lista );
  52. break;
  53. case 4: //mostrar( Lista );
  54. break;
  55. case 5:;
  56. free( Lista );
  57. break;
  58. }
  59. }while( opc != 5 );
  60.  
  61. }
  62.  
  63. void limpiar( void ){
  64. system("cls||clear");
  65. }
  66.  
  67. struct lista *agregar( struct lista *L ){
  68. int ok, ch, dto;
  69.  
  70. do{
  71. limpiar();
  72. printf( "\n Ingrese dato (mayor a 0 y menor a %d)....: ", INT_MAX );
  73. ok = scanf( "%d", &dto ) == 1 && dto >0 && dto <= INT_MAX;
  74. while ((ch = getchar()) != EOF && ch != '\n');
  75. }while( !ok );
  76.  
  77. if( L != NULL ){
  78. struct nodo *e = crear( dto );
  79. L->ultimo->siguiente = e;
  80. L->ultimo = e;
  81. L->elementos++;
  82. return L;
  83. }else{
  84. struct nodo *e = crear( dto );
  85. struct lista *l = calloc( sizeof( struct lista ), 1 );
  86. l->primero = e;
  87. l->ultimo = e;
  88. l->elementos = 1;
  89. return l;
  90. }
  91.  
  92. return L;
  93. }
  94.  
  95. struct nodo *crear( int dato ){
  96. struct nodo *e = calloc( sizeof( struct nodo), 1 );
  97.  
  98. e->dato = dato;
  99. e->siguiente = NULL;
  100. e->anterior = NULL;
  101.  
  102. return e;
  103. }
  104.  

Un abrazo. -


Título: Re: Agregar nodo a lista doblemente enlazada (lenguaje C)
Publicado por: AlbertoBSD en 31 Julio 2016, 18:52 pm
Como bien dices la falla esta al agregar los nodos despues del primero.

Lo primero que tienes que definir es

¿En donde Agrego loa nodos nuevos? ¿Al final? ¿Al principio?

Ahora sobre papel irlos agregando "A mano" y ver todo s los cambios que debes  a hacer.

Supongo que agregaras los nodos al final.

Tu codigo actual:

Código
  1. if( L != NULL ){
  2. struct nodo *e = crear( dto );
  3. L->ultimo->siguiente = e;
  4. L->ultimo = e;
  5. L->elementos++;
  6. return L;
  7. }

Cosas que hay que redefinir suponiendo que los nodos nuevos se agregen al ultimo:

  • El ultimo Nodo (Nuevo nodo) en su valor siguiente Debe de apuntar a el primero
  • El primer nodo en su valor anterior debe de apuntar al nodo nuevo

Cambios en comentarios
Código
  1. if( L != NULL ){
  2. struct nodo *e = crear( dto );
  3. L->ultimo->siguiente = e;
  4. L->ultimo = e;
  5. //e->siguiente = L->primero;
  6. //L->primero->anterior = e;
  7. L->elementos++;
  8. return L;
  9. }

Y cuando es el nodo inicial ( En el else) hace falta hacer cosas similares con el anterior y siguiente del primer nodo (nodo e)

Espero y sea suficiente xD

Saludos


Título: Re: Agregar nodo a lista doblemente enlazada (lenguaje C)
Publicado por: NOB2014 en 31 Julio 2016, 20:11 pm
Hola.
Decime si la imagen es correcta, si tengo un solo nodo el recuadro de la izquierda esta bien, si agrego un nuevo nodo las flechas indicarían las modificaciones que debo hacer. -

(http://i68.tinypic.com/5alwzm.png)

Citar
    El ultimo Nodo (Nuevo nodo) en su valor siguiente Debe de apuntar a el primero
    El primer nodo en su valor anterior debe de apuntar al nodo nuevo

esto no lo entiendo, para mí está equivocado, perdón...

Saludos.


Título: Re: Agregar nodo a lista doblemente enlazada (lenguaje C)
Publicado por: NOB2014 en 2 Agosto 2016, 13:21 pm
Código
  1. struct lista *agregar( struct lista *L, int *contactos ){
  2. int ok, ch, dto;
  3.  
  4. do{
  5. limpiar();
  6. printf( "\n Ingrese dato (mayor a 0 y menor a %d)....: ", INT_MAX );
  7. ok = scanf( "%d", &dto ) == 1 && dto >0 && dto <= INT_MAX;
  8. while ((ch = getchar()) != EOF && ch != '\n');
  9. }while( !ok );
  10.  
  11. if( L != NULL ){
  12. struct nodo *e = crear( dto );
  13. e->anterior = L->ultimo;
  14. L->actual = e;
  15. L->ultimo->siguiente = e;
  16. L->ultimo = e;
  17. *contactos += 1;
  18. return L;
  19. }else{
  20. struct nodo *e = crear( dto );
  21. struct lista *l = calloc( sizeof( struct lista ), 1 );
  22. l->primero = e;
  23. l->ultimo = e;
  24. l->actual = e;
  25. *contactos += 1;
  26. return l;
  27. }
  28.  
  29. return L;
  30. }
  31.  
  32. struct nodo *crear( int dato ){
  33. struct nodo *e = calloc( sizeof( struct nodo), 1 );
  34.  
  35. e->dato = dato;
  36. e->siguiente = NULL;
  37. e->anterior = NULL;
  38.  
  39. return e;
  40. }
Saludos.


Título: Re: Agregar nodo a lista doblemente enlazada (lenguaje C)
Publicado por: ivancea96 en 2 Agosto 2016, 13:27 pm
esto no lo entiendo, para mí está equivocado, perdón...

Sí bueno, eso es en las listas circulares, no en las doblemente enlazadas.


Título: Re: Agregar nodo a lista doblemente enlazada (lenguaje C)
Publicado por: AlbertoBSD en 3 Agosto 2016, 13:50 pm
Una disculpa si me confundi de estrucutra de datos.


Título: Re: Agregar nodo a lista doblemente enlazada (lenguaje C)
Publicado por: NOB2014 en 3 Agosto 2016, 14:43 pm
Hola, gente.
Tal vez fui un tanto duro, pero no entendía porque nadie respondía a mi necesidad, algo que para Uds. debe ser tan simple como respirar(la imagen), de cualquier manera deje mi código ya que lo pude lograr por mí mismo, seguramente se debe poder optimizar pero por lo menos funciona. -
Una cosa que me desconcertó es el emoticón o como se llame(desconozco ese tipo moderno de comunicarse) cag. de risa con los ojos cerrados, no me agrado demasiado. - 
Por último, si para alguien le es molesto mi manera de preguntar casi continuamente, no se obliguen a contestarme no hay ningún problema voy a saber entender que debo cambiar mi insistencia y arreglármelas más a solas al fin me ocasionara un poco de perdida de tiempo, no creo que sea más que eso, por favor no olviden aquello de que tengo 64 años y no encuentro demasiados "amigos" para consultar. -
Lo dejo a su consideración.-

Saludos. 


Título: Re: Agregar nodo a lista doblemente enlazada (lenguaje C)
Publicado por: AlbertoBSD en 3 Agosto 2016, 16:14 pm
Me aleagra que lograras el cometido por tu cuenta.

Y me confundí por la estructura ya que son muy similares por ejemplo un reproductor de música cuando tiene su "Lista" de canciones solo tiene funciones de anterior y siguiente (Adicioanles al Play) y también tiene una opción que se llama "repetir todas" la cual convierte la lista doblemente ligada en una lista circular  y segun recuerdo la diferencia solo es esa (Los nodos ultimpo y primero apuntan entre si).

De hecho es un buen ejercicio. Convertir una lista Doblemente ligada en una Circular.

Saludos.