<?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=OurMajorLangIsCAndCPlusPlus%2FXML%2F%EA%B9%80%EC%83%81%EC%84%AD%ED%97%88%EC%A4%80%EC%88%98</id>
	<title>OurMajorLangIsCAndCPlusPlus/XML/김상섭허준수 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=OurMajorLangIsCAndCPlusPlus%2FXML%2F%EA%B9%80%EC%83%81%EC%84%AD%ED%97%88%EC%A4%80%EC%88%98"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=OurMajorLangIsCAndCPlusPlus/XML/%EA%B9%80%EC%83%81%EC%84%AD%ED%97%88%EC%A4%80%EC%88%98&amp;action=history"/>
	<updated>2026-05-15T22:04:09Z</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=OurMajorLangIsCAndCPlusPlus/XML/%EA%B9%80%EC%83%81%EC%84%AD%ED%97%88%EC%A4%80%EC%88%98&amp;diff=37360&amp;oldid=prev</id>
		<title>imported&gt;Unknown at 05:23, 7 February 2021</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=OurMajorLangIsCAndCPlusPlus/XML/%EA%B9%80%EC%83%81%EC%84%AD%ED%97%88%EC%A4%80%EC%88%98&amp;diff=37360&amp;oldid=prev"/>
		<updated>2021-02-07T05:23:56Z</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;== 입력파일을 &amp;quot;input.txt&amp;quot;에 넣어야 됨..ㅡㅜ ==&lt;br /&gt;
&lt;br /&gt;
 #include &amp;amp;lt;string.h&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;stdio.h&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;stdlib.h&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;string.h&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 typedef struct treeNode* tree_pointer;&lt;br /&gt;
 typedef struct listNode* list_pointer;&lt;br /&gt;
 &lt;br /&gt;
 struct listNode{&lt;br /&gt;
 	tree_pointer child;&lt;br /&gt;
 	list_pointer ptr;&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct treeNode{&lt;br /&gt;
 	char tag[100];&lt;br /&gt;
 	char text[100];&lt;br /&gt;
 	list_pointer link;&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 list_pointer findNull(list_pointer temp)&lt;br /&gt;
 {&lt;br /&gt;
 	while(temp-&amp;amp;gt;ptr != NULL)&lt;br /&gt;
 		temp = temp-&amp;amp;gt;ptr;&lt;br /&gt;
 	&lt;br /&gt;
 	return temp;   // else return temp 를 해야하나~~ -..ㅡ;;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 tree_pointer insert(tree_pointer ptr, char* tag, char* text) // a = 태그, b = 데이터&lt;br /&gt;
 {&lt;br /&gt;
 &lt;br /&gt;
 	tree_pointer node = (tree_pointer)malloc(sizeof(treeNode));&lt;br /&gt;
 	node-&amp;amp;gt;link = NULL;&lt;br /&gt;
 	strcpy(node-&amp;amp;gt;tag, tag);&lt;br /&gt;
 	if(text == NULL)&lt;br /&gt;
 		node-&amp;amp;gt;text[0] = &amp;#039;\n&amp;#039;;&lt;br /&gt;
 	else&lt;br /&gt;
 		strcpy(node-&amp;amp;gt;text, text);&lt;br /&gt;
 	&lt;br /&gt;
 	if(ptr != NULL)&lt;br /&gt;
 	{	&lt;br /&gt;
 		list_pointer link_node = (list_pointer)malloc(sizeof(listNode));&lt;br /&gt;
 		list_pointer temp;&lt;br /&gt;
 		link_node-&amp;amp;gt;child = node;&lt;br /&gt;
 		link_node-&amp;amp;gt;ptr = NULL;&lt;br /&gt;
 		if(ptr-&amp;amp;gt;link == NULL)&lt;br /&gt;
 			ptr-&amp;amp;gt;link = link_node;&lt;br /&gt;
 		else&lt;br /&gt;
 		{&lt;br /&gt;
 			temp = findNull(ptr-&amp;amp;gt;link);&lt;br /&gt;
 			temp-&amp;amp;gt;ptr = link_node;&lt;br /&gt;
 		}&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	return node;&lt;br /&gt;
 	&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 list_pointer search_child(list_pointer list, char * tag)&lt;br /&gt;
 {&lt;br /&gt;
 //	list_pointer temp = list;&lt;br /&gt;
 	char tag_temp[100];&lt;br /&gt;
 	list_pointer return_list = NULL, temp1, temp2, temp3;&lt;br /&gt;
 	for(; list; list = list-&amp;amp;gt;ptr)&lt;br /&gt;
 	{&lt;br /&gt;
 		for(temp1 = list-&amp;amp;gt;child-&amp;amp;gt;link; temp1; temp1 = temp1-&amp;amp;gt;ptr)&lt;br /&gt;
 		{&lt;br /&gt;
 			strcpy(tag_temp,temp1-&amp;amp;gt;child-&amp;amp;gt;tag);&lt;br /&gt;
 			if(strcmp(tag_temp,tag) == 0 ||&lt;br /&gt;
 				(tag_temp[strlen(tag_temp)-1] == &amp;#039;/&amp;#039; &amp;amp;amp;&amp;amp;amp; (strlen(tag_temp) -1) == strlen(tag) &amp;amp;amp;&amp;amp;amp; strncmp(tag_temp,tag,strlen(tag)) == 0)) &lt;br /&gt;
 			{&lt;br /&gt;
 				temp2 = (list_pointer)malloc(sizeof(listNode));&lt;br /&gt;
 				temp2-&amp;amp;gt;child = temp1-&amp;amp;gt;child;&lt;br /&gt;
 				temp2-&amp;amp;gt;ptr = NULL;&lt;br /&gt;
 				if(return_list == NULL)&lt;br /&gt;
 					return_list = temp2;&lt;br /&gt;
 				else&lt;br /&gt;
 					temp3-&amp;amp;gt;ptr = temp2;&lt;br /&gt;
 				temp3 = temp2;&lt;br /&gt;
 			}&lt;br /&gt;
 		}&lt;br /&gt;
 	}&lt;br /&gt;
 	&lt;br /&gt;
 	// list 해제&lt;br /&gt;
 	&lt;br /&gt;
 	return return_list;	&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 list_pointer search_all(list_pointer list, char * tag)&lt;br /&gt;
 {&lt;br /&gt;
 	//	list_pointer temp = list;&lt;br /&gt;
 	list_pointer return_list = NULL, temp1, temp2, temp3;&lt;br /&gt;
 	&lt;br /&gt;
 	if(list)&lt;br /&gt;
 	{&lt;br /&gt;
 		temp1 = search_child(list,tag);&lt;br /&gt;
 		if(temp1)&lt;br /&gt;
 		{&lt;br /&gt;
 			if(return_list == NULL)&lt;br /&gt;
 				return_list = temp1;&lt;br /&gt;
 			else&lt;br /&gt;
 			{&lt;br /&gt;
 				temp2 = findNull(return_list);&lt;br /&gt;
 				temp2-&amp;amp;gt;ptr = temp1;			&lt;br /&gt;
 			}&lt;br /&gt;
 		}&lt;br /&gt;
 		for(; list; list = list-&amp;amp;gt;ptr)&lt;br /&gt;
 		{			&lt;br /&gt;
 			temp1 = search_all(list-&amp;amp;gt;child-&amp;amp;gt;link,tag);&lt;br /&gt;
 			if(temp1)&lt;br /&gt;
 			{&lt;br /&gt;
 				if(return_list == NULL)&lt;br /&gt;
 					return_list = temp1;&lt;br /&gt;
 				else&lt;br /&gt;
 				{&lt;br /&gt;
 					temp2 = findNull(return_list);&lt;br /&gt;
 					temp2-&amp;amp;gt;ptr = temp1;								&lt;br /&gt;
 				}&lt;br /&gt;
 			}&lt;br /&gt;
 		}&lt;br /&gt;
 	}&lt;br /&gt;
 	&lt;br /&gt;
 	// list 해제&lt;br /&gt;
 	&lt;br /&gt;
 	return return_list;	&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 void show(tree_pointer ptr, int level)&lt;br /&gt;
 {&lt;br /&gt;
 	if(ptr)&lt;br /&gt;
 	{&lt;br /&gt;
 		for(int i = 0; i &amp;amp;lt; level; i++)&lt;br /&gt;
 			printf(&amp;quot;  &amp;quot;);&lt;br /&gt;
 		printf(&amp;quot;&amp;amp;lt;%s&amp;amp;gt;&amp;quot;,ptr-&amp;amp;gt;tag);&lt;br /&gt;
 		&lt;br /&gt;
 		if(ptr-&amp;amp;gt;text[0] != &amp;#039;\n&amp;#039;)&lt;br /&gt;
 			printf(&amp;quot;%s&amp;quot;,ptr-&amp;amp;gt;text);&lt;br /&gt;
 		else&lt;br /&gt;
 		{&lt;br /&gt;
 			printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
 			for(list_pointer list = ptr-&amp;amp;gt;link; list; list = list-&amp;amp;gt;ptr)&lt;br /&gt;
 				show(list-&amp;amp;gt;child, level + 1);&lt;br /&gt;
 		}&lt;br /&gt;
 		if(ptr-&amp;amp;gt;tag[strlen(ptr-&amp;amp;gt;tag)-1] != &amp;#039;/&amp;#039;)&lt;br /&gt;
 		{&lt;br /&gt;
 			if(ptr-&amp;amp;gt;text[0] == &amp;#039;\n&amp;#039;)&lt;br /&gt;
 				for(i = 0; i &amp;amp;lt; level; i++)&lt;br /&gt;
 					printf(&amp;quot;  &amp;quot;);&lt;br /&gt;
 			printf(&amp;quot;&amp;amp;lt;/%s&amp;amp;gt;\n&amp;quot;,ptr-&amp;amp;gt;tag);&lt;br /&gt;
 			&lt;br /&gt;
 		}&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void show_list(list_pointer list)&lt;br /&gt;
 {&lt;br /&gt;
 	for(;list;list = list-&amp;amp;gt;ptr)&lt;br /&gt;
 		show(list-&amp;amp;gt;child,0);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 #define stack_max 100&lt;br /&gt;
 #define stack_empty 0&lt;br /&gt;
 &lt;br /&gt;
 typedef struct stack * stack_pointer;&lt;br /&gt;
 struct stack&lt;br /&gt;
 {&lt;br /&gt;
 	tree_pointer array[stack_max];&lt;br /&gt;
 	int top;&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 tree_pointer stack_out(stack_pointer sta)&lt;br /&gt;
 {&lt;br /&gt;
 	if(sta-&amp;amp;gt;top &amp;amp;lt;= stack_empty)&lt;br /&gt;
 		printf(&amp;quot;Stack Empty!!\n&amp;quot;);&lt;br /&gt;
 	return sta-&amp;amp;gt;array[--sta-&amp;amp;gt;top-1]; &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void stack_insert(stack_pointer sta, tree_pointer ptr)&lt;br /&gt;
 {&lt;br /&gt;
 	if(sta-&amp;amp;gt;top != stack_max)&lt;br /&gt;
 		sta-&amp;amp;gt;array[sta-&amp;amp;gt;top++] = ptr;&lt;br /&gt;
 	else&lt;br /&gt;
 		printf(&amp;quot;Stack Full!!\n&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void stack_clear(stack_pointer sta)&lt;br /&gt;
 {&lt;br /&gt;
 	sta-&amp;amp;gt;top = 0;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 tree_pointer get_keyword(char *line, stack_pointer sta)&lt;br /&gt;
 {&lt;br /&gt;
 	static tree_pointer ptr = NULL;&lt;br /&gt;
 	&lt;br /&gt;
 	char seps[] = &amp;quot;&amp;amp;lt;&amp;amp;gt;&amp;quot;;&lt;br /&gt;
 	char * tag, * text = NULL, * temp;&lt;br /&gt;
 	tag = strtok(line, seps);&lt;br /&gt;
 &lt;br /&gt;
 	if(tag[0] == &amp;#039; &amp;#039;)&lt;br /&gt;
 		tag = strtok(NULL, seps);&lt;br /&gt;
 &lt;br /&gt;
 	temp = strtok(NULL, seps);&lt;br /&gt;
 	if(temp[0] == &amp;#039; &amp;#039;)&lt;br /&gt;
 	{&lt;br /&gt;
 		// &amp;amp;lt;tag&amp;amp;gt;&lt;br /&gt;
 		if(tag[0] != &amp;#039;/&amp;#039;)&lt;br /&gt;
 		{&lt;br /&gt;
 			// &amp;amp;lt;tag/&amp;amp;gt;&lt;br /&gt;
 			if(tag[strlen(tag)-1] == &amp;#039;/&amp;#039;)&lt;br /&gt;
 			{&lt;br /&gt;
 				insert(ptr,tag,text);&lt;br /&gt;
 			}&lt;br /&gt;
 			// 트리에 삽입&lt;br /&gt;
 			else&lt;br /&gt;
 			{&lt;br /&gt;
 				ptr = insert(ptr,tag,text);&lt;br /&gt;
 				stack_insert(sta,ptr);&lt;br /&gt;
 			} &lt;br /&gt;
 		}&lt;br /&gt;
 		// &amp;amp;lt;/tag&amp;amp;gt; 스택을 한칸 증가&lt;br /&gt;
 		else&lt;br /&gt;
 		{&lt;br /&gt;
 			ptr = stack_out(sta);&lt;br /&gt;
 		}&lt;br /&gt;
 		return ptr;&lt;br /&gt;
 	}&lt;br /&gt;
 	// text입력 처리&lt;br /&gt;
 	while(strtok(NULL, seps));&lt;br /&gt;
 	text = strtok(temp, seps);&lt;br /&gt;
 	// cout &amp;amp;lt;&amp;amp;lt; text &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
 	while(strtok(NULL, seps));&lt;br /&gt;
 	insert(ptr,tag,text);&lt;br /&gt;
 	&lt;br /&gt;
 	return ptr;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 tree_pointer tree_make(const char * file)&lt;br /&gt;
 {&lt;br /&gt;
 	char line[100];&lt;br /&gt;
 	FILE *stream = fopen(file, &amp;quot;r&amp;quot; );&lt;br /&gt;
 	tree_pointer root;&lt;br /&gt;
 	stack_pointer sta = (stack_pointer)malloc(sizeof(stack));&lt;br /&gt;
 	stack_clear(sta);&lt;br /&gt;
 	&lt;br /&gt;
 	fgets(line, 100, stream);&lt;br /&gt;
 	root = get_keyword(line,sta);&lt;br /&gt;
 	&lt;br /&gt;
 	while(fgets(line, 100, stream))&lt;br /&gt;
 	{&lt;br /&gt;
 		get_keyword(line,sta);&lt;br /&gt;
 	}&lt;br /&gt;
 	&lt;br /&gt;
 	fclose( stream );&lt;br /&gt;
 	free(sta);&lt;br /&gt;
 	&lt;br /&gt;
 	return root; &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void reply_query(char * query, tree_pointer ptr)&lt;br /&gt;
 {&lt;br /&gt;
 	char * tag, *temp, check;&lt;br /&gt;
 	list_pointer list = (list_pointer)malloc(sizeof(listNode));&lt;br /&gt;
 	list-&amp;amp;gt;child = ptr;&lt;br /&gt;
 	list-&amp;amp;gt;ptr = NULL;&lt;br /&gt;
 &lt;br /&gt;
 	char seps1[] = &amp;quot;/&amp;quot;;&lt;br /&gt;
 	char seps2[] = &amp;quot;\n&amp;quot;;&lt;br /&gt;
 	tag = strtok(query, seps1);&lt;br /&gt;
 	temp = strtok(NULL, seps2);&lt;br /&gt;
 	while(temp != NULL)&lt;br /&gt;
 	{&lt;br /&gt;
 		check = temp[0];&lt;br /&gt;
 		tag = strtok(temp, seps1);&lt;br /&gt;
 		if(check == &amp;#039;/&amp;#039;)&lt;br /&gt;
 			list = search_all(list, tag);&lt;br /&gt;
 		else&lt;br /&gt;
 			list = search_child(list, tag);&lt;br /&gt;
 		temp = strtok(NULL, seps2);&lt;br /&gt;
 	}&lt;br /&gt;
 	show_list(list);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
 	char query[100] = &amp;quot;zeropage/studies/java/participants&amp;quot;;&lt;br /&gt;
 	tree_pointer root;&lt;br /&gt;
 	root = tree_make(&amp;quot;input.txt&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
 	reply_query(query, root);&lt;br /&gt;
 &lt;br /&gt;
 	// 트리 해제&lt;br /&gt;
 	return 0;&lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>imported&gt;Unknown</name></author>
	</entry>
</feed>