#include "elementreduction.h" #include #include #include ElementReduction::ElementReduction(const QList &branchList):branchList(branchList) { } ElementReduction::~ElementReduction() { } void ElementReduction::doIt() { QHash > linkage; //先记录元件之间的连接关系 QHash idToBranch; foreach(BranchStruc* v,this->branchList) { idToBranch[v->id]=v; linkage[v->fromID].push_back(v); linkage[v->toID].push_back(v); } QDomDocument root; QDomElement element=root.createElement(this->branchList.at(2)->id); root.appendChild(element); this->buildTreeTo(element,root,linkage,idToBranch); this->visited.remove(this->branchList.at(2)->id); this->buildTreeFrom(element,root,linkage,idToBranch); this->merge(element,idToBranch); // QFile file("1.xml"); // if(file.open(QFile::WriteOnly)) // { //// root.setContent(&file); // QTextStream writer(&file); // root.save(writer,4); // file.close(); // } //看看是不是每个都访问到了 foreach(BranchStruc* v,this->branchList) { if(!this->visited.contains(v->id)) { std::cout<<"unvisited "<id.toStdString()<& idToBranch) { return; QString parentID=idToBranch[element.tagName()]->id; QStringList sep=parentID.split('-'); QString toID=sep.at(1)+sep.at(0); idToBranch[element.tagName()]->toID=toID; element.setAttribute("toID",toID); //顺便编号 //采用广度优先 bool merged=true; while(merged) { merged=false; QDomNodeList list=element.childNodes(); int length=list.length(); for(int i=0;ifromID=toID; node.setAttribute("fromID",toID); if(branch->isZeroBranch) { branch->dispose=true; while(node.childNodes().length()>0) { std::cout<<"append "<merge((QDomElement &)node,idToBranch); } } void ElementReduction::buildTreeTo(QDomElement &element,QDomDocument &root,QHash >& linkage,QHash& idToBranch) { QString id=element.tagName(); if(this->visited.contains(id)) { // std::cout<<"visited "<id.toStdString()<visited[id]=0; BranchStruc * branch=idToBranch[id]; QString nextTo; nextTo=branch->toID; QVector nextVec; nextVec=linkage[nextTo]; foreach(BranchStruc *n,nextVec) { if(this->visited.contains(n->id)) { continue; } // std::cout<<"add "<id.toStdString()<id); // std::cout<<"create "<id.toStdString()<buildTreeTo(newEle,root,linkage,idToBranch); } } void ElementReduction::buildTreeFrom(QDomElement &element,QDomDocument &root,QHash >& linkage,QHash& idToBranch) { QString id=element.tagName(); if(this->visited.contains(id)) { std::cout<<"visited "<visited[id]=0; BranchStruc * branch=idToBranch[id]; QString nextFrom=branch->fromID; QVector nextFromVec; nextFromVec=linkage[nextFrom]; foreach(BranchStruc *n,nextFromVec) { if(this->visited.contains(n->id)) { continue; } // std::cout<<"add "<id.toStdString()<id); // std::cout<<"create "<id.toStdString()<buildTreeFrom(newEle,root,linkage,idToBranch); } }