#include #include typedef struct { int numerador; // Numerador da fracao int denominador; // Denominador da fracao } Fracao; typedef struct FracaoNo { struct FracaoNo *proximo; // No sucessor ao no atual struct FracaoNo *anterior; // No anterior ao no atual Fracao *fracao; } FracaoNo; typedef struct Conjunto { FracaoNo *atual; // No atual da lista circular } Conjunto; // Retorna uma lista circular Conjunto *criarConjunto() { Conjunto *novo = malloc(sizeof(Conjunto)); novo->atual = NULL; return novo; } // Apaga uma lista circular void apagarConjunto(Conjunto *A); // Insere um elemento na lista circular apos o no atual void inserirElemento(Conjunto *A, Fracao *fracao) { FracaoNo *novo = malloc(sizeof(FracaoNo)); novo->fracao = malloc(sizeof(Fracao)); novo->fracao->numerador = fracao->numerador; novo->fracao->denominador = fracao->denominador; if (A->atual) { novo->proximo = A->atual->proximo; A->atual->proximo = novo; } else { A->atual = novo; novo->proximo = novo; } } void lerConjunto(Conjunto *A) { int num, den; while (scanf("%d/%d", &num, &den)) { Fracao *f = malloc(sizeof(Fracao)); f->numerador = num; f->denominador = den; inserirElemento(A, f); } } int buscar(Conjunto *A, Fracao *f) { FracaoNo *p = A->atual; if (p) { do { if (p->fracao->numerador == f->numerador && p->fracao->denominador == f->denominador) return 1; p = p->proximo; } while(p != A->atual); } return 0; } // retorna a intersecao das duas listas Conjunto *Intersecao(Conjunto *A, Conjunto *B) { Conjunto *intersecao = criarConjunto(); return intersecao; } void imprimirFracao(Fracao *f) { printf("%d/%d ", f->numerador, f->denominador); } // imprime o conjunto de fracoes void imprimirConjunto(Conjunto *A) { FracaoNo *p = A->atual; if (p) { do { imprimirFracao(p->fracao); p = p->proximo; } while(p != A->atual); } printf("\n"); } int main() { Conjunto *A, *B; A = criarConjunto(); B = criarConjunto(); lerConjunto(A); lerConjunto(B); printf("A: "); imprimirConjunto(A); printf("B: "); imprimirConjunto(B); printf("AeB: "); return 0; }