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

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Lista enlazada simple – listas ligadas [C]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Lista enlazada simple – listas ligadas [C]  (Leído 3,143 veces)
DanielPy

Desconectado Desconectado

Mensajes: 145



Ver Perfil
Lista enlazada simple – listas ligadas [C]
« 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


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.412


ASMático


Ver Perfil WWW
Re: Lista enlazada simple – listas ligadas [C]
« Respuesta #1 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


En línea

DanielPy

Desconectado Desconectado

Mensajes: 145



Ver Perfil
Re: Lista enlazada simple – listas ligadas [C]
« Respuesta #2 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
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.412


ASMático


Ver Perfil WWW
Re: Lista enlazada simple – listas ligadas [C]
« Respuesta #3 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



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
« Última modificación: 9 Junio 2015, 17:53 pm por ivancea96 » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Duda lista simple enlazada C
Programación C/C++
netca 3 4,054 Último mensaje 16 Agosto 2012, 00:06 am
por twins
[Resuelto]Duda lista simple enlazada en C
Programación C/C++
Zelandya 4 3,801 Último mensaje 30 Agosto 2012, 05:41 am
por Zelandya
Insertar un elemento ordenadamente en una lista enlazada simple
Programación C/C++
NathanD 4 26,952 Último mensaje 27 Abril 2013, 14:25 pm
por NathanD
borrar elemento de la lista enlazada simple
Programación C/C++
d91 2 3,534 Último mensaje 9 Junio 2014, 13:44 pm
por d91
Programa estructura cola con lista simple enlazada en C++
Programación C/C++
pedro0620 0 1,880 Último mensaje 4 Mayo 2016, 02:35 am
por pedro0620
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines