자료구조 04 최종 보고서

  • 244 views
Uploaded on

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
244
On Slideshare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
2
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. C3조 과제물 발표 조장 : 09박구남 조원 : 07이용재 09김현호 09송하윤 11정예린 - 1 -
  • 2. 과제수행일지 조원소개 조장 박구남소 속 C3 조 자료조사 송하윤, 김현호 프로그래밍 이용재, 정예린 주 제연구제목 상호 참조 생성기 트리를 이용하여 하나 이상의 문장을 입력 하였을때 단어들의 개수,Line를 나타낼 수 있연구배경 으며 이것을 응용 할 수 있다. 참 고 자 료 과제의 수행 첫째날 2012 년 5 월 8 일 화요일회의 주제 조원 자기소개 및 역할분담, 과제 파악 조장 : 박구남 자료조사 : 김현호, 송하윤 프로그래밍 : 이용재, 정예린 이상과 같이 이번 프로젝트의 역할분담을 실시했습니다. 첫 수업시간에 문제 파악을 위해 토의를 진행 하면서 각자 역할 분담을 하였습니다. 트리(Tree) 트리 회로. 나무가 하나의 뿌리(Root)에서 줄기가 나와 가지로 나누어지는 것처럼, 어떤회의 내용 하나의 집합으로부터 하위 레벨로 가지가 나오는 집합 관계를 갖는 계층 구조를 말한다. 부분적으로도 결코 루트를 형성하는 경우는 없다. 따라서 처음에 가지가 나오기 시작되 고 있는 집합으로부터 차례대로 「가지」를 더듬어가면 목적의 집합을 찾을 수 있다. 정 보 처리 분야에는 이 같은 트리 구조를 가진 개념이 많이 있다. 트리의 조건 1) 트리의 노드 중 1개의 Root Node가 있어야 한다. 2) Root Node를 제외한 노드들을 n개 (n>=0)의 부분집합으로 나누어지며, 각 부분집합 은 하나의 트리이다. 이때 각 부분집합을 subtree라고 한다.
  • 3. 트리의 용어.Node 트리를 표현하는 구성요소.Root Node 트리에서 최상위 레벨에 있는 노드(트리의 처음 노드).Degree of Node 노드에서 children Node의 수.Degree of a Tree 트리를 형성하는 모든 노드의 차수에서 최대값.Sub tree 트리에서 Root Node를 제외한 모든 트리.Ancestor Node Root Node에서 임의의 노드 까지의 경로를 형성하는 노드.Descendent Node 트리에서 임의의 하위노드에 연결된 모든 노드.Parent Node 임의의 노드에 연결된 바로 위의 노드.Children Node 임의에 노드에 연결된 바로 아래의 노드.sibling 동일한 Parent Node를 가지는 노드.Branch Node Root Node와 Leaf Node를 제외한 모든 노드.Leaf Node 노드의 차수가 0인 노드(트리의 마지막노드).Level 트리에서 Root Node부터 한단계씩 내려가면서 1씩 증가한다.Height(Depth) 트리의 최대 레벨.Path 어떤 임의의 노드로부터 임의의 노드에 이르는 동안에 연결된 일련의 노드의 집합. 경로의 길이는 경로를 구성하는 노드의 수보다 1이 작다.트리의 표현방법.트리의 표현방법으로는 리스트, 집합, 막대 그래프, 배열, 연결리스트 등이 있다.트리의 분류 방법. - 2 -
  • 4. 트리는 그래프의 일종으로서 Direct Tree 와 Undirect Tree, General Tree와 Binary Tree 등으로 구분된다. General Tree. 1)Ordered Tree & Oriented Tree 트리에서 레벨의 같은 노드들의 순서가 중요한 경우를 Ordered Tree라고 하고, 노드의 순서가 중요하지 않은 경우에는 Oriented Tree라고 한다. 2)Similar Tree & Equivalent Tree 임의의 트리가 2개 주어졌을때 트리를 구성하는 전체 노드의 수와 좌우 배열 위치등과 같은 외형적인 부분이 같을 경우 Similar Tree 라고 하고, 노드의 내용까지 같은 경우 Equivalent Tree라고 한다. Binary Tree 일반트리와는 다르게 중요한 형태의 자료 객체로 차수가 2이하인 트리이다. 즉, 일반트 리에서는 노드의 공백이 존재할 수 없지만, Binary Tree에서는 존재 가능하며, 왼쪽과 오른쪽 SubTree가 독립적이다. 1) Full Binary Tree Depth가 i인 Binary Tree에서 연결될 수 있는 최대의 노드가 연결되어진 트리를 말하 며 노드의 수는 2i-1개이다. 2) Complete Binary Tree level이 i인 노드의 수를 n이라 할 때 2^i-1 -1<n<2^i -1을 만족하는 트리. 3)Knuth Binary Tree 각 노드의 차수가 2이하인 트리. 4)사향이진트리 Root Node를 중심으로 왼쪽이나 오른쪽 한 방향으로 기울어진 트리. zz 조원들 모두 기본적인 트리의 형태만 알고 있었으며, 트리의 종류,표현방법,프로그래밍에 반성 응용 하는 방법은 모두 알지 못하여 자료조사를 하며 알아보기로 토의 하였습니다. 둘째날 2012 년 5 월 10 일 목요일회의주제 AVL트리의 균형방법 및 정의 서로가 조사해온 내용을 바탕으로 알고리즘을 만들기에 앞서 균형트리에 관하여 교수님 께 ※ AVL 트리 AVL 트리는 Adelson-Velskii와 Landis에 의해 1962년에 제안된 트리로써 각 노들에 왼 쪽 서브 트리의 높이와 오른쪽 서브트리의 높이 차잉가 1 이하인 이진 탐색 트리를 말한 다. AVL트리는 트리가 비균형 상태로 되면 스스로 노드들을 재배치하여 균형 상태로 만회의내용 든다. 따라서 AVL 트리는 균형 트리가 항상 보장되기 때문에 탐색시간이 O(logn) 시간 안에 끝나게 된다. 또한 삽입과 삭제 연산도 O(logn) 시간 안에 할 수 있다. 하지만 레드 -블랙 트리보다 효율이 떨어지기 때문에 자주 사용되지는 않는다.  AVL 트리에서 균형 인수는 매우 중요하다. 균형 인수(Balancing Factor)란 [왼쪽 서브 트리의 높이 - 오른쪽 서브 트리의 높이]로 정의 된다. 모든 노드의 균형 인수가 ±1 이 하이면 AVL 트리이다. 아래의 사진은 모든 균형 인수가 적절하기 때문에 AVL 트리라고 할 수 있다. - 3 -
  • 5.   ※ 삽입 연산원소를 하나 삽입하게 된다면 이진 탐색 트리의 삽입 규칙에 따라 우선 노드를 위치시킨다. 그리고 모든 노드에 대한 균형인수가 ±1 내에 값이면 균형이 유지된 것이므로 삽입과정을 마친다. 하지만 모든 노드 중 한 노드의 균형 인수만이라도 그 범위를 벗어나면 균형을 맞춰주기 위한 "회전(Rotation)" 작업을 해주어야 한다.AVL 트리에서 균형이 깨지는 타입은 4가지가 있다. 각각의 타입을 살펴보도록 하자. 새로 추가되는 노드를 N, 가장 가까우면서 균형인수가 ±2가 된 조상 노드를 A라고 하자.- LL : N이 A의 왼쪽 서브트리의 왼쪽에 삽입되는 경우- LR : N이 A의 왼쪽 서브트리의 오른쪽에 삽입되는 경우- RR : N이 A의 오른쪽 서브트리의 오른쪽에 삽입되는 경우- RL : N이 A의 오른쪽 서브트리의 왼쪽에 삽입되는 경우            [LL]                                [LR]   이렇게 균형이 깨지는 경우에서 균형 트리로 다시 변경하기 위해서 수행하는 회전 또한 각각 다르다.- LL : A부터 N까지의 경로 상의 노드들을 오른쪽으로 회전시킨다.(단순회전)- LR : A부터 N까지의 경로 상의 노드들을 왼쪽-오른쪽으로 회전시킨다.(이중회전)- RR : A부터 N까지의 경로 상의 노드들을 왼쪽으로 회전시킨다.(단순회전)- RL : A부터 N까지의 경로 상의 노드들을 오른쪽-왼쪽으로 회전시킨다.(이중회전)LL과 RR 회전, LR과 RL 회전이 각각 대칭적으로 동작하게 된다.  LL 부터 설명하자면, 일단 바로 위 그림을 보자. 세개의 원소를 정확하게 재배치하기 위해선 세개 중 중간값을 부모에 위치시키고 나머지를 각각 왼쪽, 오른쪽 자식으로 삼으면될 것이다. 따라서 A가 부모가 되고 B는 A의 왼쪽 자식 노드 위치를 고수하며, C는 A의 - 4 -
  • 6. 오른쪽 자식 노드가 된다. A의 오른쪽 자식 노드는 C의 왼쪽 자식 노드가 된다. 다음으로 LR 을 보자. 먼저 A가 B의 자리에 위치하고 B는 A의 왼쪽 자식 노드가 된다. A의 기존 왼쪽 자식 노드는 B의 오른쪽 자식 노드가 된다. 이렇게 첫번째 회전이 완료되 고 두번째 회전은 LL과 동일하다. 회전에 대한 습득은 글로만 읽어서는 절대 익힐 수 없으니, 다른 책을 보면서 실제로 수 행하보길 바란다. 위 그림의 경우보다 복잡한 경우(균형 인수가 4인 경우도 볼 수 있다) 도 많으니 연습이 필수적이다.     [출처] 균형 이진 탐색 트리 - AVL 트리, 레드-블랙 트리| -균형트리(AVL)에 관하여 내용을 이해 할 수 있었으나 이것을 코딩에 적용 하는것이 문제점 쉽지않았음. 셋째날 2012 년 5 월 15 일 화요일 회의주제 프로그램 초안 분석 #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <windows.h> #include <string.h> struct Node { char name; Node *link[26]; int page[26]; int count; int spot; }; Node addtree (Node *A, Node *B); Node AddNode (char A); Node Delnode (Node *A, char B); int search (Node *A, char B); int searchspot (Node *A, char B); void Printans (Node *A, char ans[], int x); int main () { int i,j,x,z; int check=0; FILE *point; char a = R; int m=0;프로그램 초안 // printf("진행중"); Node *tree = (Node *)malloc(sizeof(Node)); // printf("진행중"); point=fopen("C://file.txt","r"); if(point==NULL) { return 1; } i = 0; j = 1; z = 0; tree[i] = AddNode(a); while(1) //텍스트 파일에 저장되어 있는 문장들을 배열에 넣어서 저장. { a=fgetc(point); if(a>=65 && a<=90) { a+=32; } if(a>=97 && a<=122) // 알파벳이면 노드 진행 {printf("%c",a); check = search(&tree[i],a); // 노드 있는지 확인 if (check == 0 ) { // 노드가 없으면 노드 추가 하고 아래 노드로 이동. - 5 -
  • 7. tree[j] = AddNode(a); tree[j].spot = j; tree[i] = addtree(&tree[i],&tree[j]); i = j; j++; } else { i = searchspot(&tree[i],a); } // 노드가 있으면 그대로 위치만 이동. } else if(a== || a==n) { // 공백이나 n 일시, 카운터 증가. 그리고 root로 복귀. tree[i].count++; tree[i].page[z]=1; i = 0; } else if(a==+) { z++; } else if(a==EOF) {break; // 아무 것도 없을 시 종료 } } fclose(point); char ANS[50] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; printf("nWord Count Linesn"); Printans(&tree[0],ANS,0); // 출력 system("PAUSE"); getch(); return 0;}Node addtree (Node *A, Node *B) { for (int i = 0; i < 26 ; i++) { if (A->link[i] == NULL) { A -> link[i] = B; printf("%c의 LINK%d에 %c를 삽입 n",A -> name,i,B -> name); break; } } return *A; }Node AddNode (char A) { Node *B = (Node *)malloc(sizeof(Node)); B->name = A; for (int i = 0; i < 26 ; i++) { B->link[i] = NULL; B->page[i] = 0; } B->count = 0; B -> spot = 0; return *B; }Node Delnode (Node *A, char B) { for (int i = 0; i < 26 ; i++) { - 6 -
  • 8. if (A -> link[i] != NULL ) { if (A -> link[i] -> name == B) { A -> link[i] = NULL; printf("%c에 LINK&d에 %c를 삭제 n",A -> name,i,B); } } } return *A; } int search (Node *A, char B) { int x = 0; int i; for (i = 0; i < 26 ; i++) { if (A -> link[i] != NULL ) { if (A -> link[i] -> name == B) { x = 1; break; } } else break; } return x; } int searchspot (Node *A, char B) { for (int i = 0; i < 26 ; i++) { if (A -> link[i] != NULL ) { if (A -> link[i] -> name == B) {return A -> link[i] -> spot;} } } return 0; } void Printans (Node *A, char ans[], int x) { ans[x] = A -> name; for (int i = 0 ; i < 26 ; i++) { if (A -> count != 0) { for (int j=0; j<=x; j++) { printf("%c %d", ans[j],A->count); } for (int j=0; j<=26; j++) { if (A->page[j] == 1) { printf("%d",j+1); } } } else {} if (A->link[i] != NULL) { Printans( A->link[i],ans,x); } else {} } return; } // 출력 프로그램 초안을 분석하여 프로그램 실행이 되기위하여 어떤식으로 바꿔보면 좋을지 조원들과회의내용 토의를 진행 하였음.문제점 프로그램 초안 분석을 한 결과 오류가 발생 하였는데 무엇 때문에 오류가 발생 하였는지 - 7 -
  • 9. 찾지를 못하여 헤매었음. 주위 지인의 도움을 받아 문제점을 찾아 보려고 하였으나, 찾지 못하여 문자열을 배열에 옮겨서 풀어보기로 하였음. 넷째날 2012 년 5 월 17 일 목요일회의주제 프로그램 보완 #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <windows.h> #include <string.h> struct Node { char name; Node *link[26]; int page[26]; int count; int spot; }; Node addtree (Node *A, Node *B); Node AddNode (char A); Node Delnode (Node *A, char B); int Search (Node *A, char B); int Searchspot (Node *A, char B); void Printans (Node *A, char ans[], int x); int main () { int i,j,x,z; int check=0; FILE *point; char arr[100]; int a; int m=0; int Sizec; // printf("진행중"); Node *tree = (Node *)malloc(sizeof(Node)); // printf("진행중"); point=fopen("D://file.txt","r");프로그램 if(point==NULL) {수정안 return 1; } while(1) //텍스트 파일에 저장되어 있는 문장들을 배열에 넣어서 저장. { a=fgetc(point); if((a>=65 && a<=90) || (a>=97 && a<=122)) { arr[m]=a; if(a==EOF) { break; } else { m++; } } else if(a== || a==n) { arr[m]= ; if(a==EOF) { break; } else { m++; } } else { if(a==EOF) { break; } } } fclose(point); for(i=0;i<m;i++) //배열에 저장된 문자들을 소문자로 변환하여 다시 배열에 저장. - 8 -
  • 10. { if(arr[i]>=65 && arr[i]<=90) { arr[i]=arr[i]+32; } printf("%c",arr[i]); } fclose(point);printf("n"); Sizec = m; i = 0; j = 1; z = 2; m = 0; tree[i] = AddNode(R); for(;;) {//텍스트 파일에 저장되어 있는 문장들을 배열에 넣어서 저장. if(arr[m]>=a && arr[m]<=z) {// 알파벳이면 노드 진행 printf("%cn",arr[m]); check = Search(&tree[i],arr[m]); // 노드 있는지 확인 if (check == 0 ) { // 노드가 없으면 노드 추가 하고 아래 노드로 이동. tree[j] = AddNode(arr[m]); tree[j].spot = j;//노드 위치를 저장. tree[i] = addtree(&tree[i],&tree[j]); i = j; // i는 진행 노드 j++; // 노드 생성 위치 } else { i = Searchspot(&tree[i],arr[m]); printf("%d - %cn",i,tree[i].name); } // 노드가 있으면 그대로 위치만 이동. } else if(arr[m]== || arr[m]==n) { // 공백이나 n 일시, 카운터 증가.그리고 root로 복귀. tree[i].count++; // 단어 갯수 표기 tree[i].page[z]=1; // 등장 페이지 표기 i = 0; } else if(arr[m]==.) {// 임의로 다음페이지를 나타내는 기호를 + 로 정의함. z++; } else if(arr[m]==EOF) {break; // 아무 것도 없을 시 종료 } if (Sizec < m) break; m++; } char ANS[50] ={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; // 영단어 최장 길이 단어는 1000자가 넘어가지만 일반적으로 50자 미만. printf("nWord Count Linesn"); Printans(&tree[0],ANS,0); // 출력 system("PAUSE"); getch(); return 0;}Node addtree (Node *A, Node *B) { for (int i = 0; i < 26 ; i++) { if (A->link[i] == NULL) { A -> link[i] = B; printf("%c의 LINK%d에 %c를 삽입 n",A -> name,i,B -> name); break; } else {} } return *A; - 9 -
  • 11. }Node AddNode (char A) { Node *B = (Node *)malloc(sizeof(Node)); B->name = A; for (int i = 0; i < 26 ; i++) { B->link[i] = NULL; B->page[i] = 0; } B->count = 0; B -> spot = 0; return *B; }Node Delnode (Node *A, char B) { for (int i = 0; i < 26 ; i++) { if (A -> link[i] != NULL ) { if (A -> link[i] -> name == B) { A -> link[i] = NULL; printf("%c에 LINK&d에 %c를 삭제 n",A -> name,i,B); } } }return *A; }int Search (Node *A, char B) { int x = 0; int i; for (i = 0; i < 26 ; i++) { if (A -> link[i] != NULL ) { if (A -> link[i] -> name == B) { x = 1; break; } } else {break;} } return x; }int Searchspot (Node *A, char B) { for (int i = 0; i < 26 ; i++) { if (A -> link[i] != NULL ) { if (A -> link[i] -> name == B) {return A -> link[i] -> spot;} } }return 0; }void Printans (Node *A, char ans[], int x) { ans[x] = A -> name; int i; int j; - 10 -
  • 12. if (A -> count != 0) { printf("단어 : "); for (j=0; j<=x; j++) { printf("%c", ans[j]); } // printf("%c", A->name); printf("등장 횟수 : "); printf("%d",A->count); printf("등장 페이지 : "); for (j=0; j<26; j++) { if (A ->page[j] == 1) { printf("%d n",j+1); } } } for (i = 0 ; i < 26 ; i++) { if (A->link[i] != NULL) { if (A -> spot != 0) x+=1; Printans( A->link[i],ans,x); } else {} } return; } // 출력 초안 소스에서 오류가 발생하였는데 오류를 찾지 못하여 문자열을 배열에 옮겨풀어보기 회의내용 로 하여 분리 시켜보기로 하였음. 문자열을 배열에 옮겨 풀어 본 후 else구문을 if 구문으로 바꾼후 실행하니 오류는 발생 문제점 하지 않았음. 그러나 6글자를 넘어서 입력 될 경우 오류가발생됨. 오류를 찾으려 하였으나 찾지 못하였음. 결과 발표 #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <windows.h> #include <string.h> struct Node { char name; Node *link[26]; int page[26]; int count; int spot; }; Node addtree (Node *A, Node *B); Node AddNode (char A); Node Delnode (Node *A, char B); int Search (Node *A, char B); int Searchspot (Node *A, char B);프로그램 소스 void Printans (Node *A, char ans[], int x); int main () { int i,j,x,z; int check=0; FILE *point; char arr[100]; int a; int m=0; int Sizec; // printf("진행중"); Node *tree = (Node *)malloc(sizeof(Node)); // printf("진행중"); point=fopen("C://file.txt","r"); if(point==NULL) { - 11 -
  • 13. return 1; } while(1) //텍스트 파일에 저장되어 있는 문장들을 배열에 넣어서 저장. { a=fgetc(point); if((a>=65 && a<=90) || (a>=97 && a<=122) || (a == +)) { arr[m]=a; if(a==EOF) { break; } else { m++; } } else if(a== || a==n) { arr[m]= ; if(a==EOF) { break; } else { m++; } } else { if(a==EOF) { break; } } } fclose(point); for(i=0;i<m;i++) //배열에 저장된 문자들을 소문자로 변환하여 다시 배열에 저장. { if(arr[i]>=65 && arr[i]<=90) { arr[i]=arr[i]+32; } printf("%c",arr[i]); } fclose(point);printf("n"); Sizec = m; i = 0; j = 1; z = 0; m = 0; tree[i] = AddNode(R); for(;;) {//텍스트 파일에 저장되어 있는 문장들을 배열에 넣어서 저장. if(arr[m]>=a && arr[m]<=z) {// 알파벳이면 노드 진행// printf("%cn",arr[m]); check = Search(&tree[i],arr[m]); // 노드 있는지 확인 if (check == 0 ) { // 노드가 없으면 노드 추가 하고 아래 노드로 이동. tree[j] = AddNode(arr[m]); tree[j].spot = j;//노드 위치를 저장. tree[i] = addtree(&tree[i],&tree[j]); i = j; // i는 진행 노드 j++; // 노드 생성 위치 } else { i = Searchspot(&tree[i],arr[m]); printf("%c가 존재하여 내려갑니다.n",tree[i].name); } // 노드가 있으면 그대로 위치만 이동. } if(arr[m]== || arr[m]==n) { // 공백이나 n 일시, 카운터 증가. 그리고root로 복귀. tree[i].count++; // 단어 갯수 표기 tree[i].page[z]=1; // 등장 페이지 표기 i = 0; } if(arr[m]==+) {// 임의로 다음페이지를 나타내는 기호를 + 로 정의함. z++; - 12 -
  • 14. } if(arr[m]==EOF) {break; // 아무 것도 없을 시 종료 } if (Sizec < m) break; m++; } char ANS[50] ={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; // 영단어 최장 길이 단어는 1000자가 넘어가지만 일반적으로 50자 미만. printf("nWord Count Linesn"); Printans(&tree[0],ANS,0); // 출력 system("PAUSE"); getch(); return 0;}Node addtree (Node *A, Node *B) { for (int i = 0; i < 26 ; i++) { if (A->link[i] == NULL) { A -> link[i] = B; printf("%c의 LINK%d에 %c를 삽입 n",A -> name,i,B -> name); break; } else {} } return *A; }Node AddNode (char A) { Node *B = (Node *)malloc(sizeof(Node)); B->name = A; for (int i = 0; i < 26 ; i++) { B->link[i] = NULL; B->page[i] = 0; } B->count = 0; B -> spot = 0; return *B; }Node Delnode (Node *A, char B) { for (int i = 0; i < 26 ; i++) { if (A -> link[i] != NULL ) { if (A -> link[i] -> name == B) { A -> link[i] = NULL; printf("%c에 LINK&d에 %c를 삭제 n",A -> name,i,B); } } }return *A; }int Search (Node *A, char B) { int x = 0; int i; for (i = 0; i < 26 ; i++) { if (A -> link[i] != NULL ) { if (A -> link[i] -> name == B) { x = 1; break; } - 13 -
  • 15. } else {break;} } return x; } int Searchspot (Node *A, char B) { for (int i = 0; i < 26 ; i++) { if (A -> link[i] != NULL ) { if (A -> link[i] -> name == B) {return A -> link[i] -> spot;} } } return 0; } void Printans (Node *A, char ans[], int x) { ans[x] = A -> name; int i; int j; if (A -> count != 0 && A -> name != R ) { printf("단어 : "); for (j=0; j<=x; j++) { printf("%c", ans[j]); } // printf("%c", A->name); printf("등장 횟수 : "); printf("%d",A->count); printf("등장 페이지 : "); for (j=0; j<26; j++) { if (A ->page[j] == 1) { printf("%d n",j+1); } } } for (i = 0 ; i < 26 ; i++) { if (A->link[i] != NULL) { if (A -> spot != 0) x+=1; Printans( A->link[i],ans,x); } else {} } return; } // 출력문제화면 - 14 -
  • 16. 맨위 노드는 비움 ↓ space 부분을 기준으로 단어를 떼어내고 맨 앞 글자를 2level 노드에 넣는다. ↓알고리즘 개요 맨앞 글자가 같을 경우 그다음 하위 레벨에 다음 문자를 넣는다. ↓ 없을 경우 단어를 순서대로 한 문자씩 넣는다. ↓ 두 개의 트리(1line,2line)를 만들고 비교하여 노드를 비교 하여 출력한다 문자 입력이 6개 이상 들어가면 오류가 발생. 입력 양식은 +가 페이지 구분선이고 마지막에 띄워쓰기나 엔터를 하여야 종료. 최종 반성 균형트리의 구현과정에서 구현을 하기가 어려워서 배열로 받아서 처리하는 방식으로 사 용 하였습니다. - 15 -