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:
Aqui las funcionestypedef 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;
Código:
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 /* 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; }