Ir ao conteúdo
  • Cadastre-se

C Buscar na lista em C


Paula_Fabiana

Posts recomendados

Então, esse é meu primeiro programa com lista e eu vi feito por um prof no you tube, minha duvida é como chamar a função busca posição na função principal

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


const int MAXTAM = 1000;

int Frente, Tras;

int Lista[MAXTAM];


void Lista_Construtor(){
    Frente=0;
    Tras=-1;
}


bool Lista_Inserir_Inicio(int valor){
    if(Lista_Cheia()){
        return false;
    }else{
        for(int i=Tras+1;i>Frente;i--)
            Lista[i]=Lista[i-1];

        Lista[Frente]=valor;
        Tras++;
        return true;
    }
}


bool Lista_Inserir_Fim(int valor){
    if(Lista_Cheia()){
        return false;
    }else{
        Tras++;
        Lista[Tras]=valor;
        return true;
    }
}


bool Lista_Inserir(int valor, int Posicao){
    if(Lista_Cheia()){
        return false;
    }else{
        if(Posicao>=Frente && Posicao<=Tras){
            for(int i=Tras+1;i>Posicao;i--)
                Lista[i]=Lista[i-1];

            Lista[Posicao]=valor;
            Tras++;
            return true;
        }else{
            return false;
        }
    }
}






bool Lista_Busca_Valor(int valor, int &Posicao){
    int i;
    if(Lista_Vazia()){
        return false;
    }else{

        for(i=Frente;i<Tras;i++){
            if(Lista[i]==valor){
                break;
            }
        }
        if(i==Tras){
            return false;
        }else{
            Posicao=i;
            return true;
        }

        valor=Lista[Posicao];
        return true;
    }
}



