if(currentNode==NULL)//Termination condition; if the currentNode is null, then return null
{
returnNULL;
}
int*tmp;
POEMSNode*nextNode=NULL;//nextNode stores the proposed next node to add to the chain. this will be checked to make sure no backtracking is occuring before being assigned as the current node.
POEMSChain*newChain=newPOEMSChain;//make a new POEMSChain object. This will be the object returned
if(currentNode->links.GetNumElements()==0)//if we have no links from this node, then the whole chain is only one node. Add this node to the chain and return it; mark node as visited for future reference
{
currentNode->visited=true;
tmp=newint;
*tmp=currentNode->idNumber;
newChain->listOfNodes.Append(tmp);
returnnewChain;
}
while(currentNode->links.GetNumElements()<=2)//we go until we get to a node that branches, or both branches have already been taken both branches can already be taken if a loop with no spurs is found in the input data
{
currentNode->visited=true;
tmp=newint;
*tmp=currentNode->idNumber;
newChain->listOfNodes.Append(tmp);//append the current node to the chain & mark as visited
nextNode=currentNode->links.GetHeadElement()->value;//the next node is the first or second value stored in the links array
//of the current node. We get the first value...
if(!setLinkVisited(currentNode,nextNode))//...and see if it points back to where we came from. If it does...
{//either way, we set this link as visited
if(currentNode->links.GetNumElements()==1)//if it does, then if that is the only link to this node, we're done with the chain, so append the chain to the list and return the newly created chain
{
// headsOfSystems.Append(newChain);
returnnewChain;
}
nextNode=currentNode->links.GetHeadElement()->next->value;//follow the other link if there is one, so we go down the chain
if(!setLinkVisited(currentNode,nextNode))//mark link as followed, so we know not to backtrack
{
// headsOfSystems.Append(newChain);
returnnewChain;//This condition, where no branches have occurred but both links have already
//been taken can only occur in a loop with no spurs; add this loop to the
//system (currently added as a chain for consistency), and return.
}
}
currentNode=nextNode;//set the current node to be the next node in the chain
}
currentNode->visited=true;
tmp=newint;
*tmp=currentNode->idNumber;
newChain->listOfNodes.Append(tmp);//append the last node before branch (node shared jointly with branch chains)
//re-mark as visited, just to make sure
ListElement<POEMSNode>*tempNode=currentNode->links.GetHeadElement();//go through all of the links, one at a time that branch
POEMSChain*tempChain=NULL;//temporary variable to hold data
while(tempNode!=NULL)//when we have followed all links, stop
{
if(setLinkVisited(tempNode->value,currentNode))//dont backtrack, or create closed loops
{
tempChain=AddNewChain(tempNode->value);//Add a new chain created out of the next node down that link
tempChain->parentChain=newChain;//set the parent to be this chain
newChain->childChains.Append(tempChain);//append the chain to this chain's list of child chains
}
tempNode=tempNode->next;//go to process the next chain
}
//headsOfSystems.Append(newChain); //append this chain to the system list