Ver Mensaje Individual
  #17 (permalink)  
Antiguo 22/05/2010, 11:22
minette1988
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: crear una lista enlazada

Si este mismo ejercicio lo quiero guardar en un fichero binario para posteriormente realizar operaciones con la lista enlazada, ¿cómo se haría?

Te muestro la información que pueda servirte de ayuda

Código C:
Ver original
  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include <stdio.h>
  4.  
  5. #define LEE_CAD(c,n) { int i=0; \
  6.                      c[i]=getchar();\
  7.              while((c[i]=='\n') || (c[i]=='\t')) c[i]=getchar();\
  8.              while ((c[i]!='\n') && (i < (n-1))){ \
  9.                 i++;\
  10.             c[i]=getchar(); }\
  11.              c[i]='\0'; }
  12.  
  13. #define T_NOM 101
  14. #define T_TEL 10
  15.  
  16.  
  17. struct nodo_lista{
  18.    char nombre[T_NOM];
  19.    char telefono[T_TEL];
  20.    struct nodo_lista * siguiente; /*Puntero al siguiente elemento de la lista*/
  21. };
  22.  
  23. int main(){
  24.   struct nodo_lista *lista = NULL; /* Puntero al inicio de la lista, vacía */
  25.   struct nodo_lista *nodo;
  26.                                
  27.   int op; /* Variable para tomar la opción del menú del programa */
  28.  
  29.   void alta_inicio();
  30.   void alta_final();
  31.   void alta_despues_de();
  32.   void mostrar_lista();
  33.   void ordenar();
  34.   void borrar_nodo();
  35.  
  36.  
  37.   struct nodo_lista * buscar_nodo_nombre(); /* Devuelve un puntero al nodo buscado */
  38.   struct nodo_lista * buscar_nodo_telefono();
  39.  
  40.  
  41.   do{
  42.     do{
  43.        printf("1--> Añadir al Principio.\n");
  44.        printf("2--> Añadir al Final.\n");
  45.        printf("3--> Añadir después de.\n");
  46.        printf("4--> mostrar el total de la lista.\n");
  47.        printf("5--> Buscar (nodo)nombre para saber el telefono.\n");
  48.        printf("6--> Buscar (nodo)telefono para saber el nombre.\n");
  49.        printf("7--> Eliminar nodo.\n");
  50.        printf("8--> ordenar filas alfabeticamente\n");
  51.        printf("9--> Salir.\n");
  52.        scanf("%d",&op);
  53.      }while((op < 1) || (op > 9));
  54.      if( op != 9)
  55.        switch(op){
  56.           case 1: { alta_inicio(&lista); break;}
  57.           case 2: { alta_final(&lista); break;}
  58.           case 3: { alta_despues_de(&lista);break;}
  59.           case 4: { mostrar_lista(&lista); break;}
  60.           case 5: { nodo = buscar_nodo_nombre(&lista);
  61.                     printf("\n%s\n",nodo->telefono);
  62.                     break;}
  63.           case 6: { nodo = buscar_nodo_telefono(&lista);
  64.                     printf("\n%s\n",nodo->nombre);
  65.                     break;}
  66.           case 7: { borrar_nodo(&lista); break;}
  67.       case 8: { ordenar(&lista);break;}
  68.        }
  69.   }while(op != 9);
  70. }
  71. ////////////////////////////////////////////////////////////////////
  72. Aquí sólo te muestro las definiciones de los modulos puesto que no tengo espacio suficiente para publicar todo el código:
  73.  
  74. void alta_inicio(struct nodo_lista **lista){    
  75.   struct nodo_lista *nuevo_nodo; /* Variable usada para crear nuevos nodos
  76.                                     que serán añadidos a la lista */        
  77.        
  78.  
  79. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  80. void mostrar_lista(struct nodo_lista **lista){
  81.   struct nodo_lista *nodo_aux; /* Nodo auxiliar para recorrer la lista */
  82.  
  83.   nodo_aux = *lista;
  84.   while ( nodo_aux != NULL){
  85.      printf("%s  %s\n",nodo_aux->nombre,nodo_aux->telefono);
  86.      nodo_aux = nodo_aux->siguiente; /* El nodo auxiliar ahora apunta al
  87.                                         elemento siguiente */
  88.   }
  89. }
  90. /////////////////////////////////////////////////////////////////////////////////////////////
  91. void alta_final(struct nodo_lista **lista){
  92.   struct nodo_lista *nuevo_nodo; /* Variable usada para crear nuevos nodos
  93.                                     que serán añadidos a la lista */
  94.   struct nodo_lista *nodo_aux; /* Nodo auxiliar para recorrer la lista */
  95.  
  96.  
  97. /////////////////////////////////////////////////////////////////////////////////////////////
  98. void alta_despues_de(struct nodo_lista **lista){
  99.    struct nodo_lista *nuevo_nodo;
  100.    struct nodo_lista *nodo_aux;
  101.  
  102.    
  103. //////////////////////////////////////////////////////////////////////////////////////////////
  104. struct nodo_lista * buscar_nodo_nombre(struct nodo_lista **lista){
  105.     struct nodo_lista *nodo_aux, *resultado; /* Nodo auxiliar para recorrer la lista */
  106.    
  107. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  108. struct nodo_lista * buscar_nodo_telefono(struct nodo_lista **lista){
  109.     struct nodo_lista *nodo_aux, *resultado; /* Nodo auxiliar para recorrer la lista */
  110.    
  111. ////////////////////////////////////////////////////////////////////////////////////////////////////////////
  112. void borrar_nodo(struct nodo_lista **lista){
  113.     /* Para borrar un nodo, tendremos que guardar un puntero al nodo anterior
  114.        del que nos encontramos, ya que este puntero pasará a apuntar al nodo
  115.        apuntado por el que vamos a borrar */
  116.     struct nodo_lista *nodo_aux, *nodo_anterior;
  117.    
  118. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  119. void ordenar(struct nodo_lista **lista){
  120.   struct nodo_lista *nodo, *nodo_siguiente, *nodo_aux; /* Nodos para recorrer la lista */
  121.  
  122. ////////////////////////////////////////////////////////////////////////////////////////////////