Grafalgo
Library of useful data structures and algorithms
|
00001 00008 #include "ClistSet.h" 00009 00010 namespace grafalgo { 00011 00015 ClistSet::ClistSet(int n1) : Adt(n1) { makeSpace(n()); } 00016 00018 ClistSet::~ClistSet() { freeSpace(); } 00019 00023 void ClistSet::makeSpace(int size) { 00024 try { node = new lnode[size+1]; } catch (std::bad_alloc e) { 00025 stringstream ss; 00026 ss << "ClistSet::makeSpace: insufficient space for " 00027 << size << "index values"; 00028 string s = ss.str(); 00029 throw OutOfSpaceException(s); 00030 } 00031 nn = size; clear(); 00032 } 00033 00035 void ClistSet::freeSpace() { delete [] node; } 00036 00041 void ClistSet::resize(int size) { 00042 freeSpace(); 00043 try { makeSpace(size); } catch(OutOfSpaceException e) { 00044 string s; s = "ClistSet::resize:" + e.toString(s); 00045 throw OutOfSpaceException(s); 00046 } 00047 } 00048 00053 void ClistSet::expand(int size) { 00054 if (size <= n()) return; 00055 ClistSet old(this->n()); old.copyFrom(*this); 00056 resize(size); this->copyFrom(old); 00057 } 00058 00061 void ClistSet::clear() { 00062 for (index i = 0; i <= n(); i++) { 00063 node[i].next = node[i].prev = i; 00064 } 00065 } 00066 00068 void ClistSet::copyFrom(const ClistSet& source) { 00069 if (&source == this) return; 00070 if (source.n() > n()) resize(source.n()); 00071 else clear(); 00072 for (index x = 0; x <= source.n(); x++) { 00073 node[x].next = source.suc(x); 00074 node[x].prev = source.pred(x); 00075 } 00076 } 00077 00082 void ClistSet::remove(index i) { 00083 assert(0 <= i && i <= n()); 00084 node[node[i].prev].next = node[i].next; 00085 node[node[i].next].prev = node[i].prev; 00086 node[i].next = node[i].prev = i; 00087 } 00088 00089 00097 void ClistSet::join(index i, index j) { 00098 assert(0 <= i && i <= n() && 0 <= j && j <= n()); 00099 if (i == 0 || j == 0) return; 00100 node[node[i].next].prev = node[j].prev; 00101 node[node[j].prev].next = node[i].next; 00102 node[i].next = j; node[j].prev = i; 00103 } 00104 00109 string& ClistSet::toString(string& s) const { 00110 index i, j; string s1; 00111 int *mark = new int[n()+1]; 00112 s = "{"; 00113 int cnt = 0; 00114 for (i = 1; i <= n(); i++) mark[i] = 0; 00115 for (i = 1; i <= n(); i++) { 00116 if (mark[i]) continue; 00117 mark[i] = 1; 00118 if (node[i].next == i) continue; 00119 if (++cnt > 1) s += ", "; 00120 s += "["; 00121 s += Adt::item2string(i,s1); 00122 for (j = node[i].next; j != i; j = node[j].next) { 00123 mark[j] = 1; 00124 s += " "; 00125 s += Adt::item2string(j,s1); 00126 } 00127 s += "]"; 00128 } 00129 s += "}"; 00130 delete [] mark; 00131 return s; 00132 } 00133 00134 } // ends namespace