Me he montado una lista a mi gusto para un juego que estoy haciendo.
En esta lista voy metiendo las teclas que voy pulsando y la vacio cuando entre tecla y tecla ha pasado un cierto intervalo de tiempo.
Mi pregunta es si estoy vaciando correctamente la lista, ya que a veces el juego se me queda colgado y nose que es lo que me pasa.
s8 es un signed int de 8 bytes
u32 es un unsigned int de 32 bytes
Aquí las estructuras::
Código:
typedef struct button
{ s8 tecla; //tecla pulsada
bool hold; //esta mantenido pulsado?
u32 time; //Numero de segundos desde que empezó la partida
}button;
//Puntero a un nodo
typedef struct nodo
{ button boton;
struct nodo* next; //apunta al suiguiente
struct nodo* prev; //apunta al anterior
}nodo;
typedef struct lista{
nodo* last; //apunta al ultimo
nodo* first; //apunta al primero
nodo* eye; //apunta al que al ultimo visto
int elm; //numero de elementos
}lista;
Aqui las funciones
Código:
/* Crear la lista
*/
lista* newLista(void)
{ lista* q; //q de query(lista)
q=(lista *)malloc(sizeof(lista));
if(!q)
{ //perror("No se ha reservado memoria para el listón");
}
else
{ q->last=NULL;
q->first=NULL;
q->eye=NULL;
q->elm=0;
}
return q;
}
/* Insertar elemento en la lista
*/
void inserta(lista* lista,button boton)
{ nodo* nuevo;
nuevo=(nodo*)malloc(sizeof(nodo));
if(!nuevo) //Si no hay espacio...
{ //perror("No hay espacio en memoria");
}
else
{ nuevo->boton=boton;
nuevo->next=NULL;
nuevo->prev=NULL;
if(lista->elm > 0)
{ nuevo->prev=lista->last; //El prev del nuevo apunta al ultimo de la lista
lista->last->next=nuevo; //El ultimo de la lista apunta al nuevo
lista->last=nuevo; //El apuntador last apunta al nuevo
}
else //Si es el primer elemento...
{ lista->first=nuevo;
lista->eye=nuevo;
lista->last=nuevo;
}
lista->elm++; //Aumentamos el contador
}
}
/* Modifica el ultimo valor
*/
void updateUltimo(lista* lista,button boton)
{ lista->last->boton=boton;
}
/* Leemos el siguiente elemento de la lista
*/
button leer(lista* lista)
{ button temp;
temp=lista->eye->boton;
if(lista->eye->next)
{ lista->eye=lista->eye->next; //Apuntamos al siguiente
}
else
{ lista->eye=lista->first;
}
return temp;
}
/* Leemos el ultimo elemento de la lista
*/
button leerUltimo(lista lista)
{ button temp;
if(lista.last!=NULL)
{ temp=lista.last->boton;
return temp;
}
else
{ temp.tecla=myNULL;
return temp;
}
}
/* Vaciamos la lista
*/
void vaciar(lista* lista)
{ nodo* aux;
while(lista->elm > 0) //Mientras no esté vacia vamos a ir vaciando elementos
{ aux=lista->last;
lista->elm--;
if(lista->elm > 0)
{ lista->last=lista->last->prev;
}
free(aux);
}
lista->first=NULL;
lista->last=NULL;
}
No se si el free lo hago sobre el elemento correcto o deberia hacer un free de (lista->last)... nose, a veces con esto de los punteros me hago un lio