Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

AprendizPHP

Número de buscas realizadas

Recommended Posts

Olá pessoal,

 

Tenho um programa que insere/busca em uma lista aberta, como posso mostrar também, o número de buscas até achar o resultado?

 

#include <stdio.h>
#include <stdlib.h>

//****************************************************************************
//estrutura de nodo e vetor
struct no{//informação do no
int chave;
struct no *prox;

  };

typedef struct no nodo;

nodo vet_encadeado[10];
int vet_end_aberto[10];


//****************************************************************************
void InicializaVetores(){
    int i;
    for(i=0;i<10;i++){
        vet_encadeado[i].chave=0;
        vet_encadeado[i].prox=NULL;

        vet_end_aberto[i] = 0;
    }
}

void InsereVetorEndAberto(int endereco, int val) {

    int numero = 0;
    int contador = endereco;

    while(numero == 0){
       if (vet_end_aberto[contador] == 0){
           vet_end_aberto[contador] = val;
           numero = 1;
           contador = contador + 1;
       }else{
           contador = contador + 1;
       }
       if (contador >= 10){
           contador = 0;
           }
       }
   }

void PesquisaVetorEncadeado(int endereco, int val) {
//printf("Nao implementado neste exemplo!\n");
}

void PesquisaVetorEndAberto(int endereco, int val) {
    int contador = 0;
    int valor = 0;
    printf("Enderecamento Aberto: ");

    for (contador = 0; contador < 10; contador++){
        if (vet_end_aberto[contador] == val){
           printf("Valor %d foi encontrado na posicao %d  \n",val,contador);
           valor = 1;
        }
    }

    if (valor == 0){
       printf("Valor nao foi encontrado \n");
       }
   }

void ExibeVetor(void){
    int contador = 0;
    printf("Lista aberta: \n");

    for (contador = 0; contador < 10; contador++){
       printf("Valor no endereco %d: %d \n",contador,vet_end_aberto[contador]);
       }
   }

//****************************************************************************
main() {
   int opcao, valor, end;
   opcao = 0;
InicializaVetores();
   while(opcao != 4){
       system("cls");
       printf(" |------------------|\n");
       printf("\n Entre com a opcao:\n");
       printf(" |--------------------|\n");
       printf(" | 1 - Inserir valor  |\n");
       printf(" | 2 - Pesquisa valor |\n");
   	printf(" | 3 - Exibir vetores |\n");
       printf(" | 4 - Sair           |\n");
       printf(" |--------------------|\n");

       scanf("%d",&opcao);
       switch(opcao)  {
         case 1: printf(" Digite um valor para inserir no vetor:\n");
                 //Lê valor de chave
                 scanf("%d",&valor);
                 //Calcula endereço
                 end = valor%10;
                 printf("Endereco calculado: %d\n",end);
                 InsereVetorEncadeado(end,valor);
   			  InsereVetorEndAberto(end,valor);
                 system("pause");
                 break;
   	  case 2: printf(" Digite um valor a ser pesquisado:\n");
                 //Lê valor de chave
                 scanf("%d",&valor);
                 //Calcula endereço
                 end = valor%10;
                 printf("Endereco calculado: %d\n",end);
                 PesquisaVetorEncadeado(end,valor);
   			  PesquisaVetorEndAberto(end,valor);
                 system("pause");
                 break;
   	  case 3: ExibeVetor();
                 system("pause");
                 break;
         case 4: printf("\nVoce solicitou a opcao - sair!\n");
                 system("pause");
                 exit(0);
                 break;
         default:printf("\tATENCAO - Opcao invalida, tente novamente!\n");
        }
   }
   system("pause");
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sugiro que não tome este exemplo como base para uma implementação sua, por vários motivos - alguns deles vão abaixo:

 

- Um único vetor é utilizado pelos algoritmos do código; isto impossibilita o uso do código por programas que queiram usar mais de uma lista;

- os nomes de objetos e rotinas não são claros/intuitivos;

- o autor fornece rotinas para inicialização de objetos com external linkage, que são inicializados automaticamente;

- a declaração de main não é portável, apesar de legal;

- apesar de system ser portável, o comando 'pause' não é.

 

Os itens acima sugerem que pode haver grande quantidade de bugs. Eu reescreveria o código.

 

Sobre sua dúvida, a partir do momento em que se entende o ponto de iteração da rotina de busca, resolver o problema resume-se a incrementar um contador. Tornar a contagem acessível a quem chama a função pode ser 'menos fácil'. Uma sugestão é a seguinte, assumindo que 'nodo' é o nome escolhido para o alias dos nós das suas listas, e que elas armazenem ints:

 

static int nro_iteracoes_busca;

nodo *busca(nodo *lista, int valor)
{
   // buscar e incrementar nro_iteracoes_busca
   // caso o valor não seja encontrado, retornar NULL e fazer
   // nro_iteracoes_busca receber algum valor negativo.
}

int get_contador_busca(void)
{
   return nro_iteracoes_busca;
}

 

Outra possível implementação envolveria encapsular a contagem de iterações de cada busca em um tipo próprio:

 

typedef struct res_busca
{
   int posicao; // posicao em que o valor procurado estava
   int nro_iteracoes; // número de iterações necessárias para encontrar o valor
} resultado_busca;


resultado_busca busca(nodo *lista, int valor)
{
   int posicao = 0, iteracoes = 0;
   // buscar e incrementar iteracoes

   // caso achemos o valor na lista,
   return (resultado_busca) { posicao, iteracoes };

   return (resultado_busca) { -1, -1 };
}

 

A segunda solução pode ser usada em código paralelo com maior segurança, já que o contador de iterações não é único a todos os clientes.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo, entendi suas dicas, só uma dúvida, como exibir as iterações somente quando usar a função PesquisaVetorEndAberto, ou seja, Pesquisa valor

 

 

Obrigado pela ajuda!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.