elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Agregar nodo a lista doblemente enlazada (lenguaje C)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Agregar nodo a lista doblemente enlazada (lenguaje C)  (Leído 4,520 veces)
NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Agregar nodo a lista doblemente enlazada (lenguaje C)
« 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. -


En línea

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.542


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Agregar nodo a lista doblemente enlazada (lenguaje C)
« Respuesta #1 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


« Última modificación: 31 Julio 2016, 18:58 pm por AlbertoBSD » En línea

Donaciones
1ABSD1rMTmNZHJrJP8AJhDNG1XbQjWcRz7
NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Re: Agregar nodo a lista doblemente enlazada (lenguaje C)
« Respuesta #2 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. -



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.
En línea

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Re: Agregar nodo a lista doblemente enlazada (lenguaje C)
« Respuesta #3 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.
« Última modificación: 3 Agosto 2016, 01:48 am por NOB2014 » En línea

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
ivancea96


Desconectado Desconectado

Mensajes: 3.410


ASMático


Ver Perfil WWW
Re: Agregar nodo a lista doblemente enlazada (lenguaje C)
« Respuesta #4 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.
En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.542


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Agregar nodo a lista doblemente enlazada (lenguaje C)
« Respuesta #5 en: 3 Agosto 2016, 13:50 pm »

Una disculpa si me confundi de estrucutra de datos.
En línea

Donaciones
1ABSD1rMTmNZHJrJP8AJhDNG1XbQjWcRz7
NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Re: Agregar nodo a lista doblemente enlazada (lenguaje C)
« Respuesta #6 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. 
En línea

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.542


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Agregar nodo a lista doblemente enlazada (lenguaje C)
« Respuesta #7 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.
En línea

Donaciones
1ABSD1rMTmNZHJrJP8AJhDNG1XbQjWcRz7
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
ayuda...Lista doblemente enlazada
Java
goll9d 2 2,693 Último mensaje 22 Enero 2012, 04:50 am
por goll9d
ayuda con lista doblemente enlazada
Programación C/C++
gibi77 3 2,491 Último mensaje 7 Marzo 2012, 07:47 am
por nirvguy
Ayuda con lista doblemente enlazada
Programación C/C++
falconez 2 7,018 Último mensaje 16 Diciembre 2013, 01:35 am
por falconez
lista doblemente enlazada
Programación C/C++
d91 1 822 Último mensaje 19 Octubre 2015, 04:06 am
por d91
Eliminar nodo en lista enlazada: problema con el último nodo [C]
Programación C/C++
Rhessus 2 2,971 Último mensaje 20 Julio 2016, 06:08 am
por Rhessus
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines