adjList.c
26 Novembre 2008#include <stdio.h> #include <stdlib.h> struct vertex { int value; struct vertex *next; struct edge *list; }; typedef struct vertex *Vertex; struct edge { Vertex to; struct edge *next; }; typedef struct edge *Edge; struct graph { int V; int E; struct vertex *head; }; typedef struct graph *Graph; Graph GRAPHinit() { Graph G = malloc(sizeof *G); G->V=0; G->E=0; G->head=NULL; return G; } void GRAPHinsertV(Graph G, int value) { Vertex newV = malloc(sizeof newV); newV->value = value; newV->next = G->head; newV->list = NULL; G->head = newV; G->V++; } void GRAPHinsertEfromPointers(Graph G, Vertex V, Vertex W) { Edge tmp = malloc(sizeof(struct edge)); tmp->to = W; tmp->next = V->list; V->list = tmp; } Vertex findVertexFromValue(Graph G, int value) { Vertex tmp; for(tmp = G->head;tmp!=NULL;tmp = tmp->next) { if(tmp->value==value) return tmp; } return NULL; } void GRAPHinsertEfromValues(Graph G, int valueV, int valueW) { Vertex V, W; V = findVertexFromValue(G, valueV); W = findVertexFromValue(G, valueW); if(V!=NULL && W!=NULL) { GRAPHinsertEfromPointers(G, V, W); } else { fprintf(stderr, "\nValori non trovati\n"); } } void GRAPHprint(Graph G) { Vertex tmp; Edge list; for(tmp = G->head;tmp!=NULL;tmp=tmp->next) { fprintf(stdout,"V:%d\t",tmp->value); for(list = tmp->list;list!=NULL;list=list->next) fprintf(stdout,"%d\t",list->to->value); fprintf(stdout, "\n"); } } int main() { Graph G = GRAPHinit(); GRAPHinsertV(G, 1); GRAPHinsertV(G, 3); GRAPHinsertV(G, 13); GRAPHinsertV(G, 6); GRAPHinsertV(G, 21); GRAPHinsertV(G, 41); GRAPHinsertEfromValues(G, 41,21); GRAPHinsertEfromValues(G, 41,13); GRAPHinsertEfromValues(G, 41,6); GRAPHinsertEfromValues(G, 1,21); GRAPHinsertEfromValues(G, 1,13); GRAPHprint(G); free(G); }
syntax highlighted by Code2HTML, v. 0.9.1