PDA

View Full Version : Lista di adiacenza in C


mikael_c
26-09-2013, 15:04
Ho visto varie rappresentazioni di liste di adiacenza per rappresentare un grafo,come è possibile scrivere il codice nel modo più semplice possibile??
tipo Adj[][]..

Oceans11
26-09-2013, 17:10
se dici lista di adiacenza sicuro non sarà Adj[][].
lista di adiacenza, ogni vertice ha una "lista" (collegata lineare) di tutti i vertici che hanno un arco in comune con il primo.

Magari tu intendevi matrice di adiacenza.

mikael_c
27-09-2013, 08:30
No come scrivo una lista di adiacenza nel modo più semplice possibile con una stampa del grafo???ho visto numerosi esempi ma cerco il codice scritto nel modo più elementare possibile.

vendettaaaaa
27-09-2013, 09:38
No come scrivo una lista di adiacenza nel modo più semplice possibile con una stampa del grafo???ho visto numerosi esempi ma cerco il codice scritto nel modo più elementare possibile.
Dopo aver letto alcuni dei tuoi thread, mi sento di consigliarti una cosa: quando scrivi non si capisce NIENTE di quel che vuoi dire. Prima di tutto, usa la punteggiatura. Poi, scrivi più di una riga visto che con una decina di parole non riesci a spiegarti.
Hai un problema, vuoi che qualcuno ti aiuti, chiedere è legittimo, ma allora rendici facile il compito di comprendere cosa vuoi. Così non si capisce niente.
Ad esempio, che esempi hai visto? Ti spiace postare qualcosa?

Nessuno può leggerti nella mente, men che meno tramite un forum.

mikael_c
27-09-2013, 09:59
Il codice sottostante riporta un esempio di grafo con lista di adiacenza.
Quello che mi interessa è l' implementazione più semplice possibile in C di un grafo con lista di adiacenza.
Vorrei sapere se il seguente esempio può essere modificato in modo da rendere il codice il più semplice possibile, oppure vi sono altre tecniche molto più semplici e migliori???.



#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <limits.h>





struct edge
{
int vertexIndex; /*memorizza l'indice del vertice a cui il vertice originale della matrice è collegato.*/
struct edge *edgePtr;
}edge;





/*Definizione struttura di un vertice in un grafo*/

struct vertex
{
int vertexKey; /* campo dati del vertice*/
struct edge *edgePtr; /* puntatore al bordo*/
}vertex;


/* Dichiarazione Grafo, numero max vertici 10*/
struct vertex graph[10];
int vertexCount=0;

/* Inserimento di un nuovo vertice, senza spigoli.
Ciò può essere implementato incrementando il vertexCount e memorizzando i dati del vertice
nell array del Grafo in posizione vertexCount.
edgePtr del vertice appena inserito punta a NULL*/

void InsertVertex(int vertexKey)
{
graph[vertexCount].vertexKey=vertexKey;
graph[vertexCount].edgePtr=NULL;
vertexCount++;
}



/* Per l'inserimento di un bordo va alla fine della lista del corrispondente vertice,
e inseriamo il nuovo bordo li.Questo va fatto per entrambi i vertici
*/

void insertEdge(int vertex1, int vertex2)
{
struct edge *e,*e1,*e2;
e=graph[vertex1].edgePtr;
while(e&& e->edgePtr)
{
e=e->edgePtr;
}
e1=(struct edge *)malloc(sizeof(*e1));
e1->vertexIndex=vertex2;
e1->edgePtr=NULL;
if(e)
e->edgePtr=e1;
else
graph[vertex1].edgePtr=e1;

e=graph[vertex2].edgePtr;
while(e&& e->edgePtr)
{
e=e->edgePtr;
}
e2=(struct edge *)malloc(sizeof(*e2));
e2->vertexIndex=vertex1;
e2->edgePtr=NULL;
if(e)
e->edgePtr=e2;
else
graph[vertex2].edgePtr=e2;
}
/*Stampa Grafo*/
void printGraph()
{
int i;
struct edge *e;
for(i=0;i<vertexCount;i++)
{
printf("%d(%d)",i,graph[i].vertexKey);
e=graph[i].edgePtr;
while(e)
{
printf("->%d",e->vertexIndex);
e=e->edgePtr;
}
printf("\n");
}
}
int main(void)
{ /*Inseriamo 5 vertici*/
InsertVertex(5);
InsertVertex(3);
InsertVertex(4);
InsertVertex(2);
InsertVertex(9);

insertEdge(0,1);
insertEdge(0,2);
insertEdge(1,3);
insertEdge(1,4);
printGraph();
return 0;
}