Di seguito vediamo la creazione e stampa di un grafo non orientato memorizzato mediante la sua matrice di adiacenza.

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

struct graph {
  int nV;      // numero vertici
  int nL;      // numero lati
  int *value;  // valori dei nodi
  int **mat;   // matrice di adiacenza
};

typedef struct graph graph;

void create(graph *gr);
void edge(graph *gr, int a, int b);
void print_gr(graph *gr, int cmd);

int main(void) {
  int cmd;
  graph gr;
  printf("Inserisci il numero di nodi: ");
  scanf("%d", &gr.nV);

  printf("Inserisci il numero dei lati (MEMO - il grafo non e' orientato): ");
  scanf("%d", &gr.nL);	

  create(&gr);

  do {
    printf("\nCosa vuoi fare?\n");
    printf("1) Stampa nodi\n");
    printf("2) Stampa la matrice di adiacenza\n");
    printf("3) Esci\n");
    printf("Comando: ");
    scanf("%d", &cmd);

    if(cmd != 3) {
      print_gr(&gr, cmd); // esecuzione comando
    }
  } while(cmd != 3);

  return 1;
}

void create(graph *gr) {
  int i, a, b;

  // alloco lo spazio per il vettore dei valori
  gr->value = calloc(gr->nV, sizeof(int));
  if(gr->value == NULL) {
    printf("Allocazione 1 fallita");
    exit(1);
  }

  // carico i valori dei nodi
  for(i=0; i<gr->nV; i++) {
    printf("Valore del nodo %d: ", i);
    scanf("%d", &gr->value[i]);
  }

  // aloco lo spazio per la matrice di adiacenza
  gr->mat = calloc(gr->nV, sizeof(int *));
  if(gr->mat == NULL) {
    printf("Allocazione 2 fallita");
    exit(1);
  }

  for(i=0; i<gr->nV; i++) {
    gr->mat[i] = calloc(gr->nV, sizeof(int));
    if(gr->mat[i] == NULL) {
      printf("Allocazione 3.%d fallita", i);
      exit(1);
    }

    memset(gr->mat[i], 0, sizeof(int)*gr->nV);
  }

  // carico la matrice
  for(i=0; i<gr->nL; i++) {
    printf("Lato (a b): ");
    scanf("%d %d", &a, &b);
    edge(gr, a, b);
  }
}

void edge(graph *gr, int a, int b) {
  if(a>gr->nV || a<0 || b>gr->nV || b<0) {
    exit(1);
  }

  gr->mat[a][b] = 1;
  gr->mat[b][a] = 1;  // il grafo non è orientato
}

void print_gr(graph *gr, int cmd) {
  int i, j;

  if(cmd == 1) {
    printf("\nLista nodi (%d):\n", gr->nL);
    for(i=0; i<gr->nV; i++) {
      printf("Nodo %d - Valore %d\n", i, gr->value[i]);
    }
  }
  else if(cmd == 2) {
    printf("\nMatrice di adiacenza:\n");

    for(i=0; i<gr->nV; i++) {
      for(j=0; j<gr->nV; j++) {
        printf("%3d", gr->mat[i][j]);
      }

      printf("\n\n");
    }
  }
}

Per maggiori informazioni circa la sintassi del linguaggio si faccia riferimento alla guida al Linguaggio C.