Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /// Возвращаем указатель pNodeLast образущий с указателем pNodeBefore неделимую цепочку(например, a1, a2,...,an)
- /// находящуюся в диапазоне (pNodeBefore; pNodeLast]
- DNARepairer::NodeDNA* findUnbreakableChain(const DNARepairer::NodeDNA* pNodeBefore)
- {
- if(pNodeBefore->next == nullptr)
- return nullptr;
- DNARepairer::NodeDNA* pNodeLast = pNodeBefore->next;
- string id = pNodeLast->value.id;
- int number = pNodeLast->value.number;
- while (pNodeLast->next != nullptr)
- {
- if (pNodeLast->next->value.id != id || pNodeLast->next->value.number != ++number)
- return pNodeLast;
- pNodeLast = pNodeLast->next;
- }
- return pNodeLast;
- }
- /// Возвращает вершину после которой можно вставить цепочку
- DNARepairer::NodeDNA* findNodeToPlaceAfter(int number, DNARepairer::DNAChain* chain)
- {
- DNARepairer::NodeDNA* head = chain->getPreHead();
- if (head->next == nullptr) // if chain is empty return nullptr
- return head;
- while (head->next != nullptr && head->next->value.number < number)
- head = head->next;
- return head;
- }
- void DNARepairer::placeId2DnaMapToStorage(Id2DnaMap& repairedDNAMap)
- {
- _dnaStorage.deleteNodes(_dnaStorage.getPreHead(), _dnaStorage.getLastNode());
- for (auto i = ++repairedDNAMap.begin(); i != repairedDNAMap.end(); ++i)
- _dnaStorage.addElementToEnd(*i->second);
- }
- void DNARepairer::repairDNA()
- {
- // Хранилище для починенных ДНК
- Id2DnaMap repairedDNAMap = std::map<std::string, DNAChain*>();
- NodeDNAChain* pChain = _dnaStorage.getPreHead();
- // Обход цепочек ДНК
- while(pChain->next != nullptr)
- {
- pChain = pChain->next;
- NodeDNA* pNode = pChain->value.getPreHead();
- // Обход элементов цепочки
- while(pNode->next != nullptr)
- {
- // Находим недилимую цепочку (pNode; pNodeLast]
- NodeDNA* pNodeLast = findUnbreakableChain(pNode);
- // Если
- if(repairedDNAMap[pNode->next->value.id] == nullptr)
- repairedDNAMap[pNode->next->value.id] = new DNAChain();
- // Находим в repairedDNAMap место куда, можно вставить эту цепочку
- NodeDNA* pNodeToPlaceAfter = findNodeToPlaceAfter(pNode->next->value.number, repairedDNAMap[pNode->next->value.id]);
- // Вставляем
- repairedDNAMap[pNode->value.id]->moveNodesAfter(pNodeToPlaceAfter, pNode, pNodeLast);
- }
- }
- // запихиваем repairedDNAMap в DNA storage
- placeId2DnaMapToStorage(repairedDNAMap);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement