Sea una gráfica bien definida G = (V,A) con conjunto de vértices V y conjunto de aristas A. Supongamos que para algún vértice v en V hace falta encontrar rápidamente todas las aristas en A que parten de v o que llevan a v; y que habiéndolas encontrado es necesario poder ponerles una marca para alguna operación futura. Para esta aplicación no hace falta encontrar rutas en la gráfica.
Veamos primero el caso en el que solamente buscamos que v sea el origen de la arista. Es posible entonces emplear una tabla de dispersión tal que esté formada por listas ordenadas, y los elementos de las listas son nodos de la siguiente forma:
struct nodo { nodo* siguiente; vértice desde; vértice hasta; booleano marca; }
Ahora sería posible crear dos tablas de dispersión, una que tenga "desde" como índice y otra indexada por "hasta". Así, podemos buscar primero en una, y después en la otra. Para solamente encontrar las aristas eso es suficiente. Pero, además de que usa el doble de memoria, tiene un problema: en general un nodo va a estar marcado solamente en una de las tablas. En mi caso, la marca es para ignorar la arista, así que eso no produce el resultado necesario. Es más conveniente que las tablas compartan nodos, así al marcar un nodo en una queda marcado en ambas.
Pero para que un nodo se pueda usar al mismo tiempo en dos listas ordenadas (que son al fin generalizaciones de listas ligadas) hace falta que tenga dos apuntadores a siguiente, uno para cada lista:
struct nodo { nodo* siguiente_desde; nodo* siguiente_hasta; vértice desde; vértice hasta; booleano marca; }
Y ya está. Con esa estructura se puede compartir nodos entre dos tablas de dispersión. Solamente hay que definir que los algoritmos de lista ordenada seleccionen entre apuntadores "siguiente" dependiendo en si está usando la tabla que busca por "desde" o por "hasta". Ese puede ser un uso práctico para una macro (anexando un _desde o un _hasta al nombre de una variable en tiempo de precompilación) o, en tiempo de ejecución, se puede usar aritmética de apuntadores para seleccionar el desplazamiento dentro de la estructura.
