Você está aqui: C ::: Estruturas de Dados ::: Lista Ligada Simples

Como pesquisar um nó em uma lista ligada simples em C e retornar uma cópia do nó original

Quantidade de visualizações: 1335 vezes
Nesta dica mostrarei como é possível buscar um nó em uma lista ligada simples (singly linked list) em C e retornar um novo nó como uma cópia do nó original, ou seja, alterações no conteúdo do nó retornado não afeta o nó original. Veja:

// função que permite pesquisar um nó na lista
// ligada e retornar o nó por cópia
struct No *pesquisar_no(int valor, struct No *inicio){
  struct No *n = NULL; // declara um ponteiro para um novo nó
  
  struct No *temp = inicio; // aponta para o início da lista
  if(temp != NULL){
    do{
      // é o valor que estamos buscando?
      if(temp->valor == valor){
      	// reservamos memória para o nó
	n = (struct No*)malloc(sizeof(struct No));
        // copiamos o valor do nó temp
	n->valor = temp->valor;
	n->proximo = NULL; // não nos interessa
	return n; // e retornamos
      }
	  
      // não encontrei. vamos continuar a busca
      temp = temp->proximo;
    }while(temp != NULL);
  }
  else{
    // a lista está vazia?
    return n;
  }
} 

Veja que a função recebe como argumentos o valor a ser pesquisado e um ponteiro para o início da lista, e ela retorna um ponteiro para o nó encontrado, ou NULL caso o valor pesquisado não for encontrado. Veja a listagem completa abaixo:

#include <stdio.h>
#include <stdlib.h>
 
// estrutura Nó
struct No{
  int valor;
  struct No *proximo;
};
// fim da estrutura Nó
 
// função que permite exibir os valores de
// todos os nós da lista
void exibir(struct No *n){
  if(n != NULL){
    do{
      printf("%d\n", n->valor);
      n = n->proximo;
    }while(n != NULL);
  }
  else
    printf("A lista esta vazia\n\n");
}
 
// função que permite pesquisar um nó na lista
// ligada e retornar o nó por cópia
struct No *pesquisar_no(int valor, struct No *inicio){
  struct No *n = NULL; // declara um novo nó
  
  struct No *temp = inicio; // aponta para o início da lista
  if(temp != NULL){
    do{
      // é o valor que estamos buscando?
      if(temp->valor == valor){
      	// reservamos memória para o nó
	n = (struct No*)malloc(sizeof(struct No));
        // copiamos o valor do nó temp
	n->valor = temp->valor;
	n->proximo = NULL; // não nos interessa
	return n; // e retornamos
      }
	  
      // não encontrei. vamos continuar a busca
      temp = temp->proximo;
    }while(temp != NULL);
  }
  else{
    // a lista está vazia?
    return n;
  }
} 
 
// função que permite inserir nós no
// final da lista.
// veja que a função recebe o valor a ser
// armazenado em cada nó e um ponteiro para o
// início da lista. A função retorna um
// ponteiro para o início da lista
struct No *inserir_final(struct No *n, int v){
  // reserva memória para o novo nó
  struct No *novo = (struct No*)malloc(sizeof(struct No));
  novo->valor = v;
 
  // verifica se a lista está vazia
  if(n == NULL){
    // é o primeiro nó...não deve apontar para
    // lugar nenhum
    novo->proximo = NULL;
    return novo; // vamos retornar o novo nó como sendo o início da lista
  }
  else{ // não está vazia....vamos inserir o nó no final
    // o primeiro passo é chegarmos ao final da lista
    struct No *temp = n; // vamos obter uma referência ao primeiro nó
    // vamos varrer a lista até chegarmos ao último nó
    while(temp->proximo != NULL){
      temp = temp->proximo;
    }
    // na saída do laço temp aponta para o último nó da lista
   
    // novo será o último nó da lista...o campo próximo dele deve
    // apontar para NULL
    novo->proximo = NULL;
    // vamos fazer o último nó apontar para o nó recém-criado
    temp->proximo = novo;
    return n; // vamos retornar o início da lista intacto
  }
}
 
int main(int argc, char *argv[])
{
  // declara a lista
  struct No *inicio = NULL;
 
  // vamos inserir quatro valores no final
  // da lista
  inicio = inserir_final(inicio, 45);
  inicio = inserir_final(inicio, 3);
  inicio = inserir_final(inicio, 98);
  inicio = inserir_final(inicio, 47);
 
  // vamos pesquisar o nó com valor 98 
  struct No *pesquisa = pesquisar_no(98, inicio);
  // o nó foi encontrado?
  if(pesquisa != NULL){
    printf("O no foi encontrado: %d",
      pesquisa->valor);
  }
  else{
    puts("O no nao foi encontrado.");
  }
  
  puts("\n\n");
  system("pause");
  return 0;
}

Ao executar esse código você terá o seguinte resultado:

O nó foi encontrado: 98

Pressione qualquer tecla para continuar. . .


Link para compartilhar na Internet ou com seus amigos:

Desafios, Exercícios e Algoritmos Resolvidos de C

Veja mais Dicas e truques de C

Dicas e truques de outras linguagens

E-Books em PDF

E-Book 350 Exercícios Resolvidos de Java - PDF com 500 páginas
Domine lógica de programação e a linguagem Java com o nosso E-Book 350 Exercícios Exercícios de Java, para você estudar onde e quando quiser.

Este e-book contém exercícios resolvidos abrangendo os tópicos: Java básico, matemática e estatística, programação dinâmica, strings e caracteres, entrada e saída, estruturas condicionais, vetores e matrizes, funções, laços, recursividade, internet, arquivos e diretórios, programação orientada a objetos e muito mais.
Ver Conteúdo do E-book
E-Book 650 Dicas, Truques e Exercícios Resolvidos de Python - PDF com 1.200 páginas
Domine lógica de programação e a linguagem Python com o nosso E-Book 650 Dicas, Truques e Exercícios Exercícios de Python, para você estudar onde e quando quiser.

Este e-book contém dicas, truques e exercícios resolvidos abrangendo os tópicos: Python básico, matemática e estatística, banco de dados, programação dinâmica, strings e caracteres, entrada e saída, estruturas condicionais, vetores e matrizes, funções, laços, recursividade, internet, arquivos e diretórios, programação orientada a objetos e muito mais.
Ver Conteúdo do E-book

Linguagens Mais Populares

1º lugar: Java
2º lugar: Python
3º lugar: C#
4º lugar: PHP
5º lugar: C
6º lugar: Delphi
7º lugar: JavaScript
8º lugar: C++
9º lugar: VB.NET
10º lugar: Ruby



© 2025 Arquivo de Códigos - Todos os direitos reservados
Neste momento há 28 usuários muito felizes estudando em nosso site.