Ciao, da un'occhiata veloce al codice secondo me ti stai complicando troppo la vita, io farei qualcosa del genere:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct amico_
{
char username[20];
struct amico_ *next;
} amico;
typedef struct utente_
{
char username[20];
unsigned int eta;
amico *lista_amici;
struct utente_ *next;
} utente;
void aggiungi_in_testa_amico(amico **p, const char username[20])
{
amico *nuovo = (amico*)malloc(sizeof(amico));
strcpy(nuovo->username, username);
nuovo->next = *p;
*p = nuovo;
}
void aggiungi_in_testa_utente(utente **p, const char username[20], const unsigned int eta)
{
utente *nuovo = (utente*)malloc(sizeof(utente));
strcpy(nuovo->username, username);
nuovo->eta = eta;
nuovo->lista_amici = NULL;
nuovo->next = *p;
*p = nuovo;
}
amico* trova_amico(amico *p, const char username[20])
{
while(p && strcmp(p->username, username))
{
p = p->next;
}
return p;
}
utente* trova_utente(utente *p, const char username[20])
{
while(p && strcmp(p->username, username))
{
p = p->next;
}
return p;
}
void aggiungi_amico(utente *p, const char utente[20], const char amico[20])
{
if(strcmp(utente, amico) && (p = trova_utente(p, utente)))
{
if(!trova_amico(p->lista_amici, amico))
{
aggiungi_in_testa_amico(&p->lista_amici, amico);
}
}
}
void stampa_lista_amici(amico *p)
{
while(p)
{
printf("%s ", p->username);
p = p->next;
}
}
void stampa_lista_utenti(utente *p)
{
while(p)
{
printf("%s\t%2u anni | amici: ", p->username, p->eta);
stampa_lista_amici(p->lista_amici);
printf("\n");
p = p->next;
}
}
int main()
{
utente *lista = NULL;
aggiungi_in_testa_utente(&lista, "LUCA", 20);
aggiungi_in_testa_utente(&lista, "ALDO", 21);
aggiungi_in_testa_utente(&lista, "MARTA", 22);
aggiungi_in_testa_utente(&lista, "MIRCO", 23);
aggiungi_in_testa_utente(&lista, "GIORGIO", 24);
aggiungi_amico(lista, "MARTA", "GIORGIO");
aggiungi_amico(lista, "ALDO", "GIORGIO");
aggiungi_amico(lista, "MARTA", "LUCA");
aggiungi_amico(lista, "GIORGIO", "MARTA");
aggiungi_amico(lista, "MIRCO", "ALDO");
aggiungi_amico(lista, "MIRCO", "GIORGIO");
aggiungi_amico(lista, "MARTA", "MIRCO");
aggiungi_amico(lista, "LUCA", "ALDO");
aggiungi_amico(lista, "ALDO", "LUCA");
stampa_lista_utenti(lista);
return 0;
}
Relativamente al codice, non ho ricontrollato quello che ho scritto, potrebbe quindi esserci qualche errore, in ogni caso il punto è l'impostazione logica del programma mediante brevi funzioni generiche.
P.S.
Modificare la struct
struct nodo_amici
{
char username[20];
struct nodo_amici* next;
};
in
struct nodo_amici
{
struct utente* amico;
struct nodo_amici* next;
};
potrebbe portare alcuni vantaggi, ma per il momento, assodato che l'username sia una chiave univoca, può andar bene anche così.