main(){
	int vetor[3];
	ler(vetor,3);
	mostrar(vetor,3);
	printf("Maior elemento: %d.\n",maiorElemento(vetor,3));
	printf("\nMenor elemento: %d.\n",menorElemento(vetor,3));
}
int main(int argc,char* argv[]) {
	int n, i, num;
	PPNo lista;
	PNo menor;
	
	lista = (PPNo) malloc(sizeof(PNo));
	*lista = NULL;
	
	scanf("%d",&n);
	for(i=0;i<n;i++) {
		scanf("%d",&num);
		insereValor(lista,num);
	}
	
	printf("Procurando segundo menor elemento na lista: ");
	imprime(lista);
	menor = menorElemento(lista);
	printf("Menor elemento: %d (comparacoes: %d de %d)\n",menor->valor,comps,maxComps(n));
	if (menor->maiores) { 
		menor = menorElemento(&(menor->maiores));
		printf("Segundo menor: %d (comparacoes: %d de %d)",menor->valor,comps,maxComps(n));	
	}
	return 0;
}
Ejemplo n.º 3
0
int main(int argc,char* argv[]) {
    int *vetor, *vet_menores, i, menor, tam_menores, segundo_menor, max;

    srand(time(NULL));

    if(argc > 1) max = argc-1;
    else max = rand()%100;

    printf("MAX: %d\n",max);

    vetor = malloc(sizeof(int)*max);
    vet_menores = malloc(sizeof(int)*max);

    if(argc > 1) {
        for(i=1; i<argc; i++) {
            vetor[i-1] = atoi(argv[i]);
        }
    } else {
        for(i=0; i<max; i++) {
            vetor[i] = rand()%100;
            printf("%d ",vetor[i]);
        }
        printf("\n");
    }

    tam_menores = 0;
    menor = menorElemento(vetor,max,vet_menores,&tam_menores); /* chama funcao que retorna o menor elemento,
																	e guarda no vetor vet_menores os potenciais segundos menores valores */
    printf("Menor elemento: %d -- %d / %d\n",menor,comps,maxComps(max));

    segundo_menor = menorElemento(vet_menores,tam_menores,vetor,&tam_menores); /* procura o menor elemento dentro do vetor com os potenciais segundos
																				menores valores (os 2 ultimos argumentos são irrelevantes para esse caso */
    printf("Segundo menor elemento: %d -- %d / %d\n",segundo_menor,comps,maxComps(max));

    return 0;
}
/* Retorna um nó com o menor elemento da lista apontada por inicio, e guarda nesse nó uma lista com todos os nós que foram comparados com ele */
PNo menorElemento(PPNo inicio) {
	PNo aux, prox, menor_anterior;
	
	aux = prox = *inicio;
	menor_anterior = NULL;
	while(aux != NULL && prox != NULL) { /* laço que percorre a lista até o fim */
		prox = aux->prox;
		if(prox) { /* se prox nao apontar para NULL, é porque aux aponta para um nó e prox para outro e podemos comparar os dois */
			comps++; /* conta mais uma comparação */
			if(aux->valor < prox->valor) { /* se o valor do nó apontado por aux for maior que que o valor de prox */
				insereValor(&aux->maiores,prox->valor); /* insere o valor do nó maior (apontado por prox) na lista de valores maiores do nó 
															apontado por aux */
				if(menor_anterior) menor_anterior->prox = aux; /* se menor_anterior estiver setado, ele passa a apontar para aux (que é o menor valor) */
				aux->prox = NULL; /* aux passa a ser o final da lista ligada (evita problemas de loop infinito em caso de lista com nº de nós impar) */
				menor_anterior = aux; /* salva o ponteiro aux em menor_anterior, pois ele vai apontar para o proximo nó menor na proxima comparação */
				aux = prox->prox;
			}
			else { /* nó prox é maior que nó aux */
				insereValor(&prox->maiores,aux->valor); /* insere o valor do nó maior (apontado por prox) na lista de valores maiores do nó 
															apontado por aux */
				if(menor_anterior) menor_anterior->prox = prox; /* se menor_anterior estiver setado, ele passa a apontar parar prox (que é o menor valor) */
				else *inicio = prox; /* se não, o ponteiro para o inicio da lista passa a apontar para o prox */
				menor_anterior = prox; /* salva o endereço apontado por prox em menor_anterior */
				aux = prox->prox;
			}
		}else { /* se prox nao existe */
			if (menor_anterior) menor_anterior->prox = aux; /* se menor_anterior nao for NULL, o nó apontado por ele passa a apontar para aux */
			aux = NULL; /* seta aux como NULL para sair do laço */
		}
		
	}
	
	if((*inicio)->prox) { /* se a lista tiver mais que dois nós */
		return menorElemento(inicio); /* chama a mesma função recursivamente */
	}else {
		return *inicio; /* o nó que sobrou, é o menor da lista. Retorna ele. */
	}
}
Ejemplo n.º 5
0
/* Retorna o menor elemento do vetor e guarda os potenciais 2os menores valores no vetor vet_menores */
int menorElemento(int *v,int max,int *vet_menores,int* tam_menores) {
    int i, tam2, *v2;
    static int menor;

    v2 = malloc(sizeof(int)*max/2+1);
    tam2 = 0;

    for(i=0; i<max && i+1<max; i=i+2) {
        comps++;
        tam2++;
        if(v[i] > v[i+1]) {
            v2[i/2] = v[i+1];
        } else {
            v2[i/2] = v[i];
        }
    }

    if(max % 2 == 1) { /* se numero de elementos for impar, passa o ultimo elemento (que nao foi comparado com ninguem para o v2 */
        v2[tam2] = v[max-1];
        tam2++;
    }

    if(tam2 > 1) {
        menor = menorElemento(v2,tam2,vet_menores,tam_menores);
    } else {
        menor = v2[0];
    }

    for(i=0; v[i]!=menor; i++) { } /* laço que procura a posicao do menor elemento do vetor */
    if(i % 2 == 0) vet_menores[*tam_menores] = v[i+1];
    else vet_menores[*tam_menores] = v[i-1];

    (*tam_menores)++;

    return menor;
}