Ver Mensaje Individual
  #1 (permalink)  
Antiguo 16/05/2010, 14:08
minette1988
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 8 meses
Puntos: 0
crear una lista enlazada

Hola, el siguiente programa añade nodo al principio, al final, recorre la lista, busca nodo, elimina nodo y añade después de un nodo determinado. Sólo utilizo un dato de tipo char. He intentado añadir otro dato y hacer las operaciones, pero no me sale bien. A ver si alguien puede ayudarme. Gracias.

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.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.  
  15.  
  16. struct persona {
  17.     char nom[100];
  18.         struct persona *siguiente;
  19. };
  20.  
  21. int main(){
  22.          struct persona *lista=NULL;
  23.          struct persona *nodo;
  24.  
  25.          int op;
  26.          void alta_inicio();
  27.          void alta_final();
  28.          void alta_despues_de();
  29.          void recorrer_lista();
  30.          void borrar_nodo();
  31.          struct persona * buscar_nodo();
  32.          
  33.          do{
  34.             do{
  35.                printf("Elija una opción:\n");
  36.                printf("1--> Añadir al principio.\n");
  37.                printf("2--> Añadir al final.\n");
  38.                printf("3--> Recorrer la lista.\n");
  39.                printf("4--> Buscar nodo.\n");
  40.                printf("5--> Eliminar nodo.\n");
  41.                printf("6--> Añadir despues de...\n");
  42.                printf("7--> Salir.\n");
  43.                scanf("%d",&op);
  44.             }while((op < 1) || (op > 7));
  45.          if(op != 7)  
  46.             switch(op){
  47.                 case 1: { alta_inicio(&lista);break;}
  48.                 case 2: { alta_final(&lista);break;}
  49.                 case 3: { recorrer_lista(&lista);break;}
  50.                 case 4: { nodo=buscar_nodo(&lista);
  51.                           printf("\n%s\n",nodo->nom);break;
  52.                 case 5: { borrar_nodo(&lista);break;}
  53.                 case 6: { alta_despues_de(&lista);break;}
  54.             }
  55.          }while(op != 7);
  56.          exit(0);
  57. }
  58. ////////////////////////////////////////////////////////////////////////////
  59. void alta_inicio(struct persona **lista){
  60.          struct persona *nuevo_nodo;
  61.          nuevo_nodo=(struct persona *)malloc(sizeof(struct persona));
  62.          if(nuevo_nodo != NULL){
  63.             nuevo_nodo->siguiente = *lista;
  64.             *lista = nuevo_nodo;
  65.             printf("Nombre: ");
  66.             LEE_CAD(nuevo_nodo->nom,T_NOM);
  67.          }
  68. }            
  69. ////////////////////////////////////////////////////////////////////////////////
  70. void recorrer_lista(struct persona **lista){
  71.           struct persona *nodo_aux;
  72.           nodo_aux = *lista;
  73.           while(nodo_aux != NULL){
  74.                printf("%s\n",nodo_aux->nom);
  75.                nodo_aux = nodo_aux->siguiente;
  76.           }
  77. }
  78. //////////////////////////////////////////////////////////////////////////////
  79. void alta_final(struct persona **lista){
  80.           struct persona *nuevo_nodo;
  81.           struct persona *nodo_aux;
  82.  
  83.           nuevo_nodo=(struct persona *)malloc(sizeof(struct persona));
  84.           if(nuevo_nodo != NULL){
  85.              nodo_aux = *lista;
  86.              while(nodo_aux->siguiente != NULL)
  87.                 nodo_aux = nodo_aux->siguiente;
  88.                 nodo_aux->siguiente=nuevo_nodo;
  89.                 nuevo_nodo->siguiente=NULL;
  90.                 printf("Nombre del nuevo elemento: ");
  91.                 LEE_CAD(nuevo_nodo->nom,T_NOM);
  92.           }
  93.           else
  94.                printf("Error al tomar memoria del nuevo nodo.\n");
  95. }
  96. /////////////////////////////////////////////////////////////////////////////////
  97. struct persona *buscar_nodo(struct persona **lista){
  98.           struct persona *nodo_aux, *resultado;
  99.           char nom[100];
  100.           char edad[3];
  101.           int encontrado = 0;
  102.  
  103.           printf("Nombre a buscar: ");
  104.           scanf("%99s",nom);
  105.          
  106.           nodo_aux = *lista;
  107.           while((nodo_aux->siguiente != NULL) && (!encontrado)){
  108.                 if(strcmp(nom,nodo_aux->nom) == 0)
  109.                   encontrado = 1;
  110.                 else
  111.                     nodo_aux = nodo_aux->siguiente;
  112.           }
  113.           if((nodo_aux->siguiente == NULL) && (!encontrado))
  114.               if(strcmp(nom,nodo_aux->nom) == 0)
  115.                  encontrado = 1;
  116.           if(encontrado)
  117.             resultado = NULL;
  118.           return(resultado);
  119. }
  120. ////////////////////////////////////////////////////////////////////////////////
  121. void borrar_nodo(struct persona **lista){
  122.           struct persona *nodo_aux, *nodo_anterior;
  123.           char nom[100];
  124.           char edad[3];
  125.           int encontrado = 0;
  126.  
  127.           printf("Nombre a borrar: ");
  128.           scanf("%99s",nom);
  129.           nodo_aux = *lista;
  130.  
  131.           if(strcmp(nom,nodo_aux->nom) == 0){
  132.             *lista=nodo_aux->siguiente;
  133.             free(nodo_aux);}
  134.           else{
  135.                nodo_anterior = nodo_aux;
  136.                nodo_aux = nodo_aux->siguiente;
  137.                while((nodo_aux->siguiente != NULL) && (!encontrado)){
  138.                    if(strcmp(nom,nodo_aux->nom) == 0)          
  139.                      encontrado = 1;
  140.                    else{
  141.                       nodo_anterior = nodo_aux;
  142.                       nodo_aux = nodo_aux->siguiente;
  143.                    }
  144.                }  
  145.                if((nodo_aux->siguiente == NULL) && (!encontrado))
  146.                   if(strcmp(nom,nodo_aux->nom) == 0)
  147.                      encontrado = 1;
  148.                if(encontrado){
  149.                   nodo_anterior->siguiente = nodo_aux->siguiente;
  150.                   free(nodo_aux);
  151.                }
  152.           }
  153. }
  154. ///////////////////////////////////////////////////////////////////////////////
  155. void alta_despues_de(struct persona **lista){
  156.            struct persona *nuevo_nodo;
  157.            struct persona *nodo_aux;
  158.            char nom[100];
  159.            char edad[3];
  160.            int encontrado = 0;
  161.            
  162.            printf("Nombre a buscar para insertar después de el: ");
  163.            scanf("%99s",nom);
  164.            
  165.            nuevo_nodo=(struct persona *)malloc(sizeof(struct persona));
  166.            
  167.  
  168.            if(nuevo_nodo != NULL){
  169.              nodo_aux = *lista;
  170.              while((nodo_aux->siguiente != NULL) && (!encontrado)){
  171.                   if(strcmp(nom,nodo_aux->nom) == 0)
  172.                      encontrado = 1;
  173.                   else{
  174.                        nodo_aux = nodo_aux->siguiente;
  175.                   }
  176.              }
  177.              if((nodo_aux->siguiente == NULL) && (!encontrado))
  178.                 if(strcmp(nom,nodo_aux->nom) == 0)
  179.                   encontrado = 1;
  180.  
  181.              if(encontrado){
  182.                 nuevo_nodo->siguiente=nodo_aux->siguiente;
  183.                 nodo_aux->siguiente=nuevo_nodo;
  184.                 printf("Nombre del nuevo elemento: ");
  185.                 scanf("%99s",nuevo_nodo->nom);
  186.              }
  187.              else{
  188.                   printf("Elemento no encontrado.\n");
  189.                   free(nuevo_nodo);
  190.              }
  191.            }
  192. }