Recorrido y búsqueda
Recorra la lista
Recorrido y búsqueda es una lección gratuita de C Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C Academy incluye 4 lecciones en total.
Recorrer la lista
El recorrido consiste en visitar cada nodo en orden. Se comienza en el head y se siguen los punteros next hasta llegar a NULL.
Casi todos los algoritmos para listas se basan en este recorrido sencillo.
#include <stdio.h>
#include <stdlib.h>
struct Node { int value; struct Node *next; };
struct Node *make(int v){struct Node*n=malloc(sizeof*n);n->value=v;n->next=NULL;return n;}
int main(void) {
struct Node *head = make(10);
head->next = make(20);
for (struct Node *p = head; p != NULL; p = p->next)
printf("%d ", p->value);
printf("\n");
return 0;
}El patrón de recorrido
El bucle canónico utiliza un puntero móvil p: se inicializa con head, se continúa mientras p no sea NULL y se avanza con p = p->next.
Nunca modifique head directamente mientras recorre la lista o perderá el inicio de esta.
#include <stdio.h>
#include <stdlib.h>
struct Node { int value; struct Node *next; };
struct Node *make(int v){struct Node*n=malloc(sizeof*n);n->value=v;n->next=NULL;return n;}
int main(void) {
struct Node *head = make(1);
head->next = make(2);
struct Node *p = head;
while (p) { printf("%d ", p->value); p = p->next; }
printf("\n");
return 0;
}Contar nodos
Para averiguar la longitud, recorra la lista e incremente un contador por cada nodo.
Esta operación tiene un coste O(n), porque el recuento no se almacena en ningún sitio.
#include <stdio.h>
#include <stdlib.h>
struct Node { int value; struct Node *next; };
struct Node *make(int v){struct Node*n=malloc(sizeof*n);n->value=v;n->next=NULL;return n;}
int length(struct Node *head) {
int n = 0;
for (struct Node *p = head; p; p = p->next) n++;
return n;
}
int main(void) {
struct Node *head = make(1);
head->next = make(2);
head->next->next = make(3);
printf("length = %d\n", length(head));
return 0;
}Sumar valores
El recorrido permite agregar datos. Aquí sumamos todos los valores enteros de la lista.
#include <stdio.h>
#include <stdlib.h>
struct Node { int value; struct Node *next; };
struct Node *make(int v){struct Node*n=malloc(sizeof*n);n->value=v;n->next=NULL;return n;}
int main(void) {
struct Node *head = make(5);
head->next = make(10);
int sum = 0;
for (struct Node *p = head; p; p = p->next) sum += p->value;
printf("sum = %d\n", sum);
return 0;
}Buscar un valor
Para encontrar un valor, recorra la lista y compare cada nodo. Devuelva el nodo (o su posición) cuando encuentre una coincidencia, o indique un fallo si llega al final.
#include <stdio.h>
#include <stdlib.h>
struct Node { int value; struct Node *next; };
struct Node *make(int v){struct Node*n=malloc(sizeof*n);n->value=v;n->next=NULL;return n;}
struct Node *find(struct Node *head, int v) {
for (struct Node *p = head; p; p = p->next)
if (p->value == v) return p;
return NULL;
}
int main(void) {
struct Node *head = make(1);
head->next = make(2);
printf("found 2: %d\n", find(head, 2) != NULL);
printf("found 9: %d\n", find(head, 9) != NULL);
return 0;
}Encontrar una posición
A veces querrá obtener el índice de una coincidencia en lugar del nodo. Mantenga un contador mientras recorre la lista y devuélvalo cuando encuentre el valor.
#include <stdio.h>
#include <stdlib.h>
struct Node { int value; struct Node *next; };
struct Node *make(int v){struct Node*n=malloc(sizeof*n);n->value=v;n->next=NULL;return n;}
int index_of(struct Node *head, int v) {
int i = 0;
for (struct Node *p = head; p; p = p->next, i++)
if (p->value == v) return i;
return -1;
}
int main(void) {
struct Node *head = make(7);
head->next = make(8);
printf("%d\n", index_of(head, 8));
return 0;
}Acceder al nodo n
Las listas enlazadas no tienen indexación directa. Para llegar a la posición n, debe avanzar n veces desde el head.
Por eso el acceso aleatorio tiene un coste O(n), frente al coste O(1) de un array.
#include <stdio.h>
#include <stdlib.h>
struct Node { int value; struct Node *next; };
struct Node *make(int v){struct Node*n=malloc(sizeof*n);n->value=v;n->next=NULL;return n;}
struct Node *at(struct Node *head, int n) {
struct Node *p = head;
for (int i = 0; i < n && p; i++) p = p->next;
return p;
}
int main(void) {
struct Node *head = make(10);
head->next = make(20);
head->next->next = make(30);
printf("%d\n", at(head, 2)->value);
return 0;
}Encontrar el último nodo
Para obtener el tail, recorra la lista hasta que p->next sea NULL. Ese nodo es el último.
Tenga cuidado con una lista vacía, en la que el propio head es NULL.
#include <stdio.h>
#include <stdlib.h>
struct Node { int value; struct Node *next; };
struct Node *make(int v){struct Node*n=malloc(sizeof*n);n->value=v;n->next=NULL;return n;}
int main(void) {
struct Node *head = make(1);
head->next = make(2);
head->next->next = make(3);
struct Node *p = head;
while (p->next) p = p->next;
printf("last = %d\n", p->value);
return 0;
}Encontrar el máximo
Al combinar búsqueda y agregación, puede encontrar el valor más grande manteniendo el mejor valor encontrado durante el recorrido.
#include <stdio.h>
#include <stdlib.h>
struct Node { int value; struct Node *next; };
struct Node *make(int v){struct Node*n=malloc(sizeof*n);n->value=v;n->next=NULL;return n;}
int main(void) {
struct Node *head = make(3);
head->next = make(9);
head->next->next = make(5);
int best = head->value;
for (struct Node *p = head->next; p; p = p->next)
if (p->value > best) best = p->value;
printf("max = %d\n", best);
return 0;
}Recorrido recursivo
Las listas también pueden recorrerse de forma recursiva: procese el nodo actual y, después, aplique la recursión a next.
Es una técnica elegante, pero utiliza espacio de pila proporcional a la longitud, por lo que la iteración es más segura para listas muy largas.
#include <stdio.h>
#include <stdlib.h>
struct Node { int value; struct Node *next; };
struct Node *make(int v){struct Node*n=malloc(sizeof*n);n->value=v;n->next=NULL;return n;}
void print_rec(struct Node *p) {
if (!p) { printf("\n"); return; }
printf("%d ", p->value);
print_rec(p->next);
}
int main(void) {
struct Node *head = make(1);
head->next = make(2);
print_rec(head);
return 0;
}Protegerse frente a listas vacías
Toda función de recorrido debe gestionar correctamente una lista vacía (head == NULL).
El bucle estándar ya lo hace: la condición p != NULL es falsa de inmediato, por lo que el cuerpo nunca se ejecuta.
#include <stdio.h>
struct Node { int value; struct Node *next; };
int length(struct Node *head) {
int n = 0;
for (struct Node *p = head; p; p = p->next) n++;
return n;
}
int main(void) {
struct Node *head = NULL;
printf("empty length = %d\n", length(head));
return 0;
}Comprobación rápida
Compruebe su comprensión del coste del recorrido de listas.
Resumen
Ha aprendido a recorrer y buscar en listas:
- Patrón de recorrido: comience en
head, repita mientras no seaNULLy avance conp = p->next. - Contar, sumar y encontrar el máximo son operaciones basadas en el recorrido.
- La búsqueda compara cada nodo; el acceso por índice tiene un coste O(n).
- El recorrido puede ser recursivo, pero la iteración es más segura para listas largas; gestione siempre el caso de una lista vacía.
Aprende C con un tutor de IA — gratis
Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.
- Cursos
- 39
- Lecciones
- 144
Preguntas frecuentes
¿La lección «Recorrido y búsqueda» es gratis?
Sí — el texto completo de «Recorrido y búsqueda» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C Academy, actualiza a CoddyKit PRO. El curso de C Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Recorrido y búsqueda»?
Recorra la lista Practicas C Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar C Academy?
No se requiere experiencia previa. C Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «Recorrido y búsqueda»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de C Academy?
Sí. Cada lección de C Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Listas enlazadas simples
- Inserción y eliminación
- Recorrido y búsqueda
- Listas doblemente enlazadas