Ver Mensaje Individual
  #1 (permalink)  
Antiguo 30/07/2006, 04:54
clinisbut
 
Fecha de Ingreso: diciembre-2004
Mensajes: 278
Antigüedad: 20 años, 3 meses
Puntos: 0
Vaciando una lista

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

Última edición por clinisbut; 02/08/2006 a las 01:21