|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Dec 2008
Città: italia
Messaggi: 80
|
Lista di adiacenza in C
Ho visto varie rappresentazioni di liste di adiacenza per rappresentare un grafo,come è possibile scrivere il codice nel modo più semplice possibile??
tipo Adj[][].. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Sep 2005
Città: Torino
Messaggi: 606
|
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.
__________________
"Se proprio dovete piratare un prodotto, preferiamo che sia il nostro piuttosto che quello di qualcun altro." [Jeff Raikes] "Pirating software? Choose Microsoft!" |
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: Dec 2008
Città: italia
Messaggi: 80
|
Lista di adiacenza in C
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.
|
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Jan 2012
Messaggi: 1267
|
Quote:
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. |
|
![]() |
![]() |
![]() |
#5 |
Member
Iscritto dal: Dec 2008
Città: italia
Messaggi: 80
|
Lista di adiacenza in C
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???. Codice:
#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; } |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 11:44.