/// <summary> /// Wyciągnięcie ze stosu najwyższego elementu i wstawienie w jego miejsce kolejnego /// </summary> /// <returns></returns> public Position TakeHeapHeadPosition() { var node = HeapHead; HeapHead = HeapHead.NextNode; return(node.Position); }
/// <summary> /// Dodanie węzła z zapewnieniem sortowania wg kosztu /// </summary> /// <param name="node"></param> public void Add(HeapNode node) { // nie ma czego porównywać if (!HasMore()) { HeapHead = node; return; } // jeżeli dodawany węzeł ma niższy koszt niż aktualnie najlepszy lub są równe, dodawany wskakuje na szczyt if (HeapHead.EstimatedCost >= node.EstimatedCost) { var oldHead = HeapHead; node.NextNode = oldHead; // obecnie najwyższy zostaje kolejnym po nowym this.HeapHead = node; // nowy staje się najwyższym return; } // w innym przypadku poszukujemy umiejscowienia dla dodawanego węzła // przeszukanie jest wykonywane aż węzeł nie ma przypisanego kolejnego lub koszt jest wyższy var currentNode = HeapHead; while (currentNode.NextNode != null && currentNode.EstimatedCost < node.EstimatedCost) { currentNode = currentNode.NextNode; } // po zatrzymaniu pętli węzeł zostaje wstawiony w kolejkę node.NextNode = currentNode.NextNode; currentNode.NextNode = node; }
public void Reinsert(HeapNode node) { var currentNode = HeapHead; while (currentNode.NextNode != null) { if (currentNode.NextNode.Position == node.Position) { currentNode.NextNode = currentNode.NextNode.NextNode; Add(node); return; } currentNode = currentNode.NextNode; } }