Hai un po di confusione sulle liste. Queste come puoi ben notare sono delle strutture dati, dove però i dati non vengono memorizzati in aree di memoria contigue, cioè per dirla più facile immagina un cassettiera con tanti cassetti se tu salvi il dato nel primo cassetto, il secondo dato non è detto che venga messo nel secondo cassetto, ma pensi nel terzo quarto o comunque nelle aree libere, questo perché nei moderni SO si usa un'allocazione non contigua della memoria.
Ora ritornando al C/ C++ sostanzialmente tu hai una struttura tipo
struct lista{
int dato
struct lista *pnext
} Lista;
Ora in testa tu avrai il primo dato e per accedere al secondo dovrai visualizzare il contenuto di pnext, tipo
Lista prova;
prova.dato = ottieni il dato in testa. Ora se tu vuoi accedere al 2 dato dovrai fare cosi
Lista tmp;
tmp=prova->pnext e cosi avra accesso al secondo dato. metti questo in un ciclo e potrai scorrere la lista finche il pnext è != NULL
per capirci
tmp=prova->pnext;
While (tmp != NULL){
Stampa dato;
tmp=tmp->pnext;
}
Per inserire un elemento in testa o in coda o al centro devi prima di tutto
SALVARE i pnxet perché altrimenti spezzeresti la lista.
In sostanza cerca di seguirmi
Hai 2 nodi A e C e vuoi inserire B tra i due siccome hai in A il puntatore a C tu dovrai
fare prima di tutto
B.pnext=A.pnext // quindi ho preso il nodo B e l'ho collegato al successivo di A cioè C
A.pnext= B; // ora ho preso il successivo di A e l'ho impostato a B (precedentemente era C) ora avrai
A B C . Ovviamente queste sono liste a singolo puntatore qualora avresti bisogno di doppio puntatore l'operazione a cui devi dare priorità è sempre il collegamento tra i pnext perché qualora tu avessi scritto prima A.pnext=B e poi B.pnext=A.pnext sostanzialmente B punta a se stesso... Loop infinito
Non so che domanda hai fatto precisamente però mi pare che hai un po di confusione sulle liste. In ogni caso oltre allo studio delle liste ti consiglio di capire anche un po la situazione allocazione memoria.