<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=%EB%AA%B8%EC%A7%B1%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%2FCrossReference</id>
	<title>몸짱프로젝트/CrossReference - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=%EB%AA%B8%EC%A7%B1%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%2FCrossReference"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=%EB%AA%B8%EC%A7%B1%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8/CrossReference&amp;action=history"/>
	<updated>2026-05-14T23:44:33Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=%EB%AA%B8%EC%A7%B1%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8/CrossReference&amp;diff=50469&amp;oldid=prev</id>
		<title>imported&gt;Unknown at 05:29, 7 February 2021</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=%EB%AA%B8%EC%A7%B1%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8/CrossReference&amp;diff=50469&amp;oldid=prev"/>
		<updated>2021-02-07T05:29:28Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| __TOC__&lt;br /&gt;
|}&lt;br /&gt;
== Python version ==&lt;br /&gt;
* 개발자 : 나휘동&lt;br /&gt;
* 개발방식 : TestDrivenDevelopment&lt;br /&gt;
 import copy&lt;br /&gt;
 import string&lt;br /&gt;
 &lt;br /&gt;
 class CrossReference:&lt;br /&gt;
 ##    def __init__(self, aRoot):&lt;br /&gt;
 ##        self.root = aRoot&lt;br /&gt;
 ##    def find(self, aRoot, aWord):&lt;br /&gt;
 ##        if aRoot.getWord() == aWord:&lt;br /&gt;
 ##            return True&lt;br /&gt;
 ##        elif string.lower(aRoot.getWord()) &amp;amp;gt; aWord and aRoot.left != None:&lt;br /&gt;
 ##            return self.find(aRoot.left, aWord)&lt;br /&gt;
 ##        elif string.lower(aRoot.getWord()) &amp;amp;lt; aWord and aRoot.right != None:&lt;br /&gt;
 ##            return self.find(aRoot.right, aWord)&lt;br /&gt;
 ##        return False&lt;br /&gt;
 &lt;br /&gt;
     def getNode(self, aRoot, aWord):&lt;br /&gt;
         if  aRoot.getWord() == &amp;#039;&amp;#039; or aRoot.getWord() == aWord:&lt;br /&gt;
             return aRoot&lt;br /&gt;
         &lt;br /&gt;
         if aRoot.left == None:&lt;br /&gt;
             aRoot.left = Node(&amp;#039;&amp;#039;)&lt;br /&gt;
             return aRoot.left&lt;br /&gt;
         elif string.lower(aRoot.getWord()) &amp;amp;gt; aWord:&lt;br /&gt;
             return self.getNode(aRoot.left, aWord)&lt;br /&gt;
         &lt;br /&gt;
         if aRoot.right == None:&lt;br /&gt;
             aRoot.right = Node(&amp;#039;&amp;#039;)&lt;br /&gt;
             return aRoot.right&lt;br /&gt;
         elif string.lower(aRoot.getWord()) &amp;amp;lt; aWord:&lt;br /&gt;
             return self.getNode(aRoot.right, aWord)&lt;br /&gt;
         &lt;br /&gt;
     def setNode(self, aRoot, aWord, aLine = &amp;#039;1&amp;#039;):&lt;br /&gt;
         node = self.getNode(aRoot, aWord)&lt;br /&gt;
         if node == None:&lt;br /&gt;
             node = Node(aWord)&lt;br /&gt;
         else:&lt;br /&gt;
             node.setWord(aWord)&lt;br /&gt;
         node.increaseCount()&lt;br /&gt;
         node.addLines(aLine)&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
     def run(self):&lt;br /&gt;
         sentence =\&lt;br /&gt;
         &amp;#039;&amp;#039;&amp;#039;Twas brilling and the slithy toves did gtre and gimble in the wabe&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
         wordList = sentence.split(&amp;#039; &amp;#039;)&lt;br /&gt;
         root = Node(&amp;#039;&amp;#039;)&lt;br /&gt;
         for l in wordList:&lt;br /&gt;
             self.setNode(root, l)&lt;br /&gt;
 &lt;br /&gt;
         print &amp;#039;Word\t\tCount\t\tLines&amp;#039;&lt;br /&gt;
         self.inorder(root)&lt;br /&gt;
 &lt;br /&gt;
     def inorder(self, aRoot):&lt;br /&gt;
 ##        print &amp;#039;start&amp;#039;&lt;br /&gt;
         if aRoot.left != None:&lt;br /&gt;
 ##            print &amp;#039;left&amp;#039;&lt;br /&gt;
             self.inorder(aRoot.left)&lt;br /&gt;
         if aRoot.word != &amp;#039;&amp;#039;:&lt;br /&gt;
 ##            print &amp;#039;root&amp;#039;&lt;br /&gt;
             aRoot.show()&lt;br /&gt;
         if aRoot.right != None:&lt;br /&gt;
 ##            print &amp;#039;right&amp;#039;&lt;br /&gt;
             self.inorder(aRoot.right)&lt;br /&gt;
         &lt;br /&gt;
 class Node:&lt;br /&gt;
     def __init__(self, aWord = &amp;#039;&amp;#039;):&lt;br /&gt;
         self.setWord(aWord)&lt;br /&gt;
         self.left = None&lt;br /&gt;
         self.right = None&lt;br /&gt;
 &lt;br /&gt;
         self.count = 0&lt;br /&gt;
         self.lines = &amp;#039;&amp;#039;&lt;br /&gt;
     def setWord(self, aWord):&lt;br /&gt;
         self.word = aWord&lt;br /&gt;
     def increaseCount(self):&lt;br /&gt;
         self.count += 1&lt;br /&gt;
     def addLines(self, aLine):&lt;br /&gt;
         self.lines += aLine + &amp;#039; &amp;#039;&lt;br /&gt;
     def setLeftChild(self, aWord):&lt;br /&gt;
         self.left = Node(aWord)&lt;br /&gt;
     def setRightChild(self, aWord):&lt;br /&gt;
         self.right = Node(aWord)&lt;br /&gt;
     def getWord(self):&lt;br /&gt;
         return self.word&lt;br /&gt;
     def show(self):&lt;br /&gt;
         print self.getWord() + &amp;#039;\t\t&amp;#039; + str(self.count) + &amp;#039;\t\t&amp;#039; + self.lines&lt;br /&gt;
 #########################################################################&lt;br /&gt;
             &lt;br /&gt;
 import unittest&lt;br /&gt;
 &lt;br /&gt;
 class CrossReferenceTestCase(unittest.TestCase):&lt;br /&gt;
 ##    def testFind(self):&lt;br /&gt;
 ##        t = Node(&amp;#039;&amp;#039;)&lt;br /&gt;
 ##        t.setWord(&amp;#039;Twas&amp;#039;)&lt;br /&gt;
 ##        t.setLeftChild(&amp;#039;brilling&amp;#039;)&lt;br /&gt;
 ##        t.setRightChild(&amp;#039;wabe&amp;#039;)&lt;br /&gt;
 ##&lt;br /&gt;
 ##        c = CrossReference()&lt;br /&gt;
 ##        self.assertEqual(c.find(t, &amp;#039;Twas&amp;#039;), True)&lt;br /&gt;
 ##        self.assertEqual(c.find(t, &amp;#039;brilling&amp;#039;), True)&lt;br /&gt;
 ##        self.assertEqual(c.find(t, &amp;#039;wabe&amp;#039;), True)&lt;br /&gt;
 ##        self.assertEqual(c.find(t, &amp;#039;and&amp;#039;), False)&lt;br /&gt;
 ##&lt;br /&gt;
 ##        t.left.setLeftChild(&amp;#039;and&amp;#039;)&lt;br /&gt;
 ##        self.assertEqual(c.find(t, &amp;#039;and&amp;#039;), True)&lt;br /&gt;
 &lt;br /&gt;
     def testGetNode(self):&lt;br /&gt;
         t = Node()&lt;br /&gt;
         t.setWord(&amp;#039;Twas&amp;#039;)&lt;br /&gt;
         t.setLeftChild(&amp;#039;brilling&amp;#039;)&lt;br /&gt;
         t.setRightChild(&amp;#039;wabe&amp;#039;)&lt;br /&gt;
 &lt;br /&gt;
         c = CrossReference()&lt;br /&gt;
 &lt;br /&gt;
         self.assertEqual(c.getNode(t, &amp;#039;Twas&amp;#039;).getWord(), &amp;#039;Twas&amp;#039;)&lt;br /&gt;
         self.assertEqual(c.getNode(t, &amp;#039;brilling&amp;#039;).getWord(), &amp;#039;brilling&amp;#039;)&lt;br /&gt;
         self.assertEqual(c.getNode(t, &amp;#039;wabe&amp;#039;).getWord(), &amp;#039;wabe&amp;#039;)&lt;br /&gt;
         self.assertEqual(c.getNode(t, &amp;#039;and&amp;#039;).getWord(), &amp;#039;&amp;#039;)&lt;br /&gt;
 &lt;br /&gt;
         t.left.setLeftChild(&amp;#039;and&amp;#039;)&lt;br /&gt;
         self.assertEqual(c.getNode(t, &amp;#039;and&amp;#039;).getWord(), &amp;#039;and&amp;#039;)&lt;br /&gt;
 &lt;br /&gt;
     def testSetNode(self):&lt;br /&gt;
         t = Node()&lt;br /&gt;
         c = CrossReference()&lt;br /&gt;
         c.setNode(t, &amp;#039;Twas&amp;#039;)&lt;br /&gt;
         self.assertEqual(c.getNode(t, &amp;#039;Twas&amp;#039;).getWord(), &amp;#039;Twas&amp;#039;)&lt;br /&gt;
         c.setNode(t, &amp;#039;brilling&amp;#039;)&lt;br /&gt;
         self.assertEqual(c.getNode(t, &amp;#039;brilling&amp;#039;).getWord(), &amp;#039;brilling&amp;#039;)&lt;br /&gt;
         c.setNode(t, &amp;#039;wabe&amp;#039;)&lt;br /&gt;
         self.assertEqual(c.getNode(t, &amp;#039;wabe&amp;#039;).getWord(), &amp;#039;wabe&amp;#039;)&lt;br /&gt;
 &lt;br /&gt;
         c.setNode(t, &amp;#039;and&amp;#039;)&lt;br /&gt;
 &lt;br /&gt;
         self.assertEqual(c.getNode(t, &amp;#039;and&amp;#039;).getWord(), &amp;#039;and&amp;#039;)&lt;br /&gt;
         self.assertEqual(c.getNode(t, &amp;#039;and&amp;#039;).count, 1)&lt;br /&gt;
         self.assertEqual(c.getNode(t, &amp;#039;and&amp;#039;).lines, &amp;#039;1 &amp;#039;)        &lt;br /&gt;
 &lt;br /&gt;
 if __name__ == &amp;#039;__main__&amp;#039;: &lt;br /&gt;
     unittest.main()   &lt;br /&gt;
     c = CrossReference()&lt;br /&gt;
     c.run()&lt;br /&gt;
 &lt;br /&gt;
 ##    t = Node()&lt;br /&gt;
 ##    c = CrossReference()&lt;br /&gt;
 ##    c.setNode(t, &amp;#039;Twas&amp;#039;)&lt;br /&gt;
 ##    c.setNode(t, &amp;#039;brilling&amp;#039;)&lt;br /&gt;
 ##    c.setNode(t, &amp;#039;wabe&amp;#039;)&lt;br /&gt;
 ##    c.setNode(t, &amp;#039;and&amp;#039;)&lt;br /&gt;
 ##&lt;br /&gt;
 ##    c.inorder(t)&lt;br /&gt;
&lt;br /&gt;
== C++ version ==&lt;br /&gt;
=== [[황재선]] ===&lt;br /&gt;
* 불필요한 부분 리펙토링 하는 중&lt;br /&gt;
* 배열 변수 제거. string과 동적 할당 이용.&lt;br /&gt;
 #include &amp;amp;lt;fstream&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;iostream&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
 using namespace std;&lt;br /&gt;
 &lt;br /&gt;
 struct Line&lt;br /&gt;
 {&lt;br /&gt;
 	int row;&lt;br /&gt;
 	Line * next;&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct Node&lt;br /&gt;
 {&lt;br /&gt;
 	Node * left;&lt;br /&gt;
 	string word;&lt;br /&gt;
 	int wordCount;&lt;br /&gt;
 	Line * line;&lt;br /&gt;
 	Node * right;&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 void makeRootNode(Node * aRoot, string aWord);&lt;br /&gt;
 void initNode(Node * aNewNode);&lt;br /&gt;
 Node * setNode(Node * ptr, string aWord, int aLineCount);&lt;br /&gt;
 void insertToNode(Node * ptr, string aWord, int aLineCount);&lt;br /&gt;
 void duplicatedWord(Node * ptr, string aWord, int aLineCount);&lt;br /&gt;
 void inorder(Node * aRoot);&lt;br /&gt;
 void printResult(Node * aRoot);&lt;br /&gt;
 void freeMem(Node * aRoot);&lt;br /&gt;
 &lt;br /&gt;
 int count = 0;&lt;br /&gt;
 &lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
 	Node * root = new Node;&lt;br /&gt;
 &lt;br /&gt;
 	ifstream fin(&amp;quot;lincoln.txt&amp;quot;);&lt;br /&gt;
 	char word[150];&lt;br /&gt;
 	&lt;br /&gt;
 	char split[] = &amp;quot; ,.;-&amp;quot;;&lt;br /&gt;
 	char * p;&lt;br /&gt;
 	int lineCount = 1;&lt;br /&gt;
 	int start = true;&lt;br /&gt;
 	while(!fin.eof())&lt;br /&gt;
 	{&lt;br /&gt;
 		fin.getline(word, 150, &amp;#039;\n&amp;#039;);&lt;br /&gt;
 		if(!strcmp(word, &amp;quot;&amp;quot;))&lt;br /&gt;
 			continue;&lt;br /&gt;
 		strlwr(word);&lt;br /&gt;
 		p = strtok(word, split);&lt;br /&gt;
 		strcpy(word, p);					&lt;br /&gt;
 		if (start)&lt;br /&gt;
 		{&lt;br /&gt;
 			makeRootNode(root, word);&lt;br /&gt;
 			start = false;&lt;br /&gt;
 		}&lt;br /&gt;
 		else&lt;br /&gt;
 			insertToNode(root, word, lineCount);&lt;br /&gt;
 &lt;br /&gt;
 		while(p != NULL)&lt;br /&gt;
 		{&lt;br /&gt;
 			p = strtok(NULL, split);&lt;br /&gt;
 			if (p)&lt;br /&gt;
 			{&lt;br /&gt;
 				strcpy(word, p);&lt;br /&gt;
 				insertToNode(root, word, lineCount);&lt;br /&gt;
 			}&lt;br /&gt;
 		}&lt;br /&gt;
 		lineCount++;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	cout &amp;amp;lt;&amp;amp;lt; &amp;quot;WORD\t\tCOUNT\t\tLINES&amp;quot; &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
 	inorder(root);&lt;br /&gt;
 	cout &amp;amp;lt;&amp;amp;lt; &amp;quot;TOTAL\t\t&amp;quot; &amp;amp;lt;&amp;amp;lt; count &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
 &lt;br /&gt;
 	freeMem(root);&lt;br /&gt;
 &lt;br /&gt;
 	fin.close();&lt;br /&gt;
 &lt;br /&gt;
 	return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void insertToNode(Node * ptr, string aWord, int aLineCount)&lt;br /&gt;
 {&lt;br /&gt;
 	bool isDuplicated = false;&lt;br /&gt;
 	&lt;br /&gt;
 	while(true)&lt;br /&gt;
 	{&lt;br /&gt;
 		if (ptr-&amp;amp;gt;word == aWord)&lt;br /&gt;
 		{&lt;br /&gt;
 			duplicatedWord(ptr, aWord, aLineCount);&lt;br /&gt;
 			isDuplicated = true;&lt;br /&gt;
 			break;&lt;br /&gt;
 		}&lt;br /&gt;
 		else if (ptr-&amp;amp;gt;word &amp;amp;gt; aWord)&lt;br /&gt;
 		{&lt;br /&gt;
 			if (ptr-&amp;amp;gt;left != NULL)&lt;br /&gt;
 				ptr = ptr-&amp;amp;gt;left;			&lt;br /&gt;
 			else&lt;br /&gt;
 				break;&lt;br /&gt;
 		}&lt;br /&gt;
 		else if (ptr-&amp;amp;gt;word &amp;amp;lt; aWord)&lt;br /&gt;
 		{&lt;br /&gt;
 			if (ptr-&amp;amp;gt;right != NULL)&lt;br /&gt;
 				ptr = ptr-&amp;amp;gt;right;&lt;br /&gt;
 			else&lt;br /&gt;
 				break;&lt;br /&gt;
 		}	&lt;br /&gt;
 	}&lt;br /&gt;
 				&lt;br /&gt;
 	if (!isDuplicated)&lt;br /&gt;
 	{&lt;br /&gt;
 		if (aWord &amp;amp;lt; ptr-&amp;amp;gt;word)&lt;br /&gt;
 			ptr-&amp;amp;gt;left = setNode(ptr, aWord, aLineCount);&lt;br /&gt;
 		else if (aWord &amp;amp;gt; ptr-&amp;amp;gt;word)&lt;br /&gt;
 			ptr-&amp;amp;gt;right = setNode(ptr, aWord, aLineCount);&lt;br /&gt;
 	}	&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void initNode(Node * aNewNode)&lt;br /&gt;
 {&lt;br /&gt;
 	aNewNode-&amp;amp;gt;left = NULL;&lt;br /&gt;
 	aNewNode-&amp;amp;gt;word = &amp;quot;&amp;quot;;&lt;br /&gt;
 	aNewNode-&amp;amp;gt;wordCount = 0;&lt;br /&gt;
 &lt;br /&gt;
 	Line * lp = new Line();&lt;br /&gt;
 	lp-&amp;amp;gt;row = 0;&lt;br /&gt;
 	lp-&amp;amp;gt;next = NULL;&lt;br /&gt;
 &lt;br /&gt;
 	aNewNode-&amp;amp;gt;line = lp;&lt;br /&gt;
 &lt;br /&gt;
 	aNewNode-&amp;amp;gt;right = NULL;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 void makeRootNode(Node * aRoot, string aWord)&lt;br /&gt;
 {&lt;br /&gt;
 	initNode(aRoot);&lt;br /&gt;
 	&lt;br /&gt;
 	aRoot-&amp;amp;gt;word = aWord;&lt;br /&gt;
 	aRoot-&amp;amp;gt;wordCount++;&lt;br /&gt;
 	aRoot-&amp;amp;gt;line-&amp;amp;gt;row = 1;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 Node * setNode(Node * ptr, string aWord, int aLineCount)&lt;br /&gt;
 {&lt;br /&gt;
 	Node * newNode = new Node;&lt;br /&gt;
 	initNode(newNode);&lt;br /&gt;
 &lt;br /&gt;
 	newNode-&amp;amp;gt;word = aWord;&lt;br /&gt;
 	newNode-&amp;amp;gt;wordCount++;&lt;br /&gt;
 &lt;br /&gt;
 	newNode-&amp;amp;gt;line-&amp;amp;gt;row = aLineCount;&lt;br /&gt;
 &lt;br /&gt;
 	return newNode;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void duplicatedWord(Node * ptr, string aWord, int aLineCount)&lt;br /&gt;
 {&lt;br /&gt;
 	ptr-&amp;amp;gt;wordCount++;&lt;br /&gt;
 	Line * temp = ptr-&amp;amp;gt;line;&lt;br /&gt;
 &lt;br /&gt;
 	while (temp-&amp;amp;gt;next != NULL)&lt;br /&gt;
 		temp = temp-&amp;amp;gt;next;&lt;br /&gt;
 	Line * lp = new Line();&lt;br /&gt;
 	lp-&amp;amp;gt;row = aLineCount;&lt;br /&gt;
 	lp-&amp;amp;gt;next = NULL;&lt;br /&gt;
 	temp-&amp;amp;gt;next = lp;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void inorder(Node * aRoot)&lt;br /&gt;
 {	&lt;br /&gt;
 	if(aRoot)&lt;br /&gt;
 	{&lt;br /&gt;
 		inorder(aRoot-&amp;amp;gt;left);&lt;br /&gt;
 		printResult(aRoot);&lt;br /&gt;
 		inorder(aRoot-&amp;amp;gt;right);&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void printResult(Node * aRoot)&lt;br /&gt;
 {&lt;br /&gt;
 	count++;&lt;br /&gt;
 	cout.setf(ios_base::left, ios_base::adjustfield);&lt;br /&gt;
 	cout.width(18);&lt;br /&gt;
 	cout &amp;amp;lt;&amp;amp;lt; aRoot-&amp;amp;gt;word;&lt;br /&gt;
 	cout &amp;amp;lt;&amp;amp;lt; aRoot-&amp;amp;gt;wordCount &amp;amp;lt;&amp;amp;lt; &amp;quot;\t\t&amp;quot;;&lt;br /&gt;
 	cout.width(3);&lt;br /&gt;
 &lt;br /&gt;
 	while (aRoot-&amp;amp;gt;line-&amp;amp;gt;next != NULL)&lt;br /&gt;
 	{&lt;br /&gt;
 		cout.width(3);&lt;br /&gt;
 		cout &amp;amp;lt;&amp;amp;lt; aRoot-&amp;amp;gt;line-&amp;amp;gt;row;&lt;br /&gt;
 		aRoot-&amp;amp;gt;line = aRoot-&amp;amp;gt;line-&amp;amp;gt;next;&lt;br /&gt;
 	}&lt;br /&gt;
 	cout.width(3);&lt;br /&gt;
 	cout &amp;amp;lt;&amp;amp;lt; aRoot-&amp;amp;gt;line-&amp;amp;gt;row;&lt;br /&gt;
 	&lt;br /&gt;
 	cout &amp;amp;lt;&amp;amp;lt; &amp;quot;\n&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void freeMem(Node * aRoot)&lt;br /&gt;
 {&lt;br /&gt;
 &lt;br /&gt;
 	if (aRoot)&lt;br /&gt;
 	{&lt;br /&gt;
 		freeMem(aRoot-&amp;amp;gt;left);&lt;br /&gt;
 		freeMem(aRoot-&amp;amp;gt;right);&lt;br /&gt;
 		Line * temp = aRoot-&amp;amp;gt;line;&lt;br /&gt;
 		while (temp-&amp;amp;gt;next != NULL)&lt;br /&gt;
 		{&lt;br /&gt;
 			temp = aRoot-&amp;amp;gt;line-&amp;amp;gt;next;&lt;br /&gt;
 			delete aRoot-&amp;amp;gt;line;&lt;br /&gt;
 			aRoot-&amp;amp;gt;line = temp;&lt;br /&gt;
 		}&lt;br /&gt;
 		delete aRoot-&amp;amp;gt;line;&lt;br /&gt;
 		delete aRoot;&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
=== 나휘동 ===&lt;br /&gt;
* 파이선 코드를 바탕으로 짜려고 했으나, 완전히 다르게 되어버려 시간이 더 오래걸렸다.&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;amp;lt;iostream&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;fstream&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;cctype&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
 using namespace std;&lt;br /&gt;
 &lt;br /&gt;
 // Binary Tree를 구성하는 노드&lt;br /&gt;
 #define Node_ptr struct Node *&lt;br /&gt;
 &lt;br /&gt;
 struct Node{&lt;br /&gt;
 string word;// 노드에 들어있는 값&lt;br /&gt;
 int count;&lt;br /&gt;
 string lines;&lt;br /&gt;
 &lt;br /&gt;
 Node_ptr  left;// Left Child&lt;br /&gt;
 Node_ptr right;// Right Child&lt;br /&gt;
 };&lt;br /&gt;
 /////////////////////////////////////////////////////&lt;br /&gt;
 &lt;br /&gt;
 // Cross Reference를 작성하기 위한 함수&lt;br /&gt;
 string toString(int aNum);&lt;br /&gt;
 &lt;br /&gt;
 Node_ptr * getNode( Node_ptr * aRoot, char aWord[]);&lt;br /&gt;
 void setNode( Node_ptr * aRoot, char aWord[], int aLine = 1);&lt;br /&gt;
 &lt;br /&gt;
 void show(ostream &amp;amp;amp; aOs, Node_ptr aNode);&lt;br /&gt;
 void inorderTravel(ostream &amp;amp;amp; aOs, Node_ptr aRoot);&lt;br /&gt;
 void showAll(ostream &amp;amp;amp; aOs, Node_ptr aRoot);&lt;br /&gt;
 &lt;br /&gt;
 void deleteAllNode( Node_ptr aRoot );&lt;br /&gt;
 /////////////////////////////////////////////////////&lt;br /&gt;
 &lt;br /&gt;
 int num_of_node = 0;&lt;br /&gt;
 &lt;br /&gt;
 void main()&lt;br /&gt;
 {&lt;br /&gt;
 int line = 1;&lt;br /&gt;
 const int MAX_LEN = 20;&lt;br /&gt;
 char word[MAX_LEN];&lt;br /&gt;
 Node_ptr root = NULL;&lt;br /&gt;
 &lt;br /&gt;
 ifstream fin(&amp;quot;lincoln.txt&amp;quot;);&lt;br /&gt;
 char ch = fin.get();&lt;br /&gt;
 &lt;br /&gt;
 while(!fin.eof()){&lt;br /&gt;
 &lt;br /&gt;
 while ( ch == &amp;#039;\n&amp;#039; ){&lt;br /&gt;
 line++;&lt;br /&gt;
 do&lt;br /&gt;
 ch = fin.get();&lt;br /&gt;
 while ( ch == &amp;#039;\n&amp;#039; );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 if ( isalpha(ch) ){&lt;br /&gt;
 for ( int i = 0 ; isalpha(ch) ; i++){&lt;br /&gt;
 word[i] = (char)tolower(ch);&lt;br /&gt;
 ch = fin.get();&lt;br /&gt;
 }&lt;br /&gt;
 word[i] = &amp;#039;\0&amp;#039;;&lt;br /&gt;
 &lt;br /&gt;
 setNode(&amp;amp;amp;root, word, line);&lt;br /&gt;
 }&lt;br /&gt;
 else if ( isspace(ch) || ispunct(ch) == 16)  // 공백이거나 &lt;br /&gt;
 ch = fin.get();// 알파벳이 아닌 문자일 경우&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
 fin.close();&lt;br /&gt;
 &lt;br /&gt;
 //ofstream fout(&amp;quot;result.txt&amp;quot;, ios::app); // result.txt 라는 파일에 출력하는 경우&lt;br /&gt;
 //showAll(fout, root);&lt;br /&gt;
 //fout.close();&lt;br /&gt;
 &lt;br /&gt;
 showAll(cout, root);&lt;br /&gt;
 deleteAllNode(root);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 Node_ptr * getNode( Node_ptr * aRoot, char aWord[])&lt;br /&gt;
 {&lt;br /&gt;
     if ((*aRoot) == NULL ||  (*aRoot)-&amp;amp;gt;word == aWord )&lt;br /&gt;
         return aRoot;&lt;br /&gt;
 &lt;br /&gt;
 // 루트에 있는 단어보다 새로 들어온 단어가 작으면&lt;br /&gt;
 // 왼쪽 서브트리와 다시 비교한다.&lt;br /&gt;
     else if ( (*aRoot)-&amp;amp;gt;word &amp;amp;gt; aWord)&lt;br /&gt;
         return getNode(&amp;amp;amp;(*aRoot)-&amp;amp;gt;left, aWord);&lt;br /&gt;
 &lt;br /&gt;
 // 루트에 있는 단어보다 새로 들어온 단어가 크면&lt;br /&gt;
 // 오른쪽 서브트리와 다시 비교한다.&lt;br /&gt;
     else if ( (*aRoot)-&amp;amp;gt;word &amp;amp;lt; aWord )&lt;br /&gt;
 return getNode(&amp;amp;amp;(*aRoot)-&amp;amp;gt;right, aWord);&lt;br /&gt;
     return aRoot;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void setNode( Node_ptr * aRoot, char aWord[], int aLine )&lt;br /&gt;
 {&lt;br /&gt;
 // 단어를 집어넣을 노드를 가져온다.&lt;br /&gt;
 Node_ptr * node = getNode(aRoot, aWord);&lt;br /&gt;
 &lt;br /&gt;
 if ((*node) == NULL){// 빈 노드일 경우&lt;br /&gt;
 (*node) = new Node;// 노드를 새로 만들고&lt;br /&gt;
 (*node)-&amp;amp;gt;left = NULL;// child 노드를 NULL로 초기화한다.&lt;br /&gt;
 (*node)-&amp;amp;gt;right = NULL;&lt;br /&gt;
 &lt;br /&gt;
 (*node)-&amp;amp;gt;word = aWord;// 노드에 값을 넣는다.&lt;br /&gt;
 (*node)-&amp;amp;gt;count = 1;&lt;br /&gt;
 (*node)-&amp;amp;gt;lines = toString(aLine);&lt;br /&gt;
 }&lt;br /&gt;
 else{&lt;br /&gt;
 (*node)-&amp;amp;gt;count++;&lt;br /&gt;
 (*node)-&amp;amp;gt;lines += &amp;quot; &amp;quot;;&lt;br /&gt;
 (*node)-&amp;amp;gt;lines += toString(aLine);&lt;br /&gt;
 }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void inorderTravel(ostream &amp;amp;amp; aOs, Node_ptr aRoot)&lt;br /&gt;
 {&lt;br /&gt;
     if ( aRoot-&amp;amp;gt;left != NULL )&lt;br /&gt;
 inorderTravel(aOs, aRoot-&amp;amp;gt;left);&lt;br /&gt;
 &lt;br /&gt;
     if ( aRoot-&amp;amp;gt;count != 0 ){&lt;br /&gt;
 show(aOs, aRoot);&lt;br /&gt;
 num_of_node++;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
     if ( aRoot-&amp;amp;gt;right != NULL )&lt;br /&gt;
         inorderTravel(aOs, aRoot-&amp;amp;gt;right);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void show(ostream &amp;amp;amp; aOs, Node_ptr aNode)&lt;br /&gt;
 {&lt;br /&gt;
 aOs &amp;amp;lt;&amp;amp;lt; aNode-&amp;amp;gt;word &amp;amp;lt;&amp;amp;lt; &amp;quot;\t\t&amp;quot;;&lt;br /&gt;
 if ( aNode-&amp;amp;gt;word.size() &amp;amp;lt; 8)// 결과를 보기 좋게 탭 개수 조절&lt;br /&gt;
 aOs &amp;amp;lt;&amp;amp;lt; &amp;quot;\t&amp;quot;;&lt;br /&gt;
 if ( aNode-&amp;amp;gt;word.size() &amp;amp;lt; 4)&lt;br /&gt;
 aOs &amp;amp;lt;&amp;amp;lt; &amp;quot;\t&amp;quot;;&lt;br /&gt;
 aOs &amp;amp;lt;&amp;amp;lt; aNode-&amp;amp;gt;count &amp;amp;lt;&amp;amp;lt; &amp;quot;\t\t&amp;quot;&lt;br /&gt;
 &amp;amp;lt;&amp;amp;lt; aNode-&amp;amp;gt;lines &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void deleteAllNode( Node_ptr aRoot )&lt;br /&gt;
 {&lt;br /&gt;
 if ( aRoot-&amp;amp;gt;left != NULL )&lt;br /&gt;
 deleteAllNode( aRoot-&amp;amp;gt;left );&lt;br /&gt;
 &lt;br /&gt;
 if ( aRoot-&amp;amp;gt;right != NULL )&lt;br /&gt;
 deleteAllNode( aRoot-&amp;amp;gt;right );&lt;br /&gt;
 &lt;br /&gt;
 delete aRoot;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 string toString(int aNum) // 줄수를 string 객체로 바꾸는 함수&lt;br /&gt;
 {&lt;br /&gt;
 char * temp;&lt;br /&gt;
 if ( aNum / 1000 != 0 ){&lt;br /&gt;
 temp = new char[5];&lt;br /&gt;
 temp[0] = aNum / 1000 + 48;&lt;br /&gt;
 temp[1] = aNum % 1000 / 100 + 48;&lt;br /&gt;
 temp[2] = aNum % 100 / 10 + 48;&lt;br /&gt;
 temp[3] = aNum % 10 + 48;&lt;br /&gt;
 temp[4] = &amp;#039;\0&amp;#039;;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 else if ( aNum / 100 != 0 ){&lt;br /&gt;
 temp = new char[4];&lt;br /&gt;
 temp[0] = aNum / 100 + 48;&lt;br /&gt;
 temp[1] = aNum % 100 / 10 + 48;&lt;br /&gt;
 temp[2] = aNum % 10 + 48;&lt;br /&gt;
 temp[3] = &amp;#039;\0&amp;#039;;&lt;br /&gt;
 }&lt;br /&gt;
 else if ( aNum / 10 != 0 ){&lt;br /&gt;
 temp = new char[3];&lt;br /&gt;
 temp[0] = aNum / 10 + 48;&lt;br /&gt;
 temp[1] = aNum % 10 + 48;&lt;br /&gt;
 temp[2] = &amp;#039;\0&amp;#039;;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 else if ( aNum &amp;amp;gt; 0 ){&lt;br /&gt;
 temp = new char[2];&lt;br /&gt;
 temp[0] = aNum + 48;&lt;br /&gt;
 temp[1] = &amp;#039;\0&amp;#039;;&lt;br /&gt;
 }&lt;br /&gt;
 string number(temp);&lt;br /&gt;
 delete temp;&lt;br /&gt;
 return number;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 void showAll(ostream &amp;amp;amp; aOs, Node_ptr aRoot)&lt;br /&gt;
 {&lt;br /&gt;
 aOs &amp;amp;lt;&amp;amp;lt; &amp;quot;WORD&amp;quot; &amp;amp;lt;&amp;amp;lt; &amp;quot;\t\t\t&amp;quot; &amp;amp;lt;&amp;amp;lt; &amp;quot;COUNT&amp;quot; &amp;amp;lt;&amp;amp;lt; &amp;quot;\t\t&amp;quot; &amp;amp;lt;&amp;amp;lt; &amp;quot;LINES&amp;quot; &amp;amp;lt;&amp;amp;lt; endl&lt;br /&gt;
 &amp;amp;lt;&amp;amp;lt; &amp;quot;--------------------------------------&amp;quot; &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
 inorderTravel(aOs, aRoot);&lt;br /&gt;
 aOs &amp;amp;lt;&amp;amp;lt; &amp;quot;--------------------------------------&amp;quot; &amp;amp;lt;&amp;amp;lt; endl&lt;br /&gt;
 &amp;amp;lt;&amp;amp;lt; &amp;quot;TOTAL&amp;quot; &amp;amp;lt;&amp;amp;lt; &amp;quot;\t\t&amp;quot; &amp;amp;lt;&amp;amp;lt; num_of_node++ &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
 }&lt;br /&gt;
----&lt;br /&gt;
[[몸짱프로젝트]]&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;Unknown</name></author>
	</entry>
</feed>