//Subtrai um conjunto de outro. conjunto * subtrair(conjunto * ca, conjunto * cb) { conjunto * c = NULL; //clona a lista ca para poder deletar os elementos sem perder a lista anterior. c = somar(ca, NULL); while (cb != NULL) { //remove os elementos de cb em ca. c = remover_elemento(c, cb->numero); cb = cb->prox; } return c; }
//Realiza a intersecao de dois conjunto em um novo. conjunto * intersec(conjunto * ca, conjunto * cb) { //A ∩ B = A - (A - B) conjunto * intersecao = NULL; conjunto * temp = NULL; //lista temporária para poder realizar o cálculo. temp = subtrair(ca, cb); intersecao = subtrair(ca, temp); while(temp != NULL){ //limpa a lista temporária temp = remover_elemento (temp, temp->numero); } return intersecao; }
//Realiza a uniao de dois conjuntos em um novo. conjunto * unir(conjunto * ca, conjunto * cb) { // A U B = (A - B) + B conjunto * uniao = NULL; conjunto * temp = NULL; //lista temporária para poder realizar o cálculo. temp = subtrair(ca, cb); uniao = somar(temp, cb); /* *Com o tratamento feito pela função inserir a poderiamos usar apenas a seguinte linha: * *uniao = somar (ca, cb); *poém qualquer alteração em inserir iria danificar a função, por isso opitei pela fórmula da teoria dos conjuntos. */ while (temp != NULL) { //limpa a lista temporária temp = remover_elemento(temp, temp->numero); } return uniao; }
int main() { struct conjunto* C[10]; int i; for( i = 0; i < 10; ++i ) C[i] = criar_conjunto(); //cria os 10 conjuntos vazios //ou: //C[i] = NULL for( i = 0; i < 10; ++i ) inicia_lista(C[i]); conjunto* c; char op; int c1,c2,c3; while( 1 ) { scanf("%c", &op); switch( op ) { case 'A': scanf("%d %d", &c1, &c2); inserir_elemento(C[c1-1],c2); break; case 'R': scanf("%d %d", &c1, &c2); remover_elemento(C[c1-1],c2); break; case 'L': scanf("%d", &c1); listar_elementos(C[c1-1]); break; case 'F': scanf("%d", &c1); deletar_conjunto(C[c1-1]); C[c1-1] = criar_conjunto(); inicia_lista(C[c1-1]); break; case 'I': scanf("%d %d %d", &c1, &c2, &c3); c = intersecao(C[c1-1],C[c2-1]); deletar_conjunto(C[c3-1]); C[c3-1] = c; break; case 'U': scanf("%d %d %d", &c1, &c2, &c3); c = uniao(C[c1-1],C[c2-1]); deletar_conjunto(C[c3-1]); C[c3-1] = c; break; case 'P': scanf("%d %d", &c1, &c2); if(pertinencia(C[c1-1],c2)) printf("S\n"); else printf("N\n"); break; case 'D': scanf("%d %d %d", &c1, &c2, &c3); c = diferenca(C[c1-1],C[c2-1]); deletar_conjunto(C[c3-1]); C[c3-1] = c; break; case 'C': scanf("%d %d", &c1, &c2); if(subconjunto(C[c1-1],C[c2-1])) printf("S\n"); else printf("N\n"); break; case '=': scanf("%d %d", &c1, &c2); if(igualdade(C[c1-1],C[c2-1])) printf("S\n"); else printf("N\n"); break; case '#': scanf("%d", &c1 ); printf("%d\n", cardinalidade( C[c1-1]) ); break; case 'X': for( i = 0; i < 10; ++i ) deletar_conjunto(C[i]); bapply(bprint); //não modifique esta linha return 0; } } }