Da quello che sono riuscito a capire (usa i tag code la prossima volta per postare il codice) se chiami la funzione in questione così
codice:
list_insert(A[0], init(ele1));
non va e il compilatore ti dice
codice:
26 \main.cpp invalid initialization of non-const reference of type 'NODO*&' from a temporary of type 'NODO*'
20 \list.h in passing argument 2 of `void list_insert(NODO*&, NODO*&';)'
mentre invece così
codice:
NODO* provaele1= init(ele1);
list_insert(A[0], provaele1);
non hai problemi, giusto?
Se è così, mi sembra anche abbastanza normale. Se la funzione list_insert() la definisci così
codice:
void list_insert(NODO* &lista,NODO* &x)
quando la vai a richiamare, come secondo parametro devi passare necessariamente una variabile, non un valore costante, perché questo dovrà risultare modificabile all'interno della funzione (essendo un parametro di input/output). Per questo, se richiami la funzione così:
codice:
list_insert(A[0], init(ele1));
verrà prima eseguita init(ele1) che restituirà un puntatore a NODO (es: 0x1234), e questo verrà passato come valore costante (letterale) alla funzione, risultando quindi non modificabile. Quindi o elimini il riferimento nel prototipo della funzione oppure ricorri alla soluzione che hai individuato tu stesso con una variabile da passare per riferimento.