Di seguito vediamo la creazione e stampa di un grafo non orientato memorizzato mediante la sua lista di adiacenza. La lista di adiacenza รจ rappresentata come un semplice vettore.

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

struct graph {
  int id;	      // id del nodo
  int value;	      // vaore del nodo
  int nA;             // numero di archi
  struct graph **ar;  
};

typedef struct graph graph;

graph *create(graph *gr, int nN);
void add_arch(graph *gr, int nN);
void print_gr(graph *gr, int nN, int cmd);

int main(void) {
  int nN, cmd;
  graph *gr = NULL;

  printf("Inserisci il numero di nodi: ");
  scanf("%d", &nN);

  gr = calloc(nN, sizeof(graph));
  if(gr == NULL) {
    printf("Allocazione 1 fallita");
    exit(1);
  }

  gr = create(gr, nN);
  
  do {
    printf("\nCosa vuoi fare?\n");
    printf("1) Stampa nodi\n");
    printf("2) Stampa archi\n");
    printf("3) Stampa grafico completo\n");
    printf("4) Esci\n");
    printf("Comando: ");
    scanf("%d", &cmd);

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

  return 1;
}

graph *create(graph *gr, int nN) {
  int i, value;

  for(i=0; i<nN; i++) {
    printf("Inserisci il valore del nodo %d: ", i);
    scanf("%d", &value);

    gr[i].id = i; // setto l'id dei nodi in modo sequenziale
    gr[i].value = value;
  }

  add_arch(gr, nN);
  return &gr[0];
 }

void add_arch(graph *gr, int nN) {
  int i, j; // contatori
  int nA, id;

  for(i=0; i<nN; i++) {
    printf("\nInserisci il numero di archi che partono dal nodo %d: ", i);
    scanf("%d", &nA);

    if(nA == 0) {
      continue;
    }

    gr[i].nA = nA;

    gr[i].ar = calloc(nA, sizeof(graph *));
    if(gr[i].ar == NULL) {
      printf("Allocazione 2.%d fallita", i);
      exit(1);
    }	

    for(j=0; j<nA; j++) {
      printf("\n - inserisci il nodo da raggiungere (da 0 a %d): ", nN-1);
      scanf("%d", &id);

      gr[i].ar[j] = &gr[id];
    }
  }
}

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

  if(cmd == 1 || cmd  == 3) {
    printf("\nLista nodi (%d):\n", nN);
    for(i=0; i<nN; i++) {
      printf("Nodo %d - Valore %d\n", gr[i].id, gr[i].value);
    }
  }

  printf("\n");

  if(cmd == 2 || cmd  == 3) {
    for(i=0; i<nN; i++) {
      printf("\nNodo %d - Valore %d - N. Archi %d:\n", gr[i].id, gr[i].value, gr[i].nA);

      if(gr[i].nA == 0) {
        printf(" - Nessun arco\n");
      }

      for(j=0; j<gr[i].nA; j++) {
        printf(" - Da %d a %d\n", i, gr[i].ar[j]->id);
      }
    }
  }
}

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