Métodos
de Programação III
Grafos
Listas de Adjacência: Uma Implementação simples na linguagem C.
O primeiro passo na implementação dos grafos
consiste em definir num ficheiro de definições
o tipo de dados do grafo
e das listas de adjacência.
typedef
struct nodo
{
VERTICE v;
struct nodo * next;
}
NODO;
typedef
NODO * ADJ;
O grafo pode agora ser definido como um sequência
(array) de apontadores para as listas de adjacência.
Em C este grafo é definido do seguinte modo:
ADJ
GRAFO[N];
em que N é o numero
de vértices do grafo.
typedef
ADJ * GRAFO;
E dinamicamente construir uma sequência de apontadores
igual ao número máximo de vértices de um dado grafo.
typedef
int VERTICE;
#define
EL(n) n->v
#define
NEXT(l) l->next
#define
EMPTY(l) (l == NULL)
#define
CONSNODO (ADJ)malloc(sizeof(NODO))
GRAFO
novo_grafo (int nvertices);
GRAFO
add_ramo (GRAFO g , VERTICE v1,VERTICE
v2);
ADJ
sucessores (GRAFO g , VERTICE v);
BOOLEAN
is_sucessor (GRAFO g , VERTICE v1 , VERTICE v2);
void
show_sucessores (GRAFO g , VERTICE v);
ADJ
antecessores (GRAFO g , VERTICE v);
ADJ
ins_lista_adjacentes (ADJ l , VERTICE v);
void
show_lista_adjacentes (ADJ l);
A implementação dos grafos é codificado
no ficheiro de implementação.
#include
"listas_adj.h"
GRAFO
novo_grafo(int nvertices)
{
GRAFO g;
int i;
g = (GRAFO)malloc( sizeof(ADJ) * nvertices );
for (i = 0 ; i < nvertices ; ++i)
*(g+i) = NULL;
return g;
}
GRAFO
add_ramo(GRAFO g , VERTICE v1 , VERTICE v2)
{
*(g+v1) = ins_lista_adjacentes(*(g+v1),v2);
return g;
}
ADJ
sucessores(GRAFO g,VERTICE v)
{
return *(g + v);
}
BOOLEAN
is_sucessor (GRAFO g , VERTICE v1 , VERTICE v2)
{
return isin(*(g+v1),v2);
}
ADJ
antecessores (GRAFO g , VERTICE v , int nvertices)
{
int i;
ADJ l;
l = NULL;
for ( i = 0 ; i < nvertices ; ++i )
{ if ( isin(*(g+i),v) )
l = ins_lista_adjacentes(l,i);
}
return l;
}
void
show_sucessores (GRAFO g , VERTICE v)
{
show_lista_adjacentes(sucessores(g,v));
}
ADJ
ins_lista_adjacentes (ADJ l , VERTICE v)
{
ADJ a;
a = CONSNODO;
EL(a) = v;
NEXT(a) = l;
return a;
}
BOOLEAN
isin (ADJ l , VERTICE v)
{
if EMPTY(l) return FALSE;
else
if (EL(l) == v) return TRUE;
else return isin(NEXT(l),v);
}
void
show_lista_adjacentes (ADJ l)
{
if ( !EMPTY(l) )
{ printf(" %d ",EL(l));
show_lista_adjacentes(NEXT(l));
}
}
Enviar comentários para jas@di.uminho.pt.
Ultima modificação: 26/10/1998