dominico
(usa Outra)
Enviado em 23/06/2014 - 15:59h
Código completo Ru4an
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*variavel tamanho dos conjuntos*/
int tam;
typedef struct conj
{
char *conjunto;
struct conj* prox;
int extensao;
}CONJ;
CONJ *busca(char *x, CONJ *lista, int pos)
{
CONJ *tmp;
tmp = lista[pos].prox;
while(tmp!=NULL && strcmp(tmp->conjunto, x)!=0){
tmp= tmp->prox;
}
return tmp;
}
/*insere na lista o conjunto de forma ordenada*/
void InserirOrd(CONJ *lista, int pos, char *conjunto){
CONJ *aux;
CONJ *tmp;
aux = (CONJ*) malloc((int)sizeof(CONJ));
aux->conjunto = malloc (sizeof (conjunto)+1);
strcpy(aux->conjunto,conjunto);
aux->prox = NULL;
if(busca(conjunto, lista, pos)!=NULL)
printf("E\n");
else{
if(lista[pos].prox == NULL) /*Caso a lista estiver vazia - Insere.*/
lista[pos].prox = aux;
else {
tmp = lista[pos].prox;
if (strcmp(tmp->conjunto, conjunto) > 0) { /*insere como primeiro da lista*/
aux->prox = tmp;
lista[pos].prox = aux;
} /*insere ordenados*/
else
if (tmp->prox == NULL) {
aux->prox = tmp->prox;
tmp->prox = aux;
}
else {
while((tmp->prox != NULL) &&(strcmp(tmp->prox->conjunto, conjunto) < 0))
tmp = tmp->prox;
aux->prox = tmp->prox;
tmp->prox = aux;
}
}
}
lista[pos].extensao = lista[pos].extensao + 1;
printf("0\n");
}
/*Imprimir conjuntos operação * */
void imprimir(CONJ *lista){
int i;
CONJ * tmp;
for(i=1; i<=tam; i++) {
tmp = lista[i].prox;
while (tmp != NULL && lista[i].extensao>0 && tmp->conjunto!=NULL) {
printf("%d %s\n",i, tmp->conjunto);
tmp = tmp->prox;
}
}
printf("0\n");
}
void verifica(char *conjunto, CONJ *lista, int tamanho){
if(busca(conjunto, lista, tamanho)!=NULL){
printf("0\n");
}
else
printf("E\n0\n");
}
CONJ* deletaConjunto(CONJ *lista, int pos, char *conjunto){
CONJ *tmp, *raiz; /* ponteiro para elemento anterior, ponteiro percorrer a lista */
raiz = lista[pos].prox;
/* procura elemento na lista, guardando anterior */
//printf("Entra deletar");
while (raiz != NULL && strcmp(raiz->conjunto, conjunto)!=0) {
tmp = raiz;
raiz = raiz->prox;
}
/* verifica se achou elemento */
if (raiz == NULL){
printf("E\n0\n"); /* não achou*/
return lista;
}
/* retira elemento */
if (tmp == NULL) {
/* retira elemento do inicio */
lista[pos].prox = raiz->prox;
}
else {
/* retira elemento do meio da lista */
tmp->prox = raiz->prox;
}
free(raiz);
lista[pos].extensao--;
printf("0\n");
return lista;
}
/* Verifica se cada conjunto da lista possui algum elemento
do do conjunto de entrada sendo assim, seguindo a regra de
se A é subconjunto proprio de B, então A está em B, com
a diferença de pelo menos um elemento de B não está em A.
*/
int verificaSubconjunto(char *aux, char *conjunto){
char *divide;
int presente=0;
divide= strtok(conjunto, " ");
while(divide!=NULL){
if(strstr(aux, divide))
presente = presente+1;
divide = strtok(NULL, " ");
}
return presente;
}
/*recebe as entradas para percorrer a lista e chmar a função para verificar se os
conjuntos da lista são subconjuntos da entrada*/
void subconjuntoProprio(CONJ* lista, int pos, char *conjunto){
CONJ *tmp;
char *aux;
int cont=0,i;
aux = malloc(strlen(conjunto)+1);
for(i=1;i<pos;i++){
tmp = lista[i].prox;
strcpy(aux, tmp->conjunto);
while (tmp != NULL) {
if(verificaSubconjunto(conjunto, aux)==i){
printf("%d %s\n",i, tmp->conjunto);
cont++;
}
tmp = tmp->prox;
}
}
printf("0\n");
free(aux);
return;
}
void verificaOperacacao(CONJ *lista,char op, int tamanho, char *conjunto){
switch(op){
case '+': InserirOrd(lista, tamanho, conjunto);
break;
case '-': lista = deletaConjunto(lista, tamanho, conjunto);
break;
case '=': verifica(conjunto, lista, tamanho);
break;
case '*': imprimir(lista);
break;
/*case '/': deletaSuperConjunto(lista, tamanho, conjunto);
break;*/
case '<': subconjuntoProprio(lista, tamanho, conjunto);
break;
/*case '>': superConjunto(lista, tamanho, conjunto);
break; */
}
}
int main()
{
char op, *conjunto;
int tamanho,i;
conjunto = (char*)malloc(sizeof(char));
fscanf(stdin, "%d", &tam);
CONJ lista[tam];
/*Inicializa lista*/
for(i=1; i<=tam; i++){
lista[i].conjunto =NULL;
lista[i].prox = NULL;
lista[i].extensao = 0;
}
while(!feof(stdin)){
fscanf(stdin,"\n%c %d\n", &op, &tamanho);
if(op=='*' )
verificaOperacacao(lista,op,tamanho,conjunto);
else{
if(op!='0'){
gets(conjunto);
verificaOperacacao(lista,op,tamanho,conjunto);/*encaminhar para verificar operação*/
}
}
}
return(0);
}
Para compilar e testar utilizo um txt, de entrada:
10
+ 2 2 4
+ 1 7
+ 8 1 2 3 5 6 7 8 10
+ 9 1 2 3 4 6 7 8 9 10
+ 5 1 3 4 6 10
+ 7 3 4 5 7 8 9 10
+ 7 2 4 5 6 7 9 10
+ 2 3 9
+ 1 4
+ 9 1 2 3 5 6 7 8 9 10
+ 4 1 5 7 8
+ 4 4 7 8 10
+ 5 2 3 6 9 10
+ 9 1 2 3 4 5 6 7 8 10
+ 6 1 4 6 8 9 10
+ 6 1 4 6 8 9 10
= 2 2 4
= 9 1 2 3 4 6 7 8 9 10
= 2 2 4
= 9 1 2 3 5 6 7 8 9 10
= 2 3 9
= 2 2 4
= 5 2 3 6 9 10
= 9 1 2 3 4 6 7 8 9 10
= 7 2 4 5 6 7 9 10
= 9 1 2 3 4 5 6 7 8 10
= 10 1 2 3 4 5 6 7 8 9 10
- 7 2 4 5 6 7 9 10
- 2 3 9
- 1 4
- 5 2 3 6 9 10
- 8 1 2 3 5 6 7 8 10
< 3 4 6 7
< 9 1 2 3 5 6 7 8 9 10
*
0
Em relação ao utilizar o for, não consigo saber do tamanho da string para declarar as variáveis auxiliares, o que dificulta utilizar deste modo.