int main() { tipo_palavra * palavra; palavra = inicia_lista("oi"); insere_elemento(palavra, "tchau"); insere_elemento(palavra, "feliz natal"); imprime_lista(palavra); printf("-----\n"); remove_elemento(&palavra, "oi"); imprime_lista(palavra); printf("-----\n"); remove_elemento(&palavra, "nao existe"); imprime_lista(palavra); printf("-----\n"); remove_elemento(&palavra, "tchau"); imprime_lista(palavra); printf("-----\n"); remove_elemento(&palavra, "nao existe"); imprime_lista(palavra); printf("-----\n"); remove_elemento(&palavra, "feliz natal"); imprime_lista(palavra); printf("-----\n"); }
struct conjunto* uniao( struct conjunto* c1, struct conjunto* c2 ) { conjunto* c = criar_conjunto(); inicia_lista(c); lista_encadeada* temp = c1->lista->proximo_elemento; lista_encadeada* temp1 = c2->lista->proximo_elemento; lista_encadeada* e = c->lista; while(temp != NULL || temp1 != NULL) { e->proximo_elemento = (lista_encadeada*) MALLOC(sizeof(lista_encadeada)); e->proximo_elemento->proximo_elemento = NULL; if(temp == NULL) { e->proximo_elemento->elemento = temp1->elemento; temp1 = temp1->proximo_elemento; } else if(temp1 == NULL) { e->proximo_elemento->elemento = temp->elemento; temp = temp->proximo_elemento; } else if(temp->elemento > temp1->elemento) { e->proximo_elemento->elemento = temp1->elemento; temp1 = temp1->proximo_elemento; } else if(temp->elemento < temp1->elemento) { e->proximo_elemento->elemento = temp->elemento; temp = temp->proximo_elemento; } else { e->proximo_elemento->elemento = temp->elemento; temp = temp->proximo_elemento; temp1 = temp1->proximo_elemento; } e = e->proximo_elemento; } return c; }
struct conjunto* intersecao( struct conjunto* c1, struct conjunto* c2 ) { conjunto* c = criar_conjunto(); inicia_lista(c); lista_encadeada* temp = c1->lista->proximo_elemento; lista_encadeada* temp1 = c2->lista->proximo_elemento; lista_encadeada* e = c->lista; while(temp != NULL && temp1 != NULL) { // Elemento são iguais? if(temp->elemento == temp1->elemento) { e->proximo_elemento = (lista_encadeada*) MALLOC(sizeof(lista_encadeada)); e->proximo_elemento->proximo_elemento = NULL; e->proximo_elemento->elemento = temp1->elemento; e = e->proximo_elemento; temp = temp->proximo_elemento; temp1 = temp1->proximo_elemento; } else if(temp->elemento > temp1->elemento) { temp1 = temp1->proximo_elemento; } else { temp = temp->proximo_elemento; } } return c; }
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; }
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; } } }