Você está aqui: C ::: Estruturas de Dados ::: Lista Ligada Simples |
Pesquisando um nó em uma lista ligada simples em C e retornando um ponteiro para o nó encontradoQuantidade de visualizações: 1155 vezes |
Nesta dica mostrarei como é possível buscar um nó em uma lista ligada simples (singly linked list) em C e retornar um ponteiro para o nó encontrado, ou seja, alterações no conteúdo do nó retornado afetarão também o nó original. Veja:// função que permite pesquisar um nó na lista // ligada e retornar o nó como referência 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) { // retornamos um ponteiro para o nó encontrado n = temp; 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ó como referência 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) { // retornamos um ponteiro para o nó encontrado n = temp; 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); // e vamos listar os nós da lista exibir(inicio); // vamos pesquisar o nó com valor 98 struct No *pesquisa = pesquisar_no(98, inicio); // o nó foi encontrado? if (pesquisa != NULL) { printf("\nO no foi encontrado: %d\n\n", pesquisa->valor); } else { puts("\nO no nao foi encontrado.\n\n"); } // para termos certeza de que o nó foi retornado por // referência, vamos alterar o seu valor pesquisa->valor = 350; // e vamos listar os nós da lista novamente exibir(inicio); puts("\n\n"); return 0; } Ao executar esse código você terá o seguinte resultado: 45 3 98 47 O nó foi encontrado: 98 45 3 350 47 De fato podemos ver que o valor 98 foi substituído por 350, o que confirma que o nó realmente foi obtido por referência e não por cópia. |
![]() |
Desafios, Exercícios e Algoritmos Resolvidos de C |
Veja mais Dicas e truques de C |
Dicas e truques de outras linguagens |
C - Como escrever uma função concat() que reproduz a funcionalidade da função strcat() da linguagem C JavaScript - Como retornar o tamanho de uma string em JavaScript usando a propriedade length do objeto String |
E-Books em PDF |
||||
|
||||
|
||||
Linguagens Mais Populares |
||||
1º lugar: Java |