Eliminar último elemento de lista en FreePascal

Aziwar

Buenas! Pues no se que me pasa que no me elimina correctamente el último elemento de una lista y no se poque :S Lo borra pero despues se queda con simbolos raros por ejemplo ?xC?? o cosas asi raras..

Los procedimientos en cuestion son estos: (no tienen nada raro, son simples para practicar cosas q el martes examen). Pila es eliminar por el final, y cola eliminar por el principio.

procedure pila(var ult : puntero);

var
p : puntero;

begin;
p := ult;
ult := p.ant;
dispose(p);
end; { pila }

procedure cola(var pri : puntero);

var
p : puntero;

begin;
p := pri;
pri := p.sig;
dispose(p);
end; { cola }

MaKi

Para borrar primero tiene que haber algo.
Después tienes cosas mal de no seguir bien la especificación del TAD.
Una pila no se borra se desapila a donde apunte la cima. (punteros al anterior ? te lo han explicaco así ? lo más normal es con sig)
Y una cola tiene 2 punteros, yo solo te veo uno. La cola no es que borre el primero, si no que atiendes la cola, y la operación es "desencolar". entonces te falta mirar algun caso especial como cuando desencolas cuando solo hay 1 nodo. (el primero y el ultimo apuntan al mismo nodo) entonces ponlos mirando a nil. Cuando aparecen caracteres extraños es por que estamos leyendo basura, que en algunos casos no nos pertenece y el programa puede reventar.

MaKi
bool CCola::desencolar()
{
	if(!esVacia())
	{
		if(cont == 1)
		{
			delete primero;
			primero = ultimo = NULL;
		}
		else
		{
			CNodoCola * aux = primero;
			primero = primero->getSiguiente();
			delete aux;
		}
		cont--;
		return true;
	}
	else
		return false;
}

En c++ es así, tambien lo tengo en pascal, pero no lo encuentro. El caso especial que te hablaba es ese, cuando solo hay uno, liberas el primero, y primero y ultimo apuntan a NIL en los demas casos lo haces como lo estas haciendo.

Usuarios habituales

  • MaKi
  • Aziwar