//Librerías.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//Estructura.
struct nodo
{
char nombre[50];
int socio;
struct nodo *Siguiente;
struct nodo *Anterior;
struct nodo *Inicio;
struct nodo *Fin;
int tam;
};
//Prototipos de las funciones.
int insertar (struct nodo *Lista , char *n, int s);
struct nodo *intercambiar (struct nodo *Lista, char *cadena1, char *cadena2);
int comparar(char *cad1,char *cad2);
void *copiar(struct nodo *Lista, char letra);
int menu (struct nodo *Lista);
void imprimir (struct nodo *Lista);
//---------------------------------------MAIN-------------------------------------------//
int main (void)
{
struct nodo *lista;
lista=malloc(sizeof(struct nodo));
char *nom;
nom=malloc(50);
int opcion=1;
int soc;
int aux;
char *str1, *str2;
char l;
str1=malloc(50);
str1=malloc(50);
//Incicialización de variables.
lista->Inicio=NULL;
lista->Fin=NULL;
lista->tam=0;
while (opcion!=4)
{
opcion=menu(lista);
switch (opcion)
{
case 4:
printf ("\nFin de la ejecución.\n");
exit(-1);
break;
case 0:
printf ("\nIngrese un nombre:");
scanf ("%s",nom);
printf ("\nIngrese nro. de socio:");
scanf ("%d",&soc);
insertar (lista,nom, soc);
imprimir(lista);
printf ("\n%d elementos.\n",lista->tam);
break;
case 1:
printf ("\nIngrese primer nombre:");
scanf ("%s",str1);
printf ("\nIngrese segundo nombre:");
scanf ("%s",str2);
intercambiar (lista,str1,str2);
imprimir (lista);
break;
case 2:
printf ("\nIngrese primer nombre:");
scanf ("%s",str1);
printf ("\nIngrese segundo nombre:");
scanf ("%s",str2);
aux = comparar (str1,str2);
if (aux==0)
printf ("\nCadenas iguales.\n");
if (aux==1)
printf ("\nPrimera cadena mayor.\n");
if (aux==-1)
printf ("\nSegunda cadena mayor.\n");
break;
case 3:
printf ("\nIngrese letra:");
scanf ("%c",&l);
getchar();
copiar (lista,l);
}
}
return 0;
}
//---------------------------------------MENU-------------------------------------------//
int menu (struct nodo *Lista)
{
int eleccion;
if (Lista->tam==0)
{
printf ("\nElija una de las opciones que aparecen en pantalla:\n");
printf ("\n0-Insertar elemento.\n1-Salir.\n");
printf ("\nOpción:");
scanf ("%d",&eleccion);
if (eleccion==1)
eleccion=4; //Para que coincida con el menú de abajo.
}
else
{
printf ("\nElija una de las opciones que aparecen en pantalla:\n");
printf ("\n0-Insertar elemento.\n1-Intercambiar nodos.\n2-Comparar nodos.\n3-Copiar nodos.\n4-Salir.\n");
printf ("\nOpción:");
scanf ("%d",&eleccion);
}
return eleccion;
}
//---------------------------------INSERTAR NUEVO NODO----------------------------------//
int insertar (struct nodo *Lista , char *n, int s)
{
struct nodo *Nuevo, *Actual;
int insert;
int i=0;
if ( (Nuevo = malloc (sizeof (struct nodo) ) ) == NULL)
return -1;
//if ( (Nuevo->nombre = malloc (sizeof (char *) ) ) == NULL)
//return -1;
for( i=0; *(n+i)!='\0'; i++ )
{
Nuevo->nombre[i] = *(n+i);
}
Nuevo->nombre[i]='\0';
Nuevo->socio=s;
if (Lista->tam==0)
{
Nuevo->Anterior=Lista->Inicio;
Nuevo->Siguiente=Lista->Fin;
Lista->Inicio=Nuevo;
Lista->Fin=Nuevo;
Lista->tam++;
return 0;
}
else //Inserta después del último nodo ingresado.
{
Actual=Lista->Inicio;
while ( Actual->Siguiente != NULL && strcmp(n,Actual->nombre ) !=0 )
Actual=Actual->Siguiente;
Nuevo->Anterior=Actual;
if (Actual->Siguiente==NULL)
Lista->Fin=Nuevo;
else Actual->Siguiente->Anterior=Nuevo;
Actual->Siguiente=Nuevo;
Lista->tam++;
return 0;
}
}
//------------------------------------IMPRIMIR LISTA--------------------------------------//
void imprimir (struct nodo *Lista)
{
struct nodo *Inverso, *Actual;
int choice;
printf ("\nElija una de las opciones que aparecen en pantalla:\n");
printf ("\n1-Imprimir lista.\n2-Imprimir lista al revés.\n");
printf ("\nOpción:");
scanf ("%d",&choice);
Actual=Lista->Inicio;
printf ("\n----->");
if (choice==1)
{
while (Actual!=NULL)
{
Inverso=Actual;
printf ("Nombre:%s/Socio:%d----->",Actual->nombre,Actual->socio);
Actual=Actual->Siguiente;
}
}
Inverso=Inverso->Anterior; //Porque sino comienza de NULL.
if (choice==2)
{
while (Inverso!=NULL)
{
printf ("Nombre:%s/Socio:%d----->",Inverso->nombre,Inverso->socio);
Inverso=Inverso->Anterior;
}
}
}
//------------------------------------COMPARA NODOS-----------------------------------//
int comparar(char *cad1,char *cad2)
{
int i=0, j=0, aux=0;
for (i=0 ; *(cad1+i)!='\0' ; i++)
for (j=0 ; *(cad2+j)!='\0' ; j++)
{
if (*(cad1+i)==*(cad2+j))
aux=0;
if (*(cad1+i)<*(cad2+j))
aux=-1;
if (*(cad1+i)>*(cad2+j))
aux=1;
}
return aux;
}
//------------------------------------INTERCAMBIA NODOS-------------------------------//
struct nodo *intercambiar (struct nodo *Lista, char *cadena1, char *cadena2)
{
char *auxn1=NULL, *auxn2=NULL;
int auxs1=0, auxs2=0;
struct nodo *Actual, *Aux1, *Aux2;
int i=0;
Aux1 = malloc (sizeof (struct nodo) );
Aux2 = malloc (sizeof (struct nodo) );
auxn1=malloc(50);
auxn2=malloc(50);
Actual=Lista->Inicio;
while (Actual!=NULL)
{
if (comparar (Actual->nombre,cadena1)==0) //Al ser 0, quiere decir que las cadenas son iguales.
{
//Copia información del nodo Actual (nombre y socio) en variables auxiliares.
auxn1=Actual->nombre;
auxs1=Actual->socio;
Aux1=Actual;
break;
}
Actual=Actual->Siguiente;
}
Actual=Lista->Inicio;
while (Actual!=NULL)
{
if (comparar (Actual->nombre,cadena2)==0) //Al ser 0, quiere decir que las cadenas son iguales.
{
//Copia información del nodo Actual (nombre y socio) en variables auxiliares.
auxn2=Actual->nombre;
auxs2=Actual->socio;
Aux2=Actual;
break;
}
Actual=Actual->Siguiente;
}
if (Aux1==NULL || Aux2==NULL)
return NULL;
printf ("\n%s",auxn1);
printf ("\n%s",auxn2);
printf ("\n%d",auxs1);
printf ("\n%d",auxs2);
//Intercambia información entre nodos:
for( i=0; *(auxn2+i)!='\0'; i++ )
Aux1->nombre[i]=*(auxn2+i);
Aux1->socio=auxs2;
for( i=0; *(auxn1+i)!='\0'; i++ )
Aux2->nombre[i]=*(auxn1+i);
Aux2->socio=auxs1;
return Lista->Inicio;
}
//-------------------------------------ARRAY DE NODOS---------------------------------//
void *copiar(struct nodo *Lista, char letra)
{
struct nodo *Actual;
int i=0;
char *p[Lista->tam];
Actual=Lista->Inicio;
printf("\n----->");
while (Actual!=NULL)
{
if (Actual->nombre[0] == letra)
{
p[i]=Actual->nombre;
printf ("%s----->",p[i]);
i++;
}
Actual=Actual->Siguiente;
}
}