Ciao a tutti,
devo fare un esercizio utilizzando una lista concatenata, il testo è il seguente:

Si consideri il tipo:

typedef struct MElem {
int val;
long count;
struct MElem *next;
} MElem, *MSet;

Scrivere una funzione void compact_ms(MSet M) che elimina dalla lista M ogni elemento x per cui esiste un elemento y che precede x e che ha lo stesso valore del campo val (cioè x.val = y.val), inoltre ogni elemento y non eliminato dovrà contenere nel campo count la somma dei campi count di tutti gli elementi che nella lista originale hanno lo stesso valore del campo val di y. L'ordine degli elementi non deve essere cambiato, il puntatore al primo elemento non deve essere modificato e la memoria degli elementi elminati deve essere rilasciata. Ad esempio, se la lista M è

{123, 2} -> {456, 1} -> {123, 1} -> {222, 5} -> {222, 3} -> {123, 8}

allora la funzione modifica la lista così

{123, 11} -> {456, 1} -> {222, 8}

supponendo che la lista sia stata inserita correttamente e i valori sono aggiunti in coda, ho fatto la funzione void compact così:

codice:
void compact(MSet m){
    MSet s,temp,x=m;
    
    while(m!=NULL){
        s=m->next;
        while(s!=NULL){
            temp=s->next;
            if(m->val==s->val){
                m->count+=s->count;
                m=elimina(m,s->val);
                x->next=temp;
            }
            s=temp;
        }
        
        m->next=x;
    }
}
purtroppo però va in loop e so anche perchè, ma non riesco a risolvere il problema >.< sono svariate volte che ci provo ma non ne vengo a capo. So che è facile a questo punto ma non riesco a capire, sapreste aiutarmi?