다항식의 계산 (링크 더 리스트)과목명데이터 구조담당교수님황수찬교수님학과정보통신과학번2006122257이름정치욱제출일2009.10.261.문제 개요희소 행렬을 다중리스트를 이용하여 저장한다.1.다중 리스트를 이용한 희소행렬 자료구조2.저장된 희소행렬을 출력3.저장된 희소행렬의 I행 J열의 원소를 출력4.I행 J열에 특정 원소를 변경(I행 J열의 원소의 값이 0 이된다면 해당 노드 삭제)5.입력 및 출력 함수 연산자 오버로드2.분석 및 알고리즘A.문제 분석희소행렬 즉 값을 가지는 원소의 개수가 전채원소의 갯숩다 훨신 적은 행렬을 이중 리스트를 이용아여 저장하는 문제입니다. 이중 리스트를 구현하는 부분은 어렵기에 책에 나와있는 코드를 이용하여 구현을 했으며 해당 행 헤드 노드와 열 헤드 노드를 찾아가는 방법으로 행렬의 원소을 조작하고 출력하였습니다.=출력 함수 알고리즘=1.temp 에 1행 헤드 노드를 기억하며 temp 가 행렬의 헤드 노드를 가르킬때까지 반복합니다.a.lastcol의 값을 0으로 만들어 줍니다.btemp노드의 right가 temp 일 경우는 그 행이 비어있는 노드이기에 행렬의 열 개수만 큼 0을 출력해주고 2행으로 넘어갑니다.c.last에 temp의 right을 저장해줍니다d.last가 temp를 가르킬때까지 아래의 문장을 반복합니다.I)만약 lastcol보다 현재 last노드의 열성분이 크다면 last col 가 last 노드의 열성분이 될 때까지 0을 출력해 줍니다.II)last 노드의 값을 출력합니다.III)lastcol값을 1늘려급니다.e.만약에 아직도 lastcol이 행렬의 열값보다 작다면 행렬의 열값이 될 때까지 0을 출력해줍니다.2temp에 자기 자신의 next를 기억하고 1번 문장으로 돌아갑니다.=특정 원소 ij의 값을 반한하는 함수 알고리즘=1. i행 해드 노드를 찾아값니다.2. i행 해드노드를 한바퀴 검색하는데 검색하는 도중 열 성분이 j를 가지는 노드가 존재할 경우 그 값을 반환해준후 함수를 종료합니다.3. 한바퀴 도는 동안 열 성분이 j를 가지는 노드를 못찾았을 경우 0을 반환해줍니다.=특정 원소 ij의 값을 변경하는 함수 알고리즘-1.i행 해드 노드를 찾아갑니다.2.i행 해드 노드를 한바퀴 검색하는데 열성분이 j인 노드를 찾는다면 해당 노드의 값을 출력해주고 변경할 값을 입력 받습니다. 만약 0을 입력한다면 해당 노드를 이중 리스트에서 제거해줍니다.3.한바퀴 검색하는데 j인 노드를 찾지 못했다면 해당 노드의 값을 0으로 간주하고 0을 출력해주고 변경할 값을 입력받습니다.3.CODE&주석#include#includeusing std::istream;using std::ostream;using std::cin;using std::cout;using std::endl;int max(int a,int b);struct Triple{int row,col,value;};class Matrix;class MatrixNode{friend class Matrix;friend istream& operator>>(istream&,Matrix&);friend ostream& operator(istream&,Matrix&);friend ostream& operatortriple.row || col > headnode->triple.col ){couttriple.col == col)return last->triple;return empty;}void Matrix::transmatrix(int row,int col){Triple empty;MatrixNode *temp;MatrixNode *last;MatrixNode *lastrow;MatrixNode *lastcol;MatrixNode *delnode;int i=0;empty.col=0,empty.row=0,empty.value=0;if(row > headnode->triple.row || col > headnode->triple.col ){couttriple.col == col){cout>s.value;//행렬의 차수int p = max(s.row,s.col);matrix.headnode = new MatrixNode(false,&s);if(p==0){matrix.headnode ->right = matrix.headnode;return is;}//적어도 하나의 행이나 하나의 열MatrixNode **head = new MatrixNode*[p];for(int i=0;it.row>>t.col>>t.value;if(t.row > s.row || t.col > s.row){cout currentRow){last -> right = head[currentRow];currentRow = t.row;last = head [currentRow];}last = last->right = new MatrixNode(false,&t);head[t.col]->next = head[t.col]->next->down =last;}last->right = head[currentRow];for(i=0;inext->down=head[i]; //모든 열 리스트를 마감//해더노드들을 모두 연결for(i=0;inext=head[i+1];head[p-1]->next = matrix.headnode;matrix.headnode->right=head[0];delete []head;return is;return is;};ostream& operatornext){lastcol=0;if(temp->right == temp)//비어있는 행일경우에 0을 쭉 출력for( ; lastcol < matrix.headnode->triple.col ; lastcol++)cout
쓰레드 노드를 사용한 탐색 트리의 구현과목명데이터 구조론담당교수님황수찬 교수님학과정보통신과학번2006122257이름정치욱제출일2009.11.81.문제개요이번 레포트는 이진 탐색트리를 구현하며 마지막 단말노드를 쓰레드 노드화 시키는 것입니다.이번 레포트를 해결하기위해 책에 있는 탐색 트리 코드를 참고하였으며 탐색트리에서 노드의 삽입 부분을 쓰래드 노드 삽입화 시켰습니다. 그리고 쓰레드 노드 삽입 함수를 만들 때에 탐색 트리는 항상 가장 마지막 단말 노드의 삽입임으로 노드 중간에 삽입됨까지 정의 되어있는 함수를 변형 시켰습니다.그리고 트리 아이토레이션을 사용하여 트리 함수를 제작할 때 (예를 들자면 출력함수) 편리하게 사용 하였습니다.마지막으로 입력은 문자열로 받았으며 strtok 함수를 사용하여 공백단위로 잘라내어 트리에 입력해주었습니다.2.분석 및 알고리즘이번 프로그램의 코드 중에 사용된 알고리즘 중에 중요한 탐색트리 구현 함수와 쓰레드 노드 삽입 함수에 대한 알고리즘을 설명하겠습니다.= 탐색 트리 구현 함수(노드 삽입 함수) =1. root 노드부터 숫자를 탐색해 내려갑니다.2. 입력된 함수가 현재 노드의 함수보다 작으면 왼쪽 크면 오른쪽으로 내려갑니다.3. 내려가려는 노드가 현재 비워져 있다면 쓰레드 노드 삽입 함수를 이용해서 노드를 삽입 합니다.4. 만약 이번이 처음 입력이라면 root 노드는 현재 노드를 가리킵니다.= 쓰레드 노드 삽입 함수 =-왼쪽 삽입과 오른쪽 삽입은 중복 되는 부분이 많으므로 오른쪽 삽입 함수만 설명 하겠습니다.1.부모 노드의 오른쪽 자식을 자식 노드의 오른쪽 자식에 저장합니다.2.자식 노드의 오른쪽 쓰레드와 왼쪽 쓰레드를 참으로 만듭니다. ( 처음 삽입되는 노드의 오른 자식과 왼쪽 자식은 모두 쓰레드 노드이기 때문입니다. )3.자식 노드의 왼쪽 자식에 부모 노드를 연결시킵니다.4.부모 노드의 오른쪽 자식을 자식노드와 연결시킵니다.5.부모 노드의 오른쪽 쓰레드를 거짓으로 만듭니다.(자식 노드를 가지기 때문에 더 이상 쓰레드 노드가 아니기 때문)6.만약 부모노드가 루트 노드라면 자식노드의 오른 자식과 왼쪽자식은 모두 root를 가리킵니다.3. 소스 & 주석#includeusing std::cout;//사용할 함수들 미리 선언using std::endl;using std::cin;templateclass SortNum;//전방선언templateclass ThreadIterator;templateclass ThreadedNode{//threaded node 정의friend class SortNum;friend class ThreadIterator;private:K data;ThreadedNode *leftChild;ThreadedNode *rightChild;bool leftThread;bool rightThread;public:ThreadedNode(K _data){data=_data;leftChild = NULL;rightChild = NULL;leftThread = true;rightThread = true;}};template//탐색 tree(뜨레드 노드 사용)class SortNum{private:ThreadedNode* root;public:SortNum(){root = new ThreadedNode (0);root -> rightChild = root;}void Insert(const K&);void Insertright(ThreadedNode *s,ThreadedNode *r);void Insertleft(ThreadedNode *s,ThreadedNode *r);void Show();};templatevoid SortNum::Show()//출력함수{//K* temp2;ThreadIterator temp(root);coutleftChild = s;r->leftThread = true; //leftChild 는 스레드;s->rightChild = r;s->rightThread = false;if(s == root){r->rightChild = root;r->leftChild = root;}}templatevoid SortNum::Insertleft(ThreadedNode *s,ThreadedNode *r){r->rightChild = s ;r->rightThread = s ->rightThread; //이진 탐색 트리에서는 무조건 가장 아래에 저장됨으로r->leftChild = s ->leftChild;r->leftThread = true; //leftChild 는 스레드;s->leftChild = r;s->leftThread = false;if(s == root){r->leftChild = root;r->rightChild = root;}}templateclass ThreadIterator//iterator 구현{ThreadedNode *currentNode;//현재의 nodeThreadedNode *root;//처음입력받은 nodepublic:ThreadIterator(ThreadedNode *start = NULL){currentNode = start;root = start;Next();}K* Next();//next nodeK operator*();//data 전송 함수bool operator!();//끝인지 확인해주는 함수};templateK* ThreadIterator::Next()//다음 노드를 검색해주는 함수{ThreadedNode *temp = currentNode->rightChild;if(!currentNode->rightThread)while(!temp->leftThread)temp = temp -> leftChild;currentNode = temp;if(currentNode == root)return 0;else return ¤tNode->data;}templateK ThreadIterator::operator*(){return currentNode->data;//현재노드의 자료를 반환}templatebool ThreadIterator::operator!(){if(currentNode == root) return false;else return true;//한바퀴 다 돌았슴을 확인해주는 bool 반환}void main(){SortNum test;int choice;while(1){cout