Di seguito vediamo la creazione e stampa di un albero memorizzato mediante la sua lista di adiacenza.

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

struct tree {
  int id;
  int value;
  int nA;
  struct tree **ar;
};

typedef struct tree tree;

void set_node(tree *tr, int nN);
void connect_node(tree *tr, int nN);
void print_tr(tree *tr, int nN, int cmd);

int main(void) {
  tree *tr = NULL; // seme dell'albero
  int nN, cmd; // numero nodi, comando

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

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

  set_node(tr, nN);
  connect_node(tr, nN);
  
  do {
    printf("\nCosa vuoi fare?\n");
    printf("1) Stampa nodi\n");
    printf("2) Stampa archi\n");
    printf("3) Stampa albero completo\n");
    printf("4) Esci\n");
    printf("Comando: ");
    scanf("%d", &cmd);

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

  return 1;
}

void set_node(tree *tr, int nN) {
  int i=0; // contatore
  int value; // numero nodi, valore
  tree *t;

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

    t = malloc(sizeof(tree));
    if(t == NULL) {
      printf("Allocazione 2 fallita");
      exit(1);
    }

   t -> id = i;
   t -> value = value;

   memcpy(&tr[i], t, sizeof(tree));

   free(t);
  }
}

void connect_node(tree *tr, int nN) {
  int i, j; // contatori
  int nA; // numero archi
  int n1; // nodo da collegare

  for(i=0; i<nN; i++) {
    printf("Inserisci il numero degli archi del nodo %d: ", i);
    scanf("%d", &nA);

    tr[i].nA = nA;
    tr[i].ar = calloc(nA, sizeof(tree *));

    if(tr[i].ar == NULL) {
      printf("Allocazione 3 fallita");
      exit(1);
    }

    for(j=0; j<nA; j++) {
      printf("Definisci i collegamenti del nodo %d (da 0 a %d): ", i, nN-1);
      scanf("%d", &n1);
    
      tr[i].ar[j] = &(tr[n1]);
    }
  }
}

void print_tr(tree *tr, 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", tr[i].id, tr[i].value);
    }
  }
    
  printf("\n");

  if(cmd == 2 || cmd == 3) {
    printf("\nLista archi: \n");
    for(i=0; i<nN; i++) {
      printf("Archi da %d: \n", tr[i].id);
      for(j=0; j<tr[i].nA; j++) {
        printf(" - %d \n", tr[i].ar[j]->id);
      }
      printf("\n");
    }
  }
}

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