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: 1325 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 |
|
VB.NET - Como usar o laço While em VB.NET AutoLISP - Como retornar o nome da layer atual do AutoCAD usando AutoLISP e a variável de sistema CLAYER |
E-Books em PDF |
||||
|
||||
|
||||
Linguagens Mais Populares |
||||
|
1º lugar: Java |





