//Inclusao de um nodo na arvore
void inserir_elemento(nodo ** raiz, nodo * novo){
   if (*raiz == NULL){
     *raiz = novo;
   }else{
     if(novo->info < (*raiz)->info){
        inserir_elemento(&(*raiz)->esquerda, novo);
     }else if (novo->info > (*raiz)->info){
        inserir_elemento(&(*raiz)->direita, novo);
     }
   }
}
void gerar_codigos(node *lista, char *codigo) {

	char *c0 = "0";
	char *c1 = "1";

	if (lista != NULL) {
		if ((lista->esq == NULL) && (lista->dir == NULL)) {
			inserir_elemento(lista->simbolo, codigo);
		}

		int tamanho = 0;
		gerar_codigos(lista->esq, strcat(codigo, c0));
		tamanho = strlen(codigo);codigo[tamanho-1] = '\0';
		gerar_codigos(lista->dir, strcat(codigo, c1));
		tamanho = strlen(codigo);codigo[tamanho-1] = '\0';
	}
}
Beispiel #3
0
struct conjunto* diferenca( struct conjunto* c1, struct conjunto* c2 ) {

    conjunto* c = criar_conjunto();
    inicia_lista(c);

    // Roda C1, se houver em c1 e não em c2, adiciona ao conjunto c
    lista_encadeada* temp = c1->lista->proximo_elemento;
    while(temp != NULL) {

        // Elemento não existe em c2?
        if(!pertinencia(c2,temp->elemento)) {

            inserir_elemento(c,temp->elemento);

        }

        temp = temp->proximo_elemento;

    }

    return c;

}
Beispiel #4
0
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;
        }

    }

}