Ψάξιμο κατά βάθος

Για να επισκευθούμε όλους τους κόμβους ενός γράφου με ν κόμβους χρειαζόμαστε έναν πίνακα λογικών μεταβλητών μιας διάστασης και μήκους ν ο οποίος περιέχει την τιμή "αληθές" για τους κόμβους τους οποίους έχουμε επισκευθεί. Η συστηματική επίσκεψη όλων των κόμβων γίνεται σύμφωνα με τα παρακάτω βήματα:
  1. Φυλάμε την τιμή "ψευδές" στον πίνακα επισκέψεων.
  2. Επισκεπτόμαστε όλους τους κόμβους που δεν έχουμε επισκευτεί.

Η επίσκεψη ενός κόμβου γίνεται σύμφωνα με τα παρακάτω βήματα:
  1. Σημειώνουμε στον πίνακα ότι έχουμε επισκευθεί τον κόμβο.
  2. Επισκεπτόμαστε όλους τους συνδεδεμένους κόμβους που δεν έχουμε επισκευθεί.
Το παρακάτω παράδειγμα περιέχει υλοποίηση για λίστα γειτνίασης:
#include <stdlib.h>
#include <stdio.h>

/*
 * Adjacency list for a graph of 10 nodes
 */
struct s_adjlist {
	int node;
	struct s_adjlist *next;
};

static struct s_adjlist *adj[10];
static int visited[10];

/*
 * Visit the nodes starting from node printing their value using
 * depth first search 
 */
static void
visit(int node)
{
	struct s_adjlist *p;

	visited[node] = 1;
	printf("%d\n", node);
	for (p = adj[node]; p != NULL; p = p->next)
		if (!visited[p->node])
			visit(p->node);
}

main()
{
	int a, b;
	struct s_adjlist *p;
	int i;

	/* Read edges and connect them */
	while (scanf("%d %d", &a, &b) == 2) {
		p = (struct s_adjlist *)malloc(sizeof(struct s_adjlist));
		p->node = b;
		p->next = adj[a];
		adj[a] = p;
		p = (struct s_adjlist *)malloc(sizeof(struct s_adjlist));
		p->node = a;
		p->next = adj[b];
		adj[b] = p;
	}
	/* Depth first search/print of the graph */
	for (i = 0; i < 10; i++)
		visited[i] = 0;
	for (i = 0; i < 10; i++)
		if (!visited[i])
			visit(i);
}
Αν το πρόγραμμα διαβάσει το γράφο:
2 3
3 8
8 6
4 9
θα τυπώσει την παρακάτω σειρά επίσκεψης:
0
1
2
3
8
6
4
9
5
7