Skip to content

Commit 6aca214

Browse files
committed
Made clonegraph to c++ 0x11
1 parent ef4f33e commit 6aca214

File tree

1 file changed

+48
-7
lines changed

1 file changed

+48
-7
lines changed

clonegraph/clonegraph.cpp

Lines changed: 48 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,61 @@
1+
// Copyright (C) 2013 Leslie Zhai <[email protected]>
2+
13
#include <iostream>
24
#include <vector>
35
#include <unordered_map>
46
#include <queue>
57

6-
class Node;
8+
template<typename T> class graph_node;
79

10+
typedef graph_node<int> Node;
811
typedef std::unordered_map<Node*, Node*> Map;
12+
typedef std::unordered_map<Node*, Node*>::iterator MapIter;
913

10-
class Node
14+
template<typename T> class graph_node
1115
{
1216
public:
13-
Node() {}
14-
~Node() {}
17+
graph_node() {}
18+
graph_node(T data) :m_data(data) {}
19+
~graph_node() {}
1520

1621
public:
17-
std::vector<Node*> neighbors;
22+
std::vector<graph_node<T>*> neighbors;
23+
T get_data() { return m_data; }
24+
25+
private:
26+
T m_data;
1827
};
1928

20-
static Node* graphCopy;
29+
static Node* graphCopy = NULL;
2130
static Map map;
2231

23-
static void m_cleanup(Node* clone)
32+
static void m_cleanup()
2433
{
34+
MapIter iter;
35+
int i;
36+
37+
for (iter = map.begin(); iter != map.end(); iter++)
38+
{
39+
for (i = 0; i < (*iter).second->neighbors.size(); i++)
40+
{
41+
delete (*iter).second->neighbors[i];
42+
(*iter).second->neighbors[i] = NULL;
43+
}
44+
}
2545

46+
if (graphCopy)
47+
{
48+
delete graphCopy;
49+
graphCopy = NULL;
50+
}
2651
}
2752

2853
Node* clone(Node* graph)
2954
{
3055
if (!graph)
3156
return NULL;
57+
else
58+
std::cout << "DEBUG: origin graph node " << graph->get_data() << std::endl;
3259

3360
std::queue<Node*> q;
3461
q.push(graph);
@@ -44,17 +71,20 @@ Node* clone(Node* graph)
4471
for (int i = 0; i < n; i++)
4572
{
4673
Node* neighbor = node->neighbors[i];
74+
std::cout << "DEBUG: neighbor " << neighbor->get_data() << std::endl;
4775
// 没有该副本
4876
if (map.find(neighbor) == map.end())
4977
{
5078
Node* p = new Node();
79+
std::cout << "DEBUG: new clone" << std::endl;
5180
map[node]->neighbors.push_back(p);
5281
map[neighbor] = p;
5382
q.push(neighbor);
5483
}
5584
else
5685
{
5786
// 副本已经存在
87+
std::cout << "DEBUG: cloned exist " << map[neighbor]->get_data() << std::endl;
5888
map[node]->neighbors.push_back(map[neighbor]);
5989
}
6090
}
@@ -65,5 +95,16 @@ Node* clone(Node* graph)
6595

6696
int main(int argc, char* argv[])
6797
{
98+
Node* n1 = new Node(1);
99+
Node* n2 = new Node(2);
100+
Node* n3 = new Node(3);
101+
102+
n1->neighbors.push_back(n2);
103+
n1->neighbors.push_back(n3);
104+
105+
clone(n1);
106+
107+
m_cleanup();
108+
68109
return 0;
69110
}

0 commit comments

Comments
 (0)