Advertisement
rld

Untitled

rld
Nov 11th, 2011
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 10.11 KB | None | 0 0
  1. //Librerías.
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5.  
  6. //Estructura.
  7. struct nodo
  8. {
  9.     char nombre[50];
  10.     int socio;
  11.     struct nodo *Siguiente;
  12.     struct nodo *Anterior;
  13.     struct nodo *Inicio;
  14.     struct nodo *Fin;
  15.     int tam;
  16. };
  17.  
  18. //Prototipos de las funciones.
  19. int insertar (struct nodo *Lista , char *n, int s);
  20. struct nodo *intercambiar (struct nodo *Lista, char *cadena1, char *cadena2);
  21. int comparar(char *cad1,char *cad2);
  22. void *copiar(struct nodo *Lista, char letra);
  23. int menu (struct nodo *Lista);
  24. void imprimir (struct nodo *Lista);
  25.  
  26. //---------------------------------------MAIN-------------------------------------------//
  27. int main (void)
  28. {
  29.     struct nodo *lista;
  30.     lista=malloc(sizeof(struct nodo));
  31.     char *nom;
  32.     nom=malloc(50);
  33.     int opcion=1;
  34.     int soc;
  35.     int aux;
  36.     char *str1, *str2;
  37.     char l;
  38.  
  39.     //Asignación de memoria.
  40.     str1=malloc(50);
  41.     str1=malloc(50);
  42.  
  43.     //Incicialización de variables.
  44.     lista->Inicio=NULL;
  45.     lista->Fin=NULL;
  46.     lista->tam=0;
  47.  
  48.     while (opcion!=4)
  49.     {
  50.         opcion=menu(lista);
  51.         switch (opcion)
  52.         {
  53.             case 4:
  54.                 printf ("\nFin de la ejecución.\n");
  55.                 exit(-1);
  56.                 break;
  57.             case 0:
  58.                 printf ("\nIngrese un nombre:");
  59.                 scanf ("%s",nom);
  60.                 printf ("\nIngrese nro. de socio:");
  61.                 scanf ("%d",&soc);
  62.                 insertar (lista,nom, soc);
  63.                 imprimir(lista);
  64.                 printf ("\n%d elementos.\n",lista->tam);
  65.                 break;
  66.             case 1:
  67.                 printf ("\nIngrese primer nombre:");
  68.                 scanf ("%s",str1);
  69.                 printf ("\nIngrese segundo nombre:");
  70.                 scanf ("%s",str2);
  71.                 intercambiar (lista,str1,str2);
  72.                 imprimir (lista);
  73.                 break;
  74.             case 2:
  75.                 printf ("\nIngrese primer nombre:");
  76.                 scanf ("%s",str1);
  77.                 printf ("\nIngrese segundo nombre:");
  78.                 scanf ("%s",str2);
  79.                 aux = comparar (str1,str2);
  80.                 if (aux==0)
  81.                     printf ("\nCadenas iguales.\n");
  82.                 if (aux==1)
  83.                     printf ("\nPrimera cadena mayor.\n");
  84.                 if (aux==-1)
  85.                     printf ("\nPrimera cadena menor.\n");
  86.                 break;
  87.             case 3:
  88.                 printf ("\nIngrese letra:");
  89.                 scanf ("\n%c",&l);
  90.                 getchar();
  91.                 copiar (lista,l);
  92.         }
  93.     }
  94.  
  95.     return 0;
  96. }
  97.  
  98. //---------------------------------------MENU-------------------------------------------//
  99. int menu (struct nodo *Lista)
  100. {
  101.     int eleccion;
  102.  
  103.     if (Lista->tam==0)
  104.     {
  105.         printf ("\nElija una de las opciones que aparecen en pantalla:\n");
  106.         printf ("\n0-Insertar nuevo nodo.\n1-Salir.\n");
  107.         printf ("\nOpción:");
  108.         scanf ("%d",&eleccion);
  109.         if (eleccion==1)
  110.             eleccion=4; //Para que coincida con el menú de abajo.
  111.     }
  112.     else
  113.     {
  114.         printf ("\nElija una de las opciones que aparecen en pantalla:\n");
  115.         printf ("\n0-Insertar nuevo nodo.\n1-Intercambiar nodos.\n2-Comparar nodos.\n3-Copiar nodos.\n4-Salir.\n");
  116.         printf ("\nOpción:");
  117.         scanf ("%d",&eleccion);
  118.     }
  119.  
  120.     return eleccion;
  121. }
  122.  
  123. //---------------------------------INSERTAR NUEVO NODO----------------------------------//
  124. int insertar (struct nodo *Lista , char *n, int s)
  125. {
  126.     struct nodo *Nuevo, *Actual;
  127.     int insert;
  128.     int i=0;
  129.  
  130.     //Reserva memoria para el nuevo nodo.
  131.     if ( (Nuevo = malloc (sizeof (struct nodo) ) ) == NULL)
  132.         return -1;
  133.  
  134.     //Recorre el nombre/cadena ingresado por el usuario.
  135.     for( i=0; *(n+i)!='\0'; i++ )
  136.     {
  137.         Nuevo->nombre[i] = *(n+i); //Y lo almacena en el nuevo nodo.
  138.     }
  139.     Nuevo->nombre[i]='\0'; //Agrega el caracter NULL al final de la cadena.
  140.     Nuevo->socio=s; //Guarda el nro. de socio ingresado en el nuevo nodo.
  141.  
  142.     if (Lista->tam==0) //Si la lista está está vacía.
  143.     {
  144.         Nuevo->Anterior=Lista->Inicio;
  145.         Nuevo->Siguiente=Lista->Fin;
  146.         Lista->Inicio=Nuevo;
  147.         Lista->Fin=Nuevo;
  148.         Lista->tam++; //Incrementa el tamaño de la lista, debido al nuevo nodo ingresado.
  149.         return 0;
  150.     }
  151.  
  152.     else //Inserta después del último nodo ingresado.
  153.     {
  154.         Actual=Lista->Inicio;
  155.         while ( Actual->Siguiente != NULL && strcmp(n,Actual->nombre ) !=0 )
  156.             //Mientras el elemento siguiente al nodo actual no sea NULL y el nombre ingresado por
  157.             //el usuario sea distinto al nombre del nodo actual...
  158.             Actual=Actual->Siguiente; //Salta al siguiente nodo.
  159.  
  160.  
  161.         Nuevo->Anterior=Actual; //El nodo anterior a 'Nuevo' es el actual.
  162.         if (Actual->Siguiente==NULL)
  163.             Lista->Fin=Nuevo;
  164.         else Actual->Siguiente->Anterior=Nuevo;
  165.         Actual->Siguiente=Nuevo;
  166.         Lista->tam++; //Incrementa el tamaño de la lista, debido al nuevo nodo ingresado.
  167.         return 0;
  168.     }
  169. }
  170.  
  171. //------------------------------------IMPRIMIR LISTA--------------------------------------//
  172. void imprimir (struct nodo *Lista)
  173. {
  174.     struct nodo *Inverso, *Actual;
  175.     int choice; //Variable para elegir modo de impresión de la lista.
  176.  
  177.     printf ("\nElija una de las opciones que aparecen en pantalla:\n");
  178.     printf ("\n1-Imprimir lista.\n2-Imprimir lista al revés.\n");
  179.     printf ("\nOpción:");
  180.     scanf ("%d",&choice);
  181.  
  182.     Actual=Lista->Inicio;
  183.     printf ("\n----->");
  184.  
  185.     //Imprime desde el incio hasta el fin de la lista.
  186.     if (choice==1)
  187.     {
  188.         while (Actual!=NULL)
  189.         {
  190.             Inverso=Actual; //Cuando se termina de recorrer la lista, almacena el último nodo en 'Inverso'.
  191.             printf ("Nombre:%s/Socio:%d----->",Actual->nombre,Actual->socio); //Imprime nombre y socio del nodo.
  192.             Actual=Actual->Siguiente; //Salta al siguiente nodo.
  193.         }
  194.     }
  195.  
  196.     //Imprime de atrás para delante.
  197.     if (choice==2)
  198.     {
  199.         while (Inverso!=NULL)
  200.         {
  201.             printf ("Nombre:%s/Socio:%d----->",Inverso->nombre,Inverso->socio);
  202.             Inverso=Inverso->Anterior; //Salta al nodo anterior.
  203.         }
  204.     }
  205. }
  206.  
  207. //------------------------------------COMPARA NODOS-----------------------------------//
  208. int comparar(char *cad1,char *cad2)
  209. {
  210.     int i=0; //Auxiliar para recorrer cadenas.
  211.  
  212.     while ( (*(cad1+i)!='\0') || (*(cad2+i)!='\0') )
  213.     {
  214.         if (*(cad1+i)<*(cad2+i)) //Si la primera cadena es menor a la segunda cadena...
  215.             return -1;
  216.         if (*(cad1+i)>*(cad2+i)) //Si la primera cadena es mayor a la segunda cadena...
  217.             return 1;
  218.  
  219.         i++;
  220.     }
  221.  
  222.     if (*(cad1+i)<*(cad2+i)) //Si la primera cadena es menor a la segunda cadena...
  223.         return -1;
  224.     else if (*(cad1+i)>*(cad2+i)) //Si la primera cadena es mayor a la segunda cadena...
  225.         return 1;
  226.     return 0; //Retorna la variable aux.
  227. }
  228.  
  229. //------------------------------------INTERCAMBIA NODOS-------------------------------//
  230. struct nodo *intercambiar (struct nodo *Lista, char *cadena1, char *cadena2)
  231. {
  232.     struct nodo *Actual, *T1, *T2, *Aux1, *Aux2;
  233.     int i=0; //Variable auxiliar para recorrer cadenas.
  234.  
  235.     //Asignación de memoria a variables auxiliares.
  236.     Aux1 = malloc (sizeof (struct nodo) );
  237.     Aux2 = malloc (sizeof (struct nodo) );
  238.     Actual = malloc (sizeof (struct nodo) );
  239.     //Memoria asignada.
  240.  
  241.     //Recorremos la lista desde su primer nodo.
  242.     Actual=Lista->Inicio;
  243.     while (Actual!=NULL) //Mientras no se llegue el final de la lista...
  244.     {
  245.         if (comparar (Actual->nombre,cadena1)==0) //Al ser 0, quiere decir que las cadenas son iguales.
  246.         {
  247.             Aux1=Actual; //Guarda el nodo hallado (actual) en un auxiliar.
  248.             break;
  249.         }
  250.         //Si no encontro el nodo que buscamos se mueve el siguiente nodo.
  251.         else Actual=Actual->Siguiente;
  252.     }
  253.  
  254.     //Si el primer nodo fue encontrado...
  255.     if (Aux1!=NULL)
  256.     {
  257.         //Recorremos la lista desde su primer nodo.
  258.         Actual=Lista->Inicio;
  259.         while (Actual!=NULL) //Mientras no se llegue el final de la lista...
  260.         {
  261.             if (comparar (Actual->nombre,cadena2)==0) //Al ser 0, quiere decir que las cadenas son iguales.
  262.             {
  263.                 Aux2=Actual; //Guarda todo el nodo hallado (actual) en un auxiliar.
  264.                 break;
  265.             }
  266.             //Si no encontro el nodo que buscamos se mueve el siguiente nodo.
  267.             else Actual=Actual->Siguiente;
  268.         }
  269.  
  270.         //Si el segundo nodo fue encontrado...
  271.         if (Aux2!=NULL)
  272.         {
  273.             //Si el primer nodo es el primer elemento...
  274.             if (Aux1==Lista->Inicio)
  275.             {
  276.                 //Muevo el segundo nodo al inicio de la lista y al primer nodo a la posición
  277.                 //donde se encontraba el segundo nodo.
  278.                 Lista->Inicio=Aux2;
  279.                 Aux2->Anterior->Siguiente=Aux1;
  280.             }
  281.             //Si el segundo nodo es el primer elemento...
  282.             else if (Aux2==Lista->Inicio)
  283.             {
  284.                 //Muevo el primer nodo al inicio de la lista y al segundo nodo a la posición
  285.                 //donde se encontraba el primer nodo.
  286.                 Lista->Inicio=Aux1;
  287.                 Aux1->Anterior->Siguiente=Aux2;
  288.             }
  289.             //Si ninguno de los dos nodos hallados es el primer elemento de la lista.
  290.             else
  291.             {
  292.                 Aux2->Anterior->Siguiente=Aux1;
  293.                 Aux1->Anterior->Siguiente=Aux2;
  294.             }
  295.  
  296.             //Almaceno el puntero que apunta al nodo anterior del primer nodo en una variable
  297.             //temporal.
  298.             T1 = Aux1->Anterior;
  299.             //Muevo el puntero que apunta al nodo anterior del segundo nodo al primer nodo.
  300.             Aux1->Anterior = Aux2->Anterior;
  301.             //Almaceno el puntero que apunta al nodo siguiente del primer nodo en una variable
  302.             //temporal.
  303.             T2 = Aux1->Siguiente;
  304.  
  305.             //Si el primer nodo no es el último elemento...
  306.             if (Aux1!=Lista->Fin)
  307.                 Aux1->Siguiente->Anterior=Aux2;
  308.             //Si es el último elemento...
  309.             Aux1->Siguiente=Aux2->Siguiente;
  310.  
  311.             //Muevo el puntero que apunta al nodo anterior del primer nodo al segundo nodo.
  312.             Aux2->Anterior = T1;
  313.             //Si el segundo nodo no es el último elemento...
  314.             if (Aux2==Lista->Fin)
  315.                 Aux2->Siguiente->Anterior=Aux1;
  316.             //Si es el último elemento...
  317.             Aux2->Siguiente=T2;
  318.         }
  319.         return Lista->Inicio; //Retorna el lo apuntado por el inicio de la lista.
  320.     }
  321.     else return NULL; //Retorna NULL si uno de los nodos no fue encontrado.
  322.  
  323. }
  324.  
  325. //-------------------------------------ARRAY DE NODOS---------------------------------//
  326. void *copiar(struct nodo *Lista, char letra)
  327. {
  328.     struct nodo *Actual;
  329.     int i=0; //Variable auxiliar para recorrer el array de punteros.
  330.     char *p[Lista->tam]; //Array de punteros, almacena los nombres que empiecen con la
  331.     //letra ingresada por el usuario.
  332.  
  333.     Actual=Lista->Inicio; //Parte desde el primer elemento de la lista.
  334.     printf("\n----->");
  335.     while (Actual!=NULL) //Mientras no llegue al final de la lista...
  336.     {
  337.         if (Actual->nombre[0] == letra) //Si la primera letra del nombre del nodo que se
  338.             //está analizando es igual a letra...
  339.         {
  340.             p[i]=Actual->nombre; //Se guarda el nombre del nodo en un array de punteros.
  341.             printf ("%s----->",p[i]); //Imprime dicho nombre.
  342.             i++; //Incrementa la posición del array de punteros en 1.
  343.         }
  344.         Actual=Actual->Siguiente; //Nos corremos al siguiente nodo.
  345.     }
  346. }
  347.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement