Per evitare di allocare altra memoria (oltre a quella assegnata alle due liste)
bisogna cambiare i valori dei puntatori presenti nei nodi delle due liste,
generando una nuova concatenazione che risponda alle condizioni date.
Propongo una soluzione per il primo caso (alternanza degli elementi delle liste).
Questa e' la struct che rappresenta un nodo:
struct nodo
{
int numero;
struct nodo *p_prossimo;
};
Nel programma si trovano questi puntatori a struct di tipo nodo:
p_lista_1, p_lista_2, che puntano al primo elemento di una lista;
p_corrente_1, p_corrente_2, p1, p2, che sono puntatori supplementari.
Ometto il codice per riempire le liste.
La nuova concatenazione viene creata con questo segmento di codice:
p_corrente_1=p_lista_1;
p_corrente_2=p_lista_2;
continua=1;
do
{
if ((p_corrente_1!=NULL)&&(p_corrente_2!=NULL))
{
p1=p_corrente_1->p_prossimo;
p_corrente_1->p_prossimo=p_corrente_2;
p2=p_corrente_2->p_prossimo;
if (p1!=NULL)
{p_corrente_2->p_prossimo=p1;}
p_corrente_1=p1;
p_corrente_2=p2;
}
else
{continua=0;}
} while(continua==1);
A questo punto, percorrendo la sequenza di nodi che parte da p_lista_1,
si puo' visualizzare la nuova concatenazione:
struct nodo *p_corrente;
printf("\n\n%s", "Lista: ");
p_corrente=p_lista_1;
while (p_corrente!=NULL)
{
printf("%d%s", p_corrente->numero, " ");
p_corrente=p_corrente->p_prossimo;
}
Sarebbe complicato spiegare a parole il funzionamento dell'algoritmo proposto.
Si puo' capire meglio disegnando parallelamente su un foglio le due liste,
secondo le usuali convenzioni che si trovano nei testi di informatica,
e poi modificando a penna i collegamenti fra i nodi.