Unconfigured Ad Widget

Collapse

Anúncio

Collapse
No announcement yet.

Dúvida Lista Simplismente Encadeada

Collapse
X
 
  • Filter
  • Tempo
  • Show
Clear All
new posts

  • Font Size
    #1

    C / C++ Dúvida Lista Simplismente Encadeada

    Bom dia pessoal,
    Estou com uma dúvida referente a Lista Simplesmente Encadeada em C que ta me matando. A lista ta funcionando perfeitamente, já criei as funções para inserir no inicio e final e para imprimir. Os números para iniciar a lista são obtidos após sorteio de números (função rand()) onde os números ímpares e pares devem ser inseridos a esquerda e direita respectivamente, e após a lista deve ser impressa. Até aí tudo bem. O problema está na função para pesquisar um numero digitado pelo usuário, onde se o numero existir na lista deverá retornar para o usuário a posição que o número está na lista. (o valor deverá ser lido na main e passado por parâmetro para a Função de pesquisa). Se alguém puder dar uma mão aí agradeço. Segue o código...

    Código:
     #include <stdlib.h>
    #include <stdio.h>
    #include <math.h>
    #include <conio.h>
    
    struct nodo{
      int dados;
      struct nodo *prox;       
    };
    
    int InsereEsquerda (struct nodo **inicio, int valor){ // função recebe como parâmetro o ponteiro (ptri) e o valor inteiro
      struct nodo *novo=NULL;
      novo=(struct nodo *)malloc(sizeof(struct nodo));
      if (novo != NULL){
        novo->dados=valor;
        novo->prox=*inicio;
        *inicio=novo;
      }
      else
        printf("Nao foi possivel alocar\n");
    }//fim da função insereEsquerda
    
    int InsereDireita(struct nodo **inicio, int valor){ // função recebe como parâmetro o ponteiro (ptri) e o valor inteiro
      struct nodo *novo=NULL, *aux=NULL; 
      novo=(struct nodo *)malloc(sizeof(struct nodo));
      if(novo != NULL){
        novo- dados = valor;
        novo->prox=NULL;
        if(*inicio == NULL)
          *inicio=novo;
        else{
          aux=*inicio;
          while(aux->prox != NULL){
            aux = aux->prox;
          }
          aux->prox=novo;
        }
      }
      else
        printf("\nNao foi possivel alocar");
    }//fim da funçao insere_direita
    
    int ImprimeLSE(struct nodo **inicio){
      struct nodo *aux=NULL;
      if(*inicio!=NULL){
        aux=*inicio;
        while(aux != NULL){ 
          printf("%i\t", aux->dados);  
          aux=aux->prox;
        }
      } 
      else
        printf("\nLista Vazia\n");
    }// fim da função ImprimeLSE
    
    
    int main(){      
      struct nodo *ptri=NULL;  // Inicialização do ponteiro *ptri como nulo
      int i, nro, num;
        
      for(i=0; i<TAM; i++){
        nro = rand()%51;  // sorteio dos 20 numeros
        if(nro %2 == 0){  // se par inserir a direita
          InsereDireita(&ptri, nro); 
        }
        else {  // se impar inserir a esquerda
          InsereEsquerda (&ptri, nro);  
        } 
      }
      ImprimeLSE(&ptri); //impressão da lista
      
      printf("\n\nInforme um número para pesquisar na Lista: ");
      scanf("%i", &num);  
      
      //se o numero digitado estiver na lista...
      printf("\n\nPosição %i da Lista", ??????? );
      
      //se o numero digitado não estiver na lista
      printf("\n\nO número informado não está na lista");
      getch();
    }

  • Font Size
    #2
    Olá amigo.
    Olha tentei compilar o seu código mas deu alguns erros, por isso não cheguei de executar o programa...
    Mas a função pesquisa é bem fácil de ser feita. Você faz sim: declare uma variável contador e inicializa-o a zero, e vai percorrendo a lista. Em cada item da lista você verifica se o valor daquela posição é igual ao valor pesquisado. Se não você avança para o próximo item da lista e incrementa o contador. Quando você encontrar o valor pesquisado você retorna o seu contador. Caso o valor pesquisado não existe você pode retornar uma flag (um valor definido, por exemplo -1). Abaixo o pseudo-código:

    Código:
    funcao PesquisarValor(lista, valor)
    inicio
    	declara contador = 0;
    	declara aux = lista;
    	enquanto aux <> NULL faz
    	inicio
    		se aux->valor == valor então
    		inicio
    			retorna contador;
    		fim
    		senao
    		inicio
    			aux = aux->prox;
    			contador = contador + 1;
    		fim;
    	fim;
    	retorna -1;
    fim funcao;
    Veja o inicio como { e fim como }, é para criar bloco de código.
    Espero ter ajudado, qualquer dúvida estou disponível.
    “Finalmente encontrei um inimigo digno de mim e uma jornada em que preciso desenvolver toda a minha coragem, pois temos de combater homens bravos e monstruosas feras.”, Alexandre, o Grande.

    Comment

    X
    Working...
    X