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ó originalQuantidade 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. . . |
![]() |
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 |
||||
|
||||
|
||||
Linguagens Mais Populares |
||||
1º lugar: Java |