public void ReplaceChainElement(int indexOfChainEntry, T newElement) { _chain[indexOfChainEntry] = new ListChainElement { Element = newElement, NextElementIndex = _chain[indexOfChainEntry].NextElementIndex, PreviousElementIndex = _chain[indexOfChainEntry].PreviousElementIndex }; }
public bool RemoveChainElement(int number, int indexOfChainEntry) { // returns true, if indexOfChainEntry is the only element in the chain. _freedChainIndexes.Push(indexOfChainEntry); var chainElement = _chain[indexOfChainEntry]; if (chainElement.PreviousElementIndex == -1 && chainElement.NextElementIndex == -1) { // this is the only element _firstChainElementOfChainNumber[number] = -1; _lastChainElementOfChainNumber[number] = -1; return(true); } var indexOfNextChainElement = chainElement.NextElementIndex; var indexOfPreviousChainElement = chainElement.PreviousElementIndex; if (indexOfNextChainElement != -1) { // the current element has a successor _chain[indexOfNextChainElement] = new ListChainElement { Element = _chain[indexOfNextChainElement].Element, NextElementIndex = _chain[indexOfNextChainElement].NextElementIndex, PreviousElementIndex = indexOfPreviousChainElement }; } else { //removed the last element _lastChainElementOfChainNumber[number] = indexOfPreviousChainElement; } if (indexOfPreviousChainElement != -1) { // the current element has a predecessor _chain[indexOfPreviousChainElement] = new ListChainElement { Element = _chain[indexOfPreviousChainElement].Element, NextElementIndex = indexOfNextChainElement, PreviousElementIndex = _chain[indexOfPreviousChainElement].PreviousElementIndex }; } else { //removed the first element _firstChainElementOfChainNumber[number] = indexOfNextChainElement; } return(false); }
public void StartChain(int indexOfNewChainEntry, int number, T newElement) { Assert.That(_firstChainElementOfChainNumber[number] == -1, "Chain should be empty"); _firstChainElementOfChainNumber[number] = indexOfNewChainEntry; _lastChainElementOfChainNumber[number] = indexOfNewChainEntry; _chain[indexOfNewChainEntry] = new ListChainElement { Element = newElement, NextElementIndex = -1, PreviousElementIndex = -1 }; }
public void RemoveSuccessors(int number, int indexOfChainEntryToKeep) { Assert.That(indexOfChainEntryToKeep != -1, "ChainElement must exist"); var indexOfChainEntryToDelete = _chain[indexOfChainEntryToKeep].NextElementIndex; _lastChainElementOfChainNumber[number] = indexOfChainEntryToKeep; _chain[indexOfChainEntryToKeep] = new ListChainElement { Element = _chain[indexOfChainEntryToKeep].Element, NextElementIndex = -1, PreviousElementIndex = _chain[indexOfChainEntryToKeep].PreviousElementIndex }; while (indexOfChainEntryToDelete != -1) { _freedChainIndexes.Push(indexOfChainEntryToDelete); indexOfChainEntryToDelete = _chain[indexOfChainEntryToDelete].NextElementIndex; } }
public void InsertChainElement(int indexOfNewChainEntry, int number, int indexOfPreviousChainElement, T newElement) { var previousNextElement = _chain[indexOfPreviousChainElement].NextElementIndex; var previousPreviousElement = _chain[indexOfPreviousChainElement].PreviousElementIndex; _chain[indexOfNewChainEntry] = new ListChainElement { Element = newElement, NextElementIndex = previousNextElement, PreviousElementIndex = indexOfPreviousChainElement }; _chain[indexOfPreviousChainElement] = new ListChainElement { Element = _chain[indexOfPreviousChainElement].Element, NextElementIndex = indexOfNewChainEntry, PreviousElementIndex = previousPreviousElement }; if (previousNextElement == -1) { _lastChainElementOfChainNumber[number] = indexOfNewChainEntry; } else { _chain[previousNextElement] = new ListChainElement { Element = _chain[previousNextElement].Element, NextElementIndex = _chain[previousNextElement].NextElementIndex, PreviousElementIndex = indexOfNewChainEntry }; } }