int main(){
    int valor;

    Lista_Construtor();
    Lista_Inserir_Fim(5);
    Lista_Inserir_Inicio(10);
    Lista_Inserir_Fim(7);
    Lista_Inserir(20,1);    
    Lista_Inserir_Inicio(8);
   
    //Lista_Busca_Posicao(*8, 1);
   


   system("pause");
    return 0;
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Para chamar:

//Variaveis
int valor, *posicao;
//Chamada
Lista_Busca_Posicao(valor, posicao);

 

Se quiser simplificar a função:

bool Lista_Busca_Valor(int valor, int &Posicao){
    if(!Lista_Vazia()){
    	int i;
        for(i=Frente;i<Tras;i++){
            if(Lista[i]==valor){
            	Posicao=i;
        	valor=Lista[Posicao];
              	return true;
            }
        }
    }
    return false;
}

 

  • Curtir 3
  • Amei 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá @Paula_Fabiana, vamos lá:

 

Primeiramente: compilei o seu código, e aqui ficou faltando o método Lista_Vazia(). Mas vamos analisar os outros pontos:

 

Citando:

19 horas atrás, Paula_Fabiana disse:

minha duvida é como chamar a função busca posição na função principal

 

A chamada da função de busca é da mesma forma que é feita para as outras funções (ou qualquer outra função em qualquer outro contexto), ou seja, primeiramente é necessário entender como a função funciona. Se já souber, ok. Senão, pode tentar analisar, por exemplo:

 

Analisamos a assinatura:

19 horas atrás, Paula_Fabiana disse:

bool Lista_Busca_Valor(int valor, int &Posicao){

 

Logo, recebe um inteiro e outro inteiro; e retorna na própria função um valor booleano. Alguma dúvidas até aqui?

 

Então, apenas pela assinatura, daria para supor que a resposta da busca vem pelo segundo parâmetro, pois este está como "parâmetro por referência" (tem lá um "&". Assim "salva" o valor quando é alterado dentro da função), enquanto o primeiro está apenas como "parâmetro por valor" (a função só pega o valor que foi passado, o que mudar dentro não altera nada na parte exterior à função).

 

Desta forma, ao utilizar a função de busca, passa o "valor que eu quero achar" e "a variável que vai receber a posição caso a função ache o número que eu quis achar". Beleza?

 

Como nós temos a função completa, daria para ver nessa parte abaixo onde retorna a posição quando acha:

if(Lista[i]==valor){
    Posicao=i; //aqui ó! A variável que foi passada na segunda posição vai conter a posição onde foi encontrado o número
    {valor=Lista[Posicao];} //pode apagar... explicação abaixo!
    return true;
}

//o comando "valor=Lista[Posicao]" está incoerente, pois a variável valor já é igual ao "valor" que foi achado. Já que ela foi justametne usada para achar o que você quer, e ao mesmo tempo o if faz justamente essa comparação... entende? seria como usar o 8 para achar o 8, e dizer que 8=8. Outro motivo para incoerencia é que isso não vai servi para nada, pois essa variável é perdida ao finalizar a função, já que é NÃO ESTÁ como referência (está como valor)... 

 

Resumindo:

Dá para chamar a função assim:

  Lista_Busca_Valor(8, posicaoBusca);

Logo, após a busca, a variável posicaoBusca terá a posição onde o 8 está.  Ah! mas se não encontrar o número? ai entra o "stutus" da operação, ou seja, você poderia usar o retorno da função. Veja lá na assinatura que é do tipo bool, se analisar o código verás que retorna true quando acha, ou false quando não achar. (no código lá em baixo tem um exemplo)

 

 

 

 

Outro ponto importante é que toda vez que se pensa em armazenar algo, necessariamente terá que também pensar na forma da recuperação desse algo, ou seja, não adianta armazenar algo se não vai recuperar ou nem mesmo conseguir recuperar depois. É uma princípio... Lendo assim parece óbvio, mas veja:

 

int main(){
    //int valor; //obs.: esta variável não está sendo utilizada em nenhum momento, logo não devia ser declarada
    Lista_Construtor();
    Lista_Inserir_Fim(5);
    Lista_Inserir_Inicio(10);
    Lista_Inserir_Fim(7);
    Lista_Inserir(20,1);    
    Lista_Inserir_Inicio(8);  
    //Lista_Busca_Posicao(*8, 1);   
    system("pause");
    return 0;
}

No "programa principal" você inicializa a lista, depois pois insere números e finaliza... mas iaí, fez o que com os números armazenados? e outra, como saber se foi armazenado ou não?

 

Uma sugestão seria criar um método chamado Lista_Imprimir(), que imprime na tela todos os números da lista e outro método chamado Lista_Imprimi(int) que imprime o valor da posição na lista.  Ai o poderia ficar por exemplo assim:
 

//Função que imprimir toda a lista
bool Lista_Imprimir(){
    //aqui você imprementa a função
}

//Função que imprimr número contido na posição especificada
bool Lista_Imprimir(int posicao){
    //aqui você imprementa a função
}


int main(){
    int posicaoBusca;
	
    Lista_Construtor();
    Lista_Imprimir();
    
    Lista_Inserir_Fim(5);
    Lista_Imprimir();
    
    Lista_Inserir_Inicio(10);
    Lista_Imprimir();
	
    Lista_Inserir_Fim(7);
    Lista_Imprimir();
    
    Lista_Inserir(20,1);
    Lista_Imprimir();
    
    Lista_Inserir_Inicio(8);
    Lista_Imprimir();
    
    if (Lista_Busca_Valor(8, posicaoBusca)) {
        Lista_Imprimir(posicaoBusca);
    }
    
    system("pause");
    return 0;
}

 

Deu para entender?

 

Desta forma, a cada etapa será impresso como a lista ficou após as inserções... ao mesmo tempo que testa a busca lá no final.

 

 

Qualquer dúvida sobre qualquer parte é só postar.

 

 

No aguardo.

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@Simon Viegas Olá, meu professor fez, ficou assim 

/*
 * Agenda Telefônica usando Lista Simplesmente Encadeada
 */

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

// nome do arquivo onde programa irá salvar os dados da lista telefônica
#define NOME_ARQUIVO "ListaTelefonica.txt"

// estrutura que irá armazenar os dados de um contato
typedef struct strContato
{
    char nome[80];
    char fone[15];
    struct strContato *prox;    // apontador para próximo elemento da lista

}Contato;

// Protótipos das funções locais
void LerArquivo(void);
void GravarArquivo(void);
void Inserir(void);
void Alterar(void);
void Eliminar(void);
void Pesquisar(void);
void ListarTodos(void);
char* ProcuraSubstring(char *, char *);
void DestroiLista(void);
void InsereFinalLista(Contato *novo);
void AlteraContato(Contato *);

// apontador para início da lista que contém os dados da agenda
Contato *inicio;

void main()
{
    // permitir uso de acentuação
    setlocale(LC_ALL, "");

    // inicialmente a lista está vazia
    inicio = NULL;

    // leitura dos dados previamente cadastrados, caso
    // o usuário tenha usado o programa anteriormente
    LerArquivo();

    // opções do menu
    int op;
    do
    {
        printf("\n===========================\n");
        printf("Agenda Telefônica - Opções:\n");
        printf("===========================\n");
        printf("1. Inserir\n");
        printf("2. Alterar\n");
        printf("3. Eliminar\n");
        printf("4. Pesquisar\n");
        printf("5. Listar Todos\n");
        printf("6. Sair\n\n");
        printf("---------------------------\n");
        printf("Digite a sua opção (1..6): ");
        scanf("%d", &op);

        switch(op)
        {
            case 1: Inserir(); break;
            case 2: Alterar(); break;
            case 3: Eliminar(); break;
            case 4: Pesquisar(); break;
            case 5: ListarTodos(); break;
        }
    }while (op != 6);

    // ao terminar o programa, o usuário tem a oportunidade
    // de fazer a gravação dos dados cadastrados
    printf("Salva agenda (S/N)? ");
    char resp;
    do
    {
        scanf("%c", &resp);
    }while ((tolower((unsigned char)resp )!= 's') &&
            (tolower((unsigned char)resp )!= 'n'));
    if (tolower((unsigned char)resp )== 's')
        GravarArquivo();

    // desaloca memória alocada para a lista, senão teremos MEMORY LEAK
    DestroiLista();
}

//
// Insere novo contato na lista
//
void Inserir()
{
    Contato *novo = (Contato *)malloc(sizeof(Contato));
    if (novo == NULL)
    {
        printf("ERRO FATAL: Falta memória!\n");
        return;
    }

    printf("\nInsere novo contato na lista telefônica:\n");
    printf("    Nome: ");
    do
    {
        gets(novo->nome);
    }while (*novo->nome == 0x00);

    printf("    Fone: ");
    do
    {
        gets(novo->fone);
    }while (*novo->fone == 0x00);

    // novo contato será inserido no final da lista
    novo->prox = NULL;

    InsereFinalLista(novo);
}

void InsereFinalLista(Contato *novo)
{
    // verifica se lista de contatos está vazia
    if (inicio == NULL)
    {
        inicio = novo;
        return;
    }

    // posiciona no último elemento da lista
    Contato *ultimo = inicio;
    while(ultimo->prox != NULL)
        ultimo = ultimo->prox;

    // insere novo elemento após o último elemento da lista
    ultimo->prox = novo;
}

void Alterar()
{
    printf("\nAltera contato na lista telefônica:\n");

    int n;
    char resp, nome[80];
    Contato *contato;
    while(1)
    {
        printf("Nome a ser alterado (ou FIM para terminar): ");
        do
        {
            gets(nome);
        }while(*nome == 0x00);

        if (stricmp(nome, "fim") == 0)
            return;

        // percorre toda a lista
        n = 0;
        contato = inicio;
        while (contato)
        {
            // verifica se nome cadastrado na lista contém
            // o nome informado pelo usuário
            if (ProcuraSubstring(contato->nome, nome) != NULL)
            {
                ++n;    // contador de contatos encontrados

                // mostra dados e pede confirmação do usuário para alterar os dados
                printf("    %s - Fone: %s\n", contato->nome, contato->fone);
                printf("Altera (S/N)?");
                do
                {
                    scanf("%c", &resp);
                }while ((tolower((unsigned char)resp )!= 's') &&
                        (tolower((unsigned char)resp )!= 'n'));
                if (tolower((unsigned char)resp )== 's')
                    AlteraContato(contato);
            }

            // próximo contato da lista
            contato = contato->prox;
        }

        // mostra mensagem de erro caso nenhum contato tenha sido encontrado
        if (n == 0)
            printf("    Contato não encontrado!\n");
    }
}

void AlteraContato(Contato *contato)
{
    printf("    Nome: ");
    do
    {
        gets(contato->nome);
    }while (*contato->nome == 0x00);

    printf("    Fone: ");
    do
    {
        gets(contato->fone);
    }while (*contato->fone == 0x00);
}

void Eliminar()
{
    printf("\nElimina contato na lista telefônica:\n");

    int n, eliminou;
    char resp, nome[80];
    Contato *contato,   // apontador para contato atual
            *prox,      // apontador para contato anterior
            *ant;       // apontador para próximo contato
    while(1)
    {
        printf("Nome a ser eliminado (ou FIM para terminar): ");
        do
        {
            gets(nome);
        }while(*nome == 0x00);

        if (stricmp(nome, "fim") == 0)
            return;

        // percorre toda a lista de contatos
        n = 0;
        contato = inicio;
        ant = NULL;
        prox = inicio->prox;
        while (contato)
        {
            eliminou = 0;   // flag indicando que contato não foi eliminado

            // verifica se nome do contato contém nome informado pelo usuário
            if (ProcuraSubstring(contato->nome, nome) != NULL)
            {
                ++n;    // contador de contatos encontrados

                // mostra contato e pede confirmação do usuário para eliminá-lo
                printf("    %s - Fone: %s\n", contato->nome, contato->fone);
                printf("Elimina (S/N)?");
                do
                {
                    scanf("%c", &resp);
                }while ((tolower((unsigned char)resp )!= 's') &&
                        (tolower((unsigned char)resp )!= 'n'));
                if (tolower((unsigned char)resp )== 's')
                {
                    // salva apontador para próximo contato
                    prox = contato->prox;

                    // libera contato eliminado
                    free(contato);

                    // elemento anterior apontará para o próximo elemento
                    if(ant == NULL)
                        inicio = prox;  // eliminando o primeiro elemento da lista
                    else
                        ant->prox = prox;

                    // próximo contato
                    contato = prox;

                    // flag indicando que contato foi eliminado
                    eliminou = 1;
                }
            }

            // pega o próximo contato caso o contato não tenha sido eliminado
            if (eliminou == 0)
            {
                ant = contato;
                contato = contato->prox;
            }
        }

        // mostra mensagem caso nenhum contato tenha sido encontrado
        if (n == 0)
            printf("    Contato não encontrado!\n");
    }
}

void Pesquisar()
{
    printf("\nPesquisa contato na lista telefônica:\n");

    int n;
    char nome[80];
    Contato *contato;
    while(1)
    {
        printf("Nome a ser procurado (ou FIM para terminar): ");
        do
        {
            gets(nome);
        }while(*nome == 0x00);

        if (stricmp(nome, "fim") == 0)
            return;

        // percorre toda a lista
        n = 0;
        contato = inicio;
        while (contato)
        {
            // verifica se nome do contato contém o nome informado pelo usuário
            if (ProcuraSubstring(contato->nome, nome) != NULL)
            {
                // mostra dados do contato encontrado
                printf("    %s - Fone: %s\n", contato->nome, contato->fone);

                ++n;    // atualiza contador de contatos encontrados
            }
            contato = contato->prox;
        }

        // mostra mensagem indicando que nenhum contato foi encontrado
        if (n == 0)
            printf("    Contato não encontrado!\n");
    }
}

//
// Mostra todos os contatos cadastrados na lista telefônica
//
void ListarTodos()
{
    printf("\nMostra todos os contatos na lista telefônica:\n");
    if (inicio == NULL)
    {
        printf("    Lista está vazia\n");
        return;
    }

    // percorre toda a lista mostrando os dados de cada contato
    Contato *contato = inicio;
    while(contato != NULL)
    {
        printf("    Nome: %s - Fone: %s\n", contato->nome, contato->fone);
        contato = contato->prox;
    }
}

//
// Pesquisa substring em uma string, ignorando
// diferenças entre letras maiúsculas e minúsculas
// obs.: a função padrão strstr() considera letras MAI e min diferentes
//
// Valor Retornado:
//     Apontador onde substring se encontra na string
//     NULL, se substring não for encontrada
//
char* ProcuraSubstring(char *string, char *substring)
{
    char *s, *sub;
    char *str = string;
    do
    {
        s = str;
        sub = substring;
        while (tolower((unsigned char)*s) == tolower((unsigned char )*sub) && *sub)
        {
          ++s;
          ++sub;
        }
        if (*sub == 0)
          return str;
    }while (*str++);

    return NULL;
}

// leitura do arquivo texto contendo, em cada linha, os dados dos
// contatos cadastrados. Os campos NOME e FONE estão separados por '|'
void LerArquivo()
{
    // abre arquivo texto para leitura
    FILE *arq = fopen(NOME_ARQUIVO, "r");
    if (arq == NULL)
        return;

    Contato *novo;
    char buffer[250], *nome, *fone, *separador;

    // leitura do arquivo, linha a linha, até que não existam mais linhas
    while(fgets(buffer, 250, arq) != NULL)
    {
        // elimina '\n' no final do buffer
        *(buffer + strlen(buffer) - 1) = 0x00;

        // separa os campos
        separador = strchr(buffer, '|');
        if (separador != NULL)
        {
            *separador = 0x00;
            fone = separador + 1;   // primeiro caractere depois de '|'

            // cria novo contato e insere ele no final da lista
            novo = (Contato *)malloc(sizeof(Contato));
            if (novo != NULL)
            {
                strcpy(novo->nome, buffer);
                strcpy(novo->fone, fone);
                novo->prox = NULL;
                InsereFinalLista(novo);
            }
        }
    }

    // fecha arquivo
    fclose(arq);
}

// gravação do arquivo texto contendo, em cada linha, os dados dos
// contatos cadastrados. Os campos NOME e FONE serão separados por '|'
void GravarArquivo()
{
    // abre arquivo texto para gravação. Se arquivo existir, ele será
    // sobrescrito; caso contrário, ele será criado
    FILE *arq = fopen(NOME_ARQUIVO, "w");
    if (arq == NULL)
        return;

    // percorre toda a lista de contatos
    char buffer[250];
    Contato *contato = inicio;
    while(contato)
    {
        // monta linha com nome e fone do contato separador por '|'
        sprintf(buffer, "%s|%s\n", contato->nome, contato->fone);

        // grava linha no arquivo
        fputs(buffer, arq);

        // próximo contato
        contato = contato->prox;
    }

    // fecha arquivo
    fclose(arq);
}

// percorre toda a lista, liberando espaço alocado pela
// função malloc() para cada contato
void DestroiLista()
{
    Contato *prox;  // próximo elemento

    // percorre toda a lista
    while (inicio)
    {
        // salva próximo elemento, pois o elemento corrente será descartado
        prox = inicio->prox;

        // libera memória do elemento corrente
        free(inicio);

        // pega o próximo elemento
        inicio = prox;
    }
}

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...