Salve ragazzi sto gestendo una lista a puntatori che ha i seguenti campi nome cognome e un campo float per un prezzo  questa lista può avere anche più volte lo stesso nome e cognome se è così la persona è la stessa io devo fare il conteggio del campo float stando quindi attendo ad escludere le persone già precedentemente conteggiate esempio:
nome 1               nome2            nome3                 nome1
cognome1          cognome2       cognome3                    cognome1
euro 10.00         15.00                 7.10                  20.00
questa lista deve stampare 
nome 1               nome2              nome3
cognome1           cognome2         cognome3
euro 30              euro 15              7.10
avevo pensato di gestire un vettore parallelo sotto mettendo 1 in corrispondenza   dei nodi già conteggiati in modo da non conteggiarli più  in questo modo
nome 1               nome2            nome3                    nome1
cognome1           cognome2       cognome3                   cognome1
euro 10.00         15.00              7.10                     20.00    
|   1   |           |     0  |      | 0    |                   |   1    |
 
e creando man mano dei nodi che salvano solo una volta ogni persona con il totale. ma secondo me ho combinato un mezzo casino xd vi posto il sorgente molto lungo (350 righe) se volete darmi 1 suggerimento anche senza correggere il codice ben venga
// gestione di un database di un parrucchiere
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct parrucchiere
{
    char *nome_cliente;
    char *cognome_cliente;
    float prezzo_taglio;
    char *nome_taglio;
    struct parrucchiere *next;
};
struct parrucchiere *inizializza(struct parrucchiere* barbiere);
struct parrucchiere* inserisci(struct parrucchiere *barbiere,char*nome,char*cognome,float prezzo,char*taglio);
struct parrucchiere*creanodo(char*nome,char*cognome,float prezzo,char *taglio);
void stampa(struct parrucchiere*barbiere);
int conta(struct parrucchiere*barbiere);
void trasferisci_nel_vettore(struct parrucchiere *barbiere);
void crea_vettore_parallelo(struct parrucchiere *vet,int size);
void totale_prezzo_per_ogni_cliente(int*vet_paralelo,struct parrucchiere *vet,int size);
float totale_cliente(int *Vet_parallelo,struct parrucchiere *vet,int size,int j,struct parrucchiere*);
void stampa_totale_clienti(struct parrucchiere*vet,float*prezzi_clienti);
void inizializza_nome_cognome_taglio(char *nome,char*cognome,char*taglio);
int main(void)
{
    struct parrucchiere *barbiere = NULL;
    int scelta;
    char *nome = NULL,*cognome=NULL,*taglio=NULL;
    float prezzo=0;
    barbiere=inizializza(barbiere);
    nome=(char*)malloc(sizeof(char));
    cognome=(char*)malloc(sizeof(char));
    taglio=(char*)malloc(sizeof(char));
    
    do{
    printf("1: acquisisci \n");
    printf("2:stampa\n");
    printf("3:stampa totale\n");
        printf("4:esci\n");
    scanf("%d",&scelta);
    
    switch(scelta)
    {
        case 1:
            printf("inserisci il nome\n");
            scanf("%s",nome);
            
            printf("inserisci il cognome\n");
            scanf("%s",cognome);
            
            
            printf("inserisci  il nome del taglio\n");
            scanf("%s",taglio);
            
            
            printf("inserisci il costo\n");
            scanf("%f",&prezzo);
            
            
            barbiere=inserisci(barbiere,nome,cognome,prezzo,taglio);
            break;
            
            
        case 2:
            stampa(barbiere);
            break;
            
            
        case 3:
            trasferisci_nel_vettore(barbiere);
            break;
            
            
        case 4:
            printf("arrivederci\n");
            break;
            
       
        default: printf("scelta errata\n");
        
    }
    }while(scelta!=4);
    
    
    
    
    
}
struct parrucchiere *inizializza(struct parrucchiere *barbiere)
{
    barbiere=(struct parrucchiere*)malloc(sizeof(struct parrucchiere));
    barbiere->nome_cliente=(char*)malloc(sizeof(char));
    barbiere->cognome_cliente=(char*)malloc(sizeof(char));
     barbiere->nome_taglio=(char*)malloc(sizeof(char));
    strcpy(barbiere->nome_cliente,"vuoto");
    strcpy(barbiere->cognome_cliente,"vuoto");
    strcpy(barbiere->nome_taglio,"vuoto");
    barbiere->prezzo_taglio=0.00;
    
    barbiere->next=NULL;
    return barbiere;
}
struct parrucchiere*creanodo(char *nome,char*cognome,float prezzo,char*taglio)
{
    struct parrucchiere *app = NULL;
    app=inizializza(app);
    
    strcpy(app->nome_cliente,nome);
    strcpy(app->cognome_cliente,cognome);
    strcpy(app->nome_taglio,taglio);
    app->prezzo_taglio=prezzo;
    //app->next=NULL   gia fatto quando chiamo inizializza;
    return app;
}
struct parrucchiere* inserisci(struct parrucchiere *barbiere,char*nome,char*cognome,float prezzo,char*taglio)
{
    struct parrucchiere *copia,*app=NULL;
    
    copia=barbiere;
    
    app=creanodo(nome,cognome,prezzo,taglio);
    
    while(copia->next!=NULL)
    {
        copia=copia->next;
    }
    copia->next=app;
    return barbiere;
}
void stampa(struct parrucchiere *barbiere)
{
    struct parrucchiere *copia;
    
    
    copia=barbiere;
    
    copia=copia->next;// primo nodo è fasullo
    while(copia!=NULL)
    {
        
        printf("Nome : %s \n",copia->nome_cliente);
        printf("Cognome : %s \n",copia->cognome_cliente);
        printf("Tipo taglio : %s\n",copia->nome_taglio);
        printf("Costo : %g\n",copia->prezzo_taglio);
        printf("________________________________\n");
    
        copia=copia->next;
    }
}
int conta(struct parrucchiere *barbiere)
{
    int cont=0;
    struct parrucchiere * copia;
    
    copia=barbiere;
    
   while(copia!=NULL)
   {
       cont++;
       copia=copia->next;
   
   }
    return cont;
}
void trasferisci_nel_vettore(struct parrucchiere *barbiere)
{
    int size,i;
    struct parrucchiere *vet,*copia;
    
    size=conta(barbiere);
    
    vet=(struct parrucchiere*)malloc(size*sizeof(struct parrucchiere));
    
    i=0;
    
    copia=barbiere;
    
    while(copia!=NULL)
    {
        vet[i].nome_cliente=(char*)malloc(sizeof(char));
        strcpy(vet[i].nome_cliente,copia->nome_cliente);
        vet[i].cognome_cliente=(char*)malloc(sizeof(char));
        strcpy(vet[i].cognome_cliente,copia->cognome_cliente);
        vet[i].nome_taglio=(char*)malloc(sizeof(char));
        strcpy(vet[i].nome_taglio,copia->nome_taglio);
        vet[i].prezzo_taglio=copia->prezzo_taglio;
        i++;
        
        copia=copia->next;
    
    }
    crea_vettore_parallelo(vet,size);
}
void crea_vettore_parallelo(struct parrucchiere *vet,int size)
{
    int *vet_parallelo;
    int i;
    
    vet_parallelo=(int *)malloc(size*sizeof(int));
    
    for(i=0;i<size;i++)
    {
        vet_parallelo[i]=0; // vettore parallelo tutti elementi uguali a 0 servira al prossimo sottoprogramma
    
    
    }
    
    totale_prezzo_per_ogni_cliente(vet_parallelo,vet,size);
}
void totale_prezzo_per_ogni_cliente(int *vet_parallelo,struct parrucchiere *vet,int size)
{
    float *prezzi_cliente;
    int i,j;
    
    
    struct parrucchiere *nuova_lista = NULL;
    nuova_lista=inizializza(nuova_lista);
    
    
    prezzi_cliente=(float*)malloc(size*sizeof(prezzi_cliente));
    
  // le caselle che avranno 1 vuol dire  che sono state già conteggiate;
    j=0;
    for(i=0;i<size;i++)
    {
        if(vet_parallelo[j]==0)
        { // cella mai controllata prima d'ora
            prezzi_cliente[j]=totale_cliente(vet_parallelo,vet,size,j,nuova_lista);
        j++;// la j mi servirà successivamente per capire la nuova lunghezza del vettore 
        }
        
    }
    
    stampa_totale_clienti(nuova_lista,prezzi_cliente);
    
    
    
    
}
float totale_cliente(int *vet_parallelo,struct parrucchiere *vet,int size,int j,struct parrucchiere *nuova_lista )
{
    float conteggio;
    int copia_j;
    
    copia_j=j; // copia j avanzerà mentre j è di riferimento , se copia j trova una cella con nome e cognome uguale a j il prezzo verrà sommato e vet_parallelo[copia_j]=1; // elemento controllato
    
    conteggio=vet[j].prezzo_taglio;
    copia_j++;
    while(copia_j<size)
    {
        if((strcmp(vet[j].nome_cliente,vet[copia_j].nome_cliente)==0)&&(strcmp(vet[j].cognome_cliente,vet[copia_j].cognome_cliente)==0))// nome e cognome coincidono sono la stessa persona sommo quando ha speso in giorni differenti
        {
            conteggio=conteggio+vet[copia_j].prezzo_taglio;
    vet_parallelo[copia_j]=1;
            
            nuova_lista=inserisci(nuova_lista,vet[j].nome_cliente,vet[j].cognome_cliente,conteggio,"null");
        }
        copia_j++;
    }
    return conteggio;
}
void stampa_totale_clienti(struct parrucchiere *nuova_lista,float*prezzi_cliente)
{
    
    
    nuova_lista=nuova_lista->next;
    
    while(nuova_lista!=NULL){
        printf("nome: %s\n",nuova_lista->nome_cliente);
    printf("cognome: %s\n",nuova_lista->cognome_cliente);
    printf("totale: %g\n",nuova_lista->prezzo_taglio);
    printf("___________________________\n");
    nuova_lista=nuova_lista->next;
    }
    
}