1. 과제 목표- 입력파일로 주어진 n개의 양의 정수들을 읽어 binary search tree를 구성하라. 입력 파일의 첫째줄에는 읽어야 할 정수들의 개수 n이 주어지고 그 다음 n개의 줄에 양수인 정수가 한 줄에 하나씩 주어진다.2. 설계- 이번 과제는 이진 트리의 대표적인 한 형태인 이진 탐색 트리를 구성하는 함수들을 구현하는 것이었습니다. 트리의 노드는 구조체로 선언했으며 데이터는 정수형 변수로 선언했습니다. 입력 파일은 input.txt에서 각 값을 읽어 들이도록 했는데, 모든 입력 값을 버퍼에 일단 읽어들인 후, 다시 버퍼를 순회하며 노드 추가 함수로 이진 탐색 트리에 추가되도록 했습니다.3. 결과 보고- 입력 파일은 같은 폴더 내의 input.txt로 열도록 지정했습니다.(input.txt의 내용)(코드를 실행한 결과)4. 자료구조 및 알고리즘 분석#define IS_FULL(node) !node#define MAX_TERMS 100// 노드타입 및 포인터타입 선언typedef struct Node* NodePointer;typedef struct Node{NodePointer leftChild;int key;NodePointer rightChild;} Node;가장 먼저 이진 탐색 트리를 구성할 노드 타입을 선언했습니다. 각각 왼쪽 자식 링크와 오른쪽 자식 링크, 그리고 정수형 데이터 변수를 가지고 있습니다. MAX_TERMS는 입력 파일에서 읽은 값들을 트리에 삽입하기 전 임시 저장하는 버퍼 기능을 하는 배열의 크기를 나타냅니다.직접적으로 MAX_TERMS가 동적 노드 생성에 영향을 주는 것은 아니지만 결국 입력된 버퍼를 거쳐 값들을 트리에 삽입하므로 결론적으로 최대 노드 개수를 MAX_TERMS로 제한하게 됩니다.
1. 과제 목표- 입력 파일에 주어진 그래프의 adjacency list를 읽고 그 그래프에 대한 Biconnected components를 구한다.2. 설계- 이번 과제는 입력 파일을 통해 그래프의 adjacency list를 읽어들이고, 이를 설계한 그래프 자료구조로 옮긴 후, 교재를 참고해 biconnected components를 구하는 내용이었습니다. 해당 함수에서 스택을 사용하는 부분에 대해서는, Linked Representation으로 구현된 스택을 사용하였습니다 (6주차 과제 구현 내용에서 일부 참고).3. 결과 보고- 입력 파일은 같은 폴더 내의 input.txt로 열도록 지정했습니다.input.txt에서 input 파일을 읽어 들여 graph 자료구조로 추가하는 단계입니다.
1. 과제 목표- 두 개의 스트링(string, pat)을 입력으로 받아 pattern matching을 하는 KMP 알고리즘을 구현하시오.2. 설계- 스트링 안에 원하는 패턴을 찾는 가장 단순한 방법은 한 칸씩 대입하며 틀린 경우 1칸을 이동하여 다시 패턴의 처음부터 비교하는 경우입니다. 이 때의 복잡도는 스트링의 길이 M, 패턴의 길이 N이라고 했을 때, O(n*m)이 됩니다.- 본 과제에서는 같은 작업에 대해 복잡도를 O(n+m)까지 줄일 수 있는 KMP 알고리즘 (KnuthMorris-Pratt Algorithm)을 강의자료에서 소개된 코드 그대로 사용했습니다. 사용한 자료 구조로는, 검색할 문자열 string과 패턴 문자열 pat, 그리고 정수형 failure 세 개의 배열을 사용했습니다.3. 결과 보고- Input으로 주어진 kmp.txt의 내용을 확인한 결과입니다.4. 자료구조 및 알고리즘 분석- MAX_STRING_SIZE와 MAX_PATTERN_SIZE는 각각 100으로 설정했으므로 찾을 문자열과 패턴은 100글자 이내의 배열로 선언됩니다. 함수는 failure 배열의 값을 설정하는 fail 함수와, 생성된 failure 배열의 값을 이용해 실제 패턴을 매칭하는 pmatch 함수로 나뉩니다.파일 입출력을 통해 찾을 문자열과 패턴 문자열을 입력 받는 부분입니다. 또한 pat을 주소값 형태로 fail 함수에 넘긴 후 처리가 끝나면 pmatch 함수의 정수로 반환되는 결과값이 그대로 출력되도록 넘겨주었습니다.
1. 과제 목표- Threaded binary tree가 주어졌을 때, 명시된 node의 오른쪽에 새로운 node를 삽입하는 함수를 구현하라. 노드의 삽입이 완료된 threaded binary tree는 inorder traversal를 사용하여 threaded binary tree가 잘 구성되어 있는지 확인한다.2. 설계- 이번 과제는 이진 트리의 종류 중 하나인 스레드 이진 트리 구조를 Linked Representation으로 구현하고, 주어진 대로 노드를 구성한 후, 미리 작성된 노드 추가 함수의 나머지 부분을 채워 코드를 작성하는 내용이었습니다. 원래 이진 트리의 노드 타입을 선언할 때 필요한 필드는 각각 왼쪽과 오른쪽 자식으로의 링크, 그리고 데이터 필드입니다. 하지만 한 가지 비효율적인 점은, 메모리 상에 존재하는 이진 트리의 노드들 중에서 리프 노드의 경우는 양쪽 자식 링크를 전혀 사용하지 못한 채로 존재한다는 점입니다. 따라서 이러한 리프 노드의 비 할당 링크를 각각 해당 노드의 중위 순회의 선행자, 후속자로 연결하면 활용도를 높일 수 있지 않을까 하는 것이 스레드 이진 트리의 개념입니다.- 본 과제에서는 강의 및 강의 교재에서 스레드 이진 트리에 대해 정의한 형태대로 구현을 따라갔으며, 강의 내용에는 나오지 않았지만 프로그램 종료 직전 사용한 메모리를 순회하며 해제하는 함수까지 구현하였습니다.3. 결과 보고- 과제 요구사항에 나온 노드들을 구현하였는데 디버깅 중에 construct_tree() 함수가 끝난 직후와 모든 노드의 추가가 끝난 직후 두 시점에서 tinorder() 함수의 출력값을 캡쳐하였습니다.4. 자료구조 및 알고리즘 분석가장 먼저 정의한 스레드 이진 트리를 구성할 노드 타입의 선업입니다. 각각 왼쪽 자식 링크와 오른쪽 자식 링크 외에 스레드 여부를 가리키는 Boolean 형태의 값을 더 가지고 있는데, 스레드 기능으로 링크가 작동할 시 해당 방향의 링크는 자식 링크의 포인터를 그대로 사용
1. 과제 목표- Linked List로 Sparse Matrix 구조를 구현하고, 주어진 두 개의 파일에서 행렬을 각각 입력받아 처리하는 프로그램을 작성하시오.2. 설계- 이번 과제는 주어진 파일에서 각각 행렬에 대한 정보를 얻되, 이를 배열이 아닌 각각의 노드가 링크드 리스트의 노드 형태로 이어진, 0이 아닌 요소의 데이터만을 갖는 희소 행렬 형태로 처리하는 코드를 구현하는 것이었습니다. 각각의 기능을 모듈화해, mread() 함수로 파일에서의 입력을 처리하고 mwrite() 함수를 통해 행렬 데이터의 시각화 기능을 처리했으며 merase() 함수로 사용한 동적 메모리의 해제 기능을 나누었습니다. 수업시간에 넘어갔던 부분이라 평소보다 더 디버깅하는데 힘들었지만, 평소 헷갈리던 부분이라서 이 과제를 통해 이해가 한층 깊어진 것 같아 뿌듯합니다. 코드에 대한 설명은 4. 자료구조 및 알고리즘 분석에서 이어지겠습니다.3. 결과 보고- Input으로 주어진 A.txt와 B.txt의 정보를 입력으로 사용한 결과입니다.4. 자료구조 및 알고리즘 분석row가 n이고 col이 m인 행렬이 가지는 이차원 배열의 표현은 반드시 n * m만큼의 공간을 차지한다. 이에 비해 sparse matrix 형태의 표현은 0이 아닌 요소들만을 표현하므로 메모리의 낭비가 적다. 본 코드에서는 해당 요소들을 각각 노드로 구성하고 각각을 링크로 연결시켜줌으로써 전체적으로 링크드 리스트의 형태를 구성하였다. entryNode 같은 경우 요소들이 갖는 최소한의 정보인 행, 열, 그리고 변수값을 가지도록 하는 struct이며, 노드는 이를 포함함과 동시에 다른 노드들을 가리키는 링크를 가지는 matrixNode로 선언하였다. 이 때, 링크는 오른쪽과 아래쪽을 가리키는 down과 right의 값을 가진다.