Conjuntos.c



// UNION Y COMPLEMENTO DE CONJUNTOS CON LISTAS
#include <stdio.h>
#include <stdlib.h>

struct nodo
{
	int num;
	struct nodo *sig;
};

struct nodo *ConjA, *ConjB, *ConjResp, *Universo, *Comple_Conj;

struct nodo *CreaNodo(int num)
{
	struct nodo *new = (struct nodo*)malloc(sizeof(struct nodo));
	new->num = num;
	new->sig = NULL;
	return new;
}
void inicializa(void) { ConjA = ConjB = ConjResp = Universo = Comple_Conj = NULL; }

void PonerEnListaA(struct nodo *new)
{
	if ( !ConjA ) ConjA = new;
	else { new->sig = ConjA; ConjA = new; }
}

void PonerEnListaB(struct nodo *new)
{
	if ( !ConjB ) ConjB = new;
	else { new->sig = ConjB; ConjB = new; }
}

void CreaConjunto(int tam, int V[], char Conj)
{
	int x = 0;
	struct nodo *new=NULL;

	for (x = 0; x<tam; x++)
	{
		new = CreaNodo(V[x]);
		(Conj=='A') ? PonerEnListaA(new) : PonerEnListaB(new);
	}
}

void Muestra(struct nodo *Conj)
{
	struct nodo *aux = Conj;
	while (aux) { printf("%d\t", aux->num); aux = aux->sig; }
	printf("\n\n");
}

int Existe(int num)
{
	struct nodo *aux = ConjResp;
	
	while(aux)
	{
		if (num == aux->num) return 1;
		aux = aux->sig;
	}
	return 0;
}

void Union(void)
{
	struct nodo *aux=NULL, *new = NULL;

	aux = ConjA;
	while(aux)	// COPIAMOS EL CONJUNTO A EN RESP
	{
		new = CreaNodo(aux->num);
		if ( !ConjResp ) ConjResp = new;
		else { new->sig = ConjResp; ConjResp = new; }
		aux = aux->sig;
	}
	aux = ConjB;
	while(aux)	// COPIAMOS DE CONJB LOS QUE NO ESTAN REPETIDOS
	{
		if ( !Existe(aux->num) )
		{
			new = CreaNodo(aux->num);
			if ( !ConjResp ) ConjResp = new;
			else { new->sig = ConjResp; ConjResp = new; }
		}
		aux = aux->sig;
	}
}

int RevisaComplemento(int num, struct nodo *aux)
{
	while(aux)
	{
		if (num == aux->num) return 1;
		aux = aux->sig;
	}
	return 0;
}

void Complemento(struct nodo *Conjunto)
{
	struct nodo *U_aux = Universo, *new=NULL;
	
	while ( U_aux )
	{
		if ( !RevisaComplemento(U_aux->num, Conjunto) )
		{
			new = CreaNodo(U_aux->num);
			if ( !ConjResp ) ConjResp = new;
			else { new->sig = ConjResp; ConjResp = new; }
		}
		U_aux = U_aux->sig;
	}
}

void inicio()
{
	int LA[] = {1, 2, 3, 4, 6};
	int LB[] = {3, 5, 6, 7, 9};
	CreaConjunto(5, LA, 'A');
	CreaConjunto(5, LB, 'B');

	printf("El conjunto A es: "); Muestra(ConjA);
	printf("El conjunto B es: "); Muestra(ConjB);
	Union(); Universo = ConjResp; printf("La unión es: "); Muestra(Universo);
	ConjResp = NULL;
	Complemento(ConjA); Comple_Conj = ConjResp;
	printf("El complemento de A' es: "); Muestra(Comple_Conj);
}

int main(char **a, int b) { inicializa(); inicio(); }