~cpp #include <string.h> #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct treeNode* tree_pointer; typedef struct listNode* list_pointer; struct listNode{ tree_pointer child; list_pointer ptr; }; struct treeNode{ char tag[100]; char text[100]; list_pointer link; }; list_pointer findNull(list_pointer temp) { while(temp->ptr != NULL) temp = temp->ptr; return temp; // else return temp 를 해야하나~~ -..ㅡ;; } tree_pointer insert(tree_pointer ptr, char* tag, char* text) // a = 태그, b = 데이터 { tree_pointer node = (tree_pointer)malloc(sizeof(treeNode)); node->link = NULL; strcpy(node->tag, tag); if(text == NULL) node->text[0] = '\n'; else strcpy(node->text, text); if(ptr != NULL) { list_pointer link_node = (list_pointer)malloc(sizeof(listNode)); list_pointer temp; link_node->child = node; link_node->ptr = NULL; if(ptr->link == NULL) ptr->link = link_node; else { temp = findNull(ptr->link); temp->ptr = link_node; } } return node; } list_pointer search_child(list_pointer list, char * tag) { // list_pointer temp = list; char tag_temp[100]; list_pointer return_list = NULL, temp1, temp2, temp3; for(; list; list = list->ptr) { for(temp1 = list->child->link; temp1; temp1 = temp1->ptr) { strcpy(tag_temp,temp1->child->tag); if(strcmp(tag_temp,tag) == 0 || (tag_temp[strlen(tag_temp)-1] == '/' && (strlen(tag_temp) -1) == strlen(tag) && strncmp(tag_temp,tag,strlen(tag)) == 0)) { temp2 = (list_pointer)malloc(sizeof(listNode)); temp2->child = temp1->child; temp2->ptr = NULL; if(return_list == NULL) return_list = temp2; else temp3->ptr = temp2; temp3 = temp2; } } } // list 해제 return return_list; } list_pointer search_all(list_pointer list, char * tag) { // list_pointer temp = list; list_pointer return_list = NULL, temp1, temp2, temp3; if(list) { temp1 = search_child(list,tag); if(temp1) { if(return_list == NULL) return_list = temp1; else { temp2 = findNull(return_list); temp2->ptr = temp1; } } for(; list; list = list->ptr) { temp1 = search_all(list->child->link,tag); if(temp1) { if(return_list == NULL) return_list = temp1; else { temp2 = findNull(return_list); temp2->ptr = temp1; } } } } // list 해제 return return_list; } void show(tree_pointer ptr, int level) { if(ptr) { for(int i = 0; i < level; i++) printf(" "); printf("<%s>",ptr->tag); if(ptr->text[0] != '\n') printf("%s",ptr->text); else { printf("\n"); for(list_pointer list = ptr->link; list; list = list->ptr) show(list->child, level + 1); } if(ptr->tag[strlen(ptr->tag)-1] != '/') { if(ptr->text[0] == '\n') for(i = 0; i < level; i++) printf(" "); printf("</%s>\n",ptr->tag); } } } void show_list(list_pointer list) { for(;list;list = list->ptr) show(list->child,0); } #define stack_max 100 #define stack_empty 0 typedef struct stack * stack_pointer; struct stack { tree_pointer array[stack_max]; int top; }; tree_pointer stack_out(stack_pointer sta) { if(sta->top <= stack_empty) printf("Stack Empty!!\n"); return sta->array[--sta->top-1]; } void stack_insert(stack_pointer sta, tree_pointer ptr) { if(sta->top != stack_max) sta->array[sta->top++] = ptr; else printf("Stack Full!!\n"); } void stack_clear(stack_pointer sta) { sta->top = 0; } tree_pointer get_keyword(char *line, stack_pointer sta) { static tree_pointer ptr = NULL; char seps[] = "<>"; char * tag, * text = NULL, * temp; tag = strtok(line, seps); if(tag[0] == ' ') tag = strtok(NULL, seps); temp = strtok(NULL, seps); if(temp[0] == ' ') { // <tag> if(tag[0] != '/') { // <tag/> if(tag[strlen(tag)-1] == '/') { insert(ptr,tag,text); } // 트리에 삽입 else { ptr = insert(ptr,tag,text); stack_insert(sta,ptr); } } // </tag> 스택을 한칸 증가 else { ptr = stack_out(sta); } return ptr; } // text입력 처리 while(strtok(NULL, seps)); text = strtok(temp, seps); // cout << text << endl; while(strtok(NULL, seps)); insert(ptr,tag,text); return ptr; } tree_pointer tree_make(const char * file) { char line[100]; FILE *stream = fopen(file, "r" ); tree_pointer root; stack_pointer sta = (stack_pointer)malloc(sizeof(stack)); stack_clear(sta); fgets(line, 100, stream); root = get_keyword(line,sta); while(fgets(line, 100, stream)) { get_keyword(line,sta); } fclose( stream ); free(sta); return root; } void reply_query(char * query, tree_pointer ptr) { char * tag, *temp, check; list_pointer list = (list_pointer)malloc(sizeof(listNode)); list->child = ptr; list->ptr = NULL; char seps1[] = "/"; char seps2[] = "\n"; tag = strtok(query, seps1); temp = strtok(NULL, seps2); while(temp != NULL) { check = temp[0]; tag = strtok(temp, seps1); if(check == '/') list = search_all(list, tag); else list = search_child(list, tag); temp = strtok(NULL, seps2); } show_list(list); } int main() { char query[100] = "zeropage/studies/java/participants"; tree_pointer root; root = tree_make("input.txt"); reply_query(query, root); // 트리 해제 return 0; }