Salve a tutti.
Immaginatevi tante palline verdi che vagano all'interno di una finestra rimbalzandone sui lati.

Vorrei far in modo che quando si scontrino tra loro una delle due compaia e quella che rimane cambi colore.

le palline sono memorizzate in una lista doppiamente concatenata. Ecco il codice delle strutture che uso e le funzioni di inserimento e cancellazione:

codice:
typedef struct nodo{
    struct nodo *next,*prec;
    GLfloat color,x,y,v,dir; //dir è la direzione 1 top left; 2bottom left; 3 top right; 4 bottom right;
	GLint id;
}nodo;

typedef struct lista{
	struct nodo *first,*last,*index;
	int nelem;
}lista;

lista ll;

void inserisciNodo(lista *l){
	nodo *tmp;
	/*
	* questa parte gestisce il primo elemento della coda
    */
	if(l->first==NULL){
		tmp = (nodo*) malloc(sizeof (nodo));
        tmp->color=2.0;
		tmp->x=10.0;
		tmp->y=590.0;
		tmp->v=v;
		tmp->dir=4;
		tmp->id=idb;
		idb++;
        tmp->next = NULL;
        tmp->prec=NULL;
		l->first=l->last=tmp;
		l->nelem++;
        nball+=1;
    } else {
        /*
         * questa parte gestisce gli inserimenti sucessivi al primo
         */
        tmp = (nodo*) malloc(sizeof (nodo));
        tmp->color=2.0;
		tmp->x=10.0;
		tmp->y=590.0;
		tmp->v=v;
		tmp->dir=4;
		tmp->id=idb;
		idb++;
        tmp->next = NULL;
        tmp->prec=l->last;
        l->last->next = tmp;
        l->last = tmp;
		l->nelem++;
        nball+=1;
    }
}

void cancellaNodo(nodo *n){
	nodo *tmp;
	if(n->prec!=NULL){
		tmp=n->prec;
		tmp->next=n->next;
		n->prec=tmp;
		free(n);
		ll.nelem--;
	}
	else if(n->prec==NULL){
		ll.first=n->next;
		ll.nelem--;
		free(n);
	}
}
dovrei confrontare tutti i nodi tra loro e quando i 2 nodi sono "sovrapposti" ne cancello uno.
ho provato a scrivere decine di funzioni ma mi imbatto in errori di logica che non riesco a risolvere

grazie