연재 완료/C Lang 예제코드 모음

C언어 파일처리 주요예제 2 (고수준 파일 입출력2)

라이피 (Lypi) 2018. 6. 18. 01:06
반응형

8. 데이터 파일에서 정수를 읽은 후, 2진트리에 순서에 맞게 저장한 다음, 전위운행한 다음 정렬한 결과를 다른 파일에 정렬하여 넣는 프로그램.

#include <assert.h>
#include <stdio.h>
#include <stdlib.h>

#define LEFT 0
#define RIGHT 1

typedef int DATA;

struct node {
	DATA	d;
	node*	left;
	node*	right;
};

typedef node* BTREE;

BTREE new_node(DATA d1);
void add_node(BTREE parent, BTREE r_node, DATA d1, int r_1);
void inorder(FILE* ofp, BTREE root);

BTREE root = NULL;

int main()
{
	DATA a;
	int size = 10;
	FILE* ifp;
	FILE* ofp;


	//파일을 읽어서 트리를 만든다.
	fopen_s(&ifp, "in.txt", "r");
	
	if (ifp == NULL) {
		printf("ifp 파일을 열 수 없습니다.\n");
		return 0;
	}

	while (!feof(ifp)) {
		fscanf_s(ifp, "%03d ", &a);
		add_node(root, root, a, 0);
	}
	
	fclose(ifp);

	printf("ifp파일을 읽어서 트리를 만들었습니다.\n");


	//트리를 정렬해서 파일에 기록한다.
	fopen_s(&ofp, "out.txt", "w");
	
	if (ofp == NULL) {
		printf("ofp 파일을 열 수 없습니다.\n");
		return 0;
	}

	inorder(ofp, root);

	fclose(ofp);

	printf("트리를 전위 순회한 결과를 ofp파일에 저장했습니다.");
}

BTREE new_node(DATA d1) 
{
	BTREE t;

	t = (BTREE)malloc(sizeof(node));
	
	assert(t != NULL);

	t->d = d1;
	t->left = NULL;
	t->right = NULL;
	return t;

}

void add_node(BTREE parent, BTREE r_node, DATA d1, int r_1)
{
	if (root == NULL) {
		root = new_node(d1);
		return;
	}
	else {
		if (r_node == NULL) {
			if (r_1 == 0) {
				parent->left = new_node(d1);
			}
			else {
				parent->right = new_node(d1);
			}
		}
		else if(d1 > r_node->d) {
			parent = r_node;
			add_node(parent, r_node->right, d1, RIGHT);
		}
		else {
			parent = r_node;
			add_node(parent, r_node->right, d1, LEFT);
		}
	}
}

void inorder(FILE* ofp, BTREE root)
{
	if (root != NULL) {
		inorder(ofp, root->left);
		fprintf(ofp, "%03d\n", root->d);
		inorder(ofp, root->right);
	}
}

//트리에 대해서는 제대로 이해가 안된게 확실한듯... 결과가 좀 이상하다.



반응형