Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: DanielPy en 9 Junio 2015, 02:12 am



Título: Lista enlazada simple – listas ligadas [C]
Publicado por: DanielPy en 9 Junio 2015, 02:12 am
Hola gente.
Como verán estoy tratando de interpretar las listas ligadas y les aseguro que en 10 días tan sólo pude construir este pequeño programa, lo que me falta saber que es más conveniente, declarar las variables estructura cómo globales o dentro la función principal y pasarlas como parámetro a las funciones.-
Por último necesitaría que alguien me ayude a construir la función borrar_elemento, no pude poner ninguna línea.-

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>
  4.  
  5. struct _agenda{
  6. char nombre[30];
  7. char telefono[12];
  8. struct _agenda *siguiente;
  9. };
  10.  
  11. struct _agenda *primero, *ultimo;
  12.  
  13. void mostrar_menu();
  14. void agregar_elemento();
  15. void mostrar_lista();
  16.  
  17. int main(void){
  18. char opcion, ch;
  19.  
  20. primero = (struct _agenda *) NULL;
  21. ultimo = (struct _agenda *) NULL;
  22. do{
  23. mostrar_menu();
  24. opcion = getchar();
  25. while((ch = getchar()) != EOF && ch != '\n');
  26. switch ( opcion ){
  27. case '1': agregar_elemento();
  28. break;
  29. case '2':  printf("No disponible todavía!\n");
  30. break;
  31. case '3': mostrar_lista(primero);
  32. break;
  33. case '4': exit( 1 );
  34. default: printf( "Opción no válida\n" );
  35. break;
  36. }
  37. } while (opcion!='4');
  38.  
  39. return 0;
  40. }
  41.  
  42. void mostrar_menu(){
  43. system( "CLS" );
  44. printf( "\n\n ===== Menu =====" );
  45. printf( "\n 1 - Agregar elemento" );
  46. printf( "\n 2 - Borrar elemento" );
  47. printf( "\n 3 - Mostrar elementos" );
  48. printf( "\n 4 - Salir" );
  49.  
  50. printf("\n\n Escoge una opcion......: ");
  51. }
  52.  
  53. /* Con esta función añadimos un elemento al final de la lista */
  54. void agregar_elemento(){
  55. struct _agenda *nuevo;
  56.  
  57. /* reservamos memoria para el nuevo elemento */
  58. nuevo = (struct _agenda *) malloc (sizeof(struct _agenda));
  59. if( nuevo == NULL){
  60. printf(" \n No hay memoria disponible");
  61. }
  62. printf( "\n ===== Nuevo elemento =====" );
  63. printf( "\n Nombre.....:" );
  64. gets( nuevo->nombre );
  65. printf( "\n Telefono...:" );
  66. gets( nuevo->telefono );
  67.  
  68. /* el campo siguiente va a ser NULL por ser el último elemento*/
  69. nuevo->siguiente = NULL;
  70.  
  71. /* ahora metemos el nuevo elemento en la lista. lo situamos al final de la lista */
  72. /* comprobamos si la lista está vacía. si primero==NULL es que no
  73.          hay ningún elemento en la lista. también vale ultimo==NULL */
  74. if( primero == NULL ){
  75. printf( "\n Primer elemento" );
  76. primero = nuevo;
  77. ultimo  = nuevo;
  78. }else{
  79. /* el que hasta ahora era el último tiene que apuntar al nuevo */
  80. ultimo->siguiente = nuevo;
  81. /* hacemos que el nuevo sea ahora el último */
  82. ultimo = nuevo;
  83. }
  84. }
  85.  
  86. void mostrar_lista(){
  87. struct _agenda *auxiliar; /* lo usamos para recorrer la lista */
  88. int i=0;
  89.  
  90. auxiliar = primero;
  91. printf( "\nMostrando la lista completa:\n ");
  92. while( auxiliar != NULL ){
  93. printf( "\n Nombre: %s, Telefono: %s",
  94. auxiliar->nombre,auxiliar->telefono);
  95. auxiliar = auxiliar->siguiente;
  96. i++;
  97. }
  98. if( i==0 ){
  99. printf( "\nLa lista está vacía!!\n" );
  100. }
  101. }
  102.  
  103. //http://www.santiagoapostol.net/srca/cursoc/cursoc22.html#anadir

Desde ya muchas gracias por la ayuda que deseen brindarme.-   

rir3760, no tuve internet por 10 días y no pude responderte al otro tema, luego me ocupo.-

Saludos.
Daniel


Título: Re: Lista enlazada simple – listas ligadas [C]
Publicado por: ivancea96 en 9 Junio 2015, 09:53 am
Lo mejor es que pases la lista a las funciones. Sinó, no podrás tener más de una lista en el programa.

Para borrar el nodo número i, tendrás que ir hasta él, y guardarlo en un puntero temporal. Luego, el puntero al nodo siguiente del nodo anterior lo igualas al nodo siguiente del nodo a borrar. Por último, haces free() con el nodo que tienes que borrar, que lo tendrás guardado en el puntero temporal.

Cuando pongo "nodo siguiente" me refiero al puntero de la estructura. Lo puse así porque es algo lioso xD


Título: Re: Lista enlazada simple – listas ligadas [C]
Publicado por: DanielPy en 9 Junio 2015, 14:50 pm
Hola.
Como siempre muchas gracias por ocuparte, te explico lo que me pasa, teoría  leí más de 20 páginas lo que necesito es que alguien me dé un ej. de código para tener como referencia y poder estudiarlo a partir del mismo.-

Saludos.
Daniel


Título: Re: Lista enlazada simple – listas ligadas [C]
Publicado por: ivancea96 en 9 Junio 2015, 17:38 pm
Código
  1. struct _agenda *temp1 = /* Nodo anterior al nodo que sera borrado */, *temp2 = /* Nodo a ser borrado */;
  2. temp1->siguiente = temp2->siguiente;
  3. free(temp2);

Aqui un esquema jeje
(http://i.gyazo.com/4e95e6efa072c8b7e1cdc2f31dbbe2df.png)


Edito: Dado que es una lista enlazada simple, tener un puntero al último elemento de pocote va a servir. Lo mejor sería que en vez de tener 2 punteros globales, tuvieras listas almacenadas en variables. Esas variables simplemente serían un puntero al primer elemento :o