Ciao a tutti, scrivo perchè ho un grossissimo problema. Uno dei miei ultimi esami per la laurea è fondamenti di informatica: il corso richiede un progetto utilizzando strutture dati. Senza perdermi troppo in discorsi, vi spiego il mio problema.
Il mio progetto è un social network e praticamente si compone di una lista in cui ho tutti gli utenti registrati con questa struct
e non ho alcun problema con l'eliminazione dalla lista, aggiungere in testa o ordinatamente. Diciamo che con le liste me la cavo in maniera abbastanza sciolta.
Il campo puntatore amici dovrebbe idealmente puntarmi alla testa della lista personale di ogni utente e permettermi le operazioni su questa lista singola (inserisco la struct nodo_amici per facilitare la comprensione)
Adesso, il mio problema è uno. Come faccio ad aggiungere campi alla mia lista amici personale? fin'ora ho cercato da solo una soluzione e (non ironicamente) sono 15 giorni che sbatto la testa con il risultato che mi ritrovo sempre una singola lista amici e quindi accedendo ad ogni utente trovo sempre la stessa lista di amici.
Non so se mi sono spiegato correttamente quindi vi faccio un esempio: io Fabio aggiungo Luca agli amici.
La soluzione a cui ero arrivato era: mi scorro tutta la lista utenti, nel momento in cui vado a trovare la persona a cui devo aggiungere l'amico (in questo caso io Fabio), mi copio su un puntatore temporaneo il puntatore della mia lista amici e poi la scorro e aggiungo Luca alla mia lista.
posto la mia soluzione (non funzionante) N.B. La funzione trovapers è un controllo per non far aggiungere persone non registrate alla mia lista amici:
Ultima cosa, il mio progetto è fatto con due header, uno utenti e uno amici e per non intasare il post non vado a postare tutto il codice. Sono aperto a qualsiasi richiesta pur di farmi passare questo DANNATISSIMO esame che io già so, mi farà laureare fuori corso.
Grazie infinite a tutti
Il mio progetto è un social network e praticamente si compone di una lista in cui ho tutti gli utenti registrati con questa struct
Codice:
struct utente {
char nome[20];
char cognome[20];
char username[20];
char password[20];
char ddn[20];
struct nodo_amici* amici;
struct utente* next;
};
typedef struct utente lista_utenti;
Il campo puntatore amici dovrebbe idealmente puntarmi alla testa della lista personale di ogni utente e permettermi le operazioni su questa lista singola (inserisco la struct nodo_amici per facilitare la comprensione)
Codice:
struct nodo_amici{
char username[20];
struct nodo_amici* next;
};
typedef struct nodo_amici lista_amici;
Adesso, il mio problema è uno. Come faccio ad aggiungere campi alla mia lista amici personale? fin'ora ho cercato da solo una soluzione e (non ironicamente) sono 15 giorni che sbatto la testa con il risultato che mi ritrovo sempre una singola lista amici e quindi accedendo ad ogni utente trovo sempre la stessa lista di amici.
Non so se mi sono spiegato correttamente quindi vi faccio un esempio: io Fabio aggiungo Luca agli amici.
La soluzione a cui ero arrivato era: mi scorro tutta la lista utenti, nel momento in cui vado a trovare la persona a cui devo aggiungere l'amico (in questo caso io Fabio), mi copio su un puntatore temporaneo il puntatore della mia lista amici e poi la scorro e aggiungo Luca alla mia lista.
posto la mia soluzione (non funzionante) N.B. La funzione trovapers è un controllo per non far aggiungere persone non registrate alla mia lista amici:
Codice:
int trovapers (lista_utenti *lista, char username[]){
lista_utenti* r= lista; //precedente
while(r!=NULL){
if((strcmp(r->username, username))==0) {
// puts("L'utente è registrato al social! \n");
return 0;
}
else {
r=r->next;
}
}
printf("Utente non registrato! \n");
return 1;
}
int aggiungi_amico (struct utente **lista, char trovaptr[], char username[]) {//registrazione
int trovato;
struct nodo_amici** tmp = NULL;
lista_utenti* s= *lista; //precedente
while(s!=NULL){
if((strcmp(s->username, trovaptr))==0)
tmp=&(*lista)->amici;
s=s->next;
}
trovato=trovapers(*lista, username);
if(trovato==0){
lista_amici* r= *tmp; //precedente
lista_amici* q= *tmp; //successivo
lista_amici* p=(lista_amici*)malloc(sizeof(lista_amici)); //alloco nuovo nodo
if (p==NULL) return 1; //se non alloco il nodo allora restituisco 1
strcpy(p->username, username);
p->next=NULL;
if(q==NULL){
lista_amici* p;
p =(lista_amici*)malloc(sizeof(lista_amici));
strcpy(p->username, username);
p->next=*tmp;
*tmp=p;
return 0;
}
while((q!=NULL)&&(strcmp(q->username, p->username)<0)){
r=q;
q=q->next;
}
if(q==*tmp){
p->next=*tmp;
*tmp=p;
return 0;
}
else{
r->next=p;
p->next=q;
}
return 0; //se tutto è andato correttamente resistuisco 0
}
else return 1;
}
Ultima cosa, il mio progetto è fatto con due header, uno utenti e uno amici e per non intasare il post non vado a postare tutto il codice. Sono aperto a qualsiasi richiesta pur di farmi passare questo DANNATISSIMO esame che io già so, mi farà laureare fuori corso.
Grazie infinite a tutti