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

C언어 연습문제 풀이 CH9 (15~19)

라이피 (Lypi) 2018. 5. 31. 23:36
반응형

15. 복소수 곱셈을 수행하는 함수를 작성하라. 이때, complex에 대한 포인터를 반환하는 함수와 complex형의 값을 반환하는 두개의 함수를 각각 작성하라.

#include <stdio.h>
#include <stdlib.h> //malloc(), free() 사용

 struct complex {
	double real_number; //실수부
	double imaginary_number; //허수부
};

 complex cp_mult(complex c1, complex c2);
 complex* cp_mult_rp(complex c1, complex c2);

int main()
{
	complex c1, c2, c3;
	complex* cp;

	printf("복소수의 곱셈을 합니다. \n");
	printf("첫번째 복소수의 실수부를 입력하세요 : "); scanf_s("%lf",&c1.real_number);
	printf("첫번째 복소수의 허수부를 입력하세요 : "); scanf_s("%lf", &c1.imaginary_number);
	printf("\n");
	
	printf("두번째 복소수의 실수부를 입력하세요 : "); scanf_s("%lf", &c2.real_number);
	printf("두번째 복소수의 허수부를 입력하세요 : "); scanf_s("%lf", &c2.imaginary_number);
	printf("\n");

	c3 = cp_mult(c1, c2);
	printf("값 반환 방식의 결과 \n");
	printf("(%g+%gi) * (%g+%gi) = %g+%gi \n",
		c1.real_number,c1.imaginary_number,c2.real_number,c2.imaginary_number,c3.real_number,c3.imaginary_number);
	printf("\n");

	cp = cp_mult_rp(c1, c2);
	printf("포인터 반환 방식의 결과 \n");
	printf("(%g+%gi) * (%g+%gi) = %g+%gi \n",
		c1.real_number, c1.imaginary_number, c2.real_number, c2.imaginary_number, cp->real_number, cp->imaginary_number);
	printf("\n");

	free(cp); //(2)
}

complex cp_mult(complex c1, complex c2)
{
	complex result;

	result.real_number = (c1.real_number * c2.real_number) - (c1.imaginary_number * c2.imaginary_number);
	result.imaginary_number = (c1.real_number*c2.imaginary_number) + (c1.imaginary_number*c2.real_number);

	return result;
	
}
complex* cp_mult_rp(complex c1, complex c2)
{
	static complex* cp = (complex*)malloc(sizeof(complex)); 	//(1)

	cp->real_number = (c1.real_number * c2.real_number) - (c1.imaginary_number * c2.imaginary_number);
	cp->imaginary_number = (c1.real_number*c2.imaginary_number) + (c1.imaginary_number*c2.real_number);

	return cp;
}

//(1)에서 동적할당을 안했더니 초기화되지 않은 지역변수를 사용했다고 하길래 (1)에서 동적할당을 하고 (2)에서 해제를 했다. 
// 잘 작동은 하는데 왜 이렇게 해야 하는지 잘 모르겠다. 해결책은 아는데 이유를 모르겠다.


16. 문자열 "congratulation"을 입력받아 연결 리스트로 변경한 후, 선형 연계 리스트의 원소중 문자 u를 제거한 후 이를 출력하는 프로그램을 작성하라.

#include <stdio.h>
#include <stdlib.h> //malloc(), free() 사용

 struct node {
	 char data;
	 node* next;
 };

 node* FstrTlist(char* str);
 void delete_u(node* head);
 void print_list(node* head);

int main()
{
	char ch[] = "congratulation";
	node* hp;

	hp = FstrTlist(ch);
	print_list(hp);
	
	delete_u(hp);

	print_list(hp);

}

node* FstrTlist(char* str)
{
	node* hp = NULL;
	node* p = hp;

	while(*str != '\0') {
		if (p == NULL) {
			p = (node*)malloc(sizeof(node));
			hp = p;
		}
		else {
			p->next = (node*)malloc(sizeof(node));
			p = p->next;
		}
		p->data = *str;
		*str++;
	}

	if (*str == '\0') {
		p->next = (node*)malloc(sizeof(node));
		p = p->next;
		p->next = NULL;
	}

	return hp;
}

void delete_u(node* head)
{
	node* p = head;
	node* dp;

	if (p->data == 'u') {
		dp = p;
		head = p->next;
		free(dp);
	}
	while (p->next->data != 'u') {
		p = p->next;
	}

	if (p->next->data == 'u') {
		dp = p->next;
		p->next = p->next->next;
		free(dp);
	}
}

void print_list(node* head)
{
	node* p = head;

	while (p->next != NULL) {
		printf("%c", p->data);
		p = p->next;
	}
	printf("\n");
}


17. 아래와 같은 헤더파일을 include하고 있을때, 다음에 주어진 2진트리의 탐색 과정(즉, inorder()의 동작 과정)을 재귀함수 측면에서 설명하라.

#define NULL 0 typedef char DATA; struct node { DATA d; node* left_off; node* right_off; }; typedef node* BTREE; void inorder(BTREE root) { if (root != NULL) { inorder(root->left_off); // (1) printf("%c", root->d); // (2) inorder(root->right_off); // (3) } }

① inorder(A)를 실행.

  ② A가 NULL이 아니므로) A-(1) 실행 : inorder(B)를 실행.

     ③ B가 NULL이 아니므로) B-(1) 실행 : inorder(B.left_off) 실행

       ④ B.left_off가 NULL이므로 아무것도 하지 않고 종료

     ⑤ B-(2) 실행 : B의 값 출력

     ⑥ B-(3) 실행 : indorder(B.right_off) 실행

       ⑦ B.right_off가 NULL이므로 아무것도 하지 않고 종료

     ⑧ inorder(B) 종료

  ⑦ A-(2) 실행 : A의 값 출력

  ⑧ A-(3) 실행 : inorder(C)를 실행

     ⑨ C가 NULL이 아니므로) C-(1) 실행 : inorder(C.left_off) 실행

       ⑩ C.left_off가 NULL이므로 아무것도 하지 않고 종료

     ⑪ C-(2) 실행 : C의 값 출력

     ⑫ C-(3) 실행 : indorder(C.right_off) 실행

       ⑬ C.right_off가 NULL이므로 아무것도 하지 않고 종료

     ⑭ inorder(C) 종료

  ⑮ inorder(A) 종료 




18. 스택(stack)에 함수 push()를 이용하여 10개의 숫자들(0~9)을 순차적으로 저장한 후, 

이를 함수 pop()으로 읽어서 이를 합산한 후에 그 결과를 화면상에 표시하는 프로그램을 선형 연계 리스트를 이용하여 작성하라.

#include <stdio.h>
#include <stdlib.h> //malloc(), free() 사용

struct node {
	int data;
	node* next;
};

const int N = 10;

node* push(node* gate,int i);
node* pop(node* gate);
void destroy(node* gate);

int main()
{
	node* door = NULL;

	for (int i = 0; i < N; i++) {
		door = push(door, i);
	}

	int sum = 0;
	int temp;

	for (int i = 0; i < N; i++) {
		temp = door->data;
		sum += temp;
		door = pop(door);
		printf("방금 튀어나온 값은 %d이고, 지금까지 나온 값들의 합은 %d입니다. \n", temp, sum);
	}
	
}

node* push(node* gate, int i)
{
	node* p = (node*)malloc(sizeof(node));

	if (gate == NULL) {
		p->data = i;
		p->next = NULL;
		gate = p;
	}
	else {
		p->data = i;
		p->next = gate;
		gate = p;
	}

	return gate;
}

node* pop(node* gate)
{
	if (gate == NULL) {
		printf("입력된 데이터가 없습니다. \n");
		return 0;
	}

	 gate->data;
	node* dp = gate;
	gate = gate->next;
	free(dp);
	return gate;
}

void destroy(node* gate)
{
	while(gate->next != NULL) {
	gate = gate->next;
	free(gate);
	}

	gate = gate->next;
	free(gate);
}


19. 배열로 저장되어 있는 자료값들로부터 2진 트리를 생성하는 함수 create_tree()를 작성하라. 

이후, main()함수에서 이를 호출함으로써 "kdhong@hankook.ac.kr"을 2진트리 형태로 저장한 다음에 

전위순(preorder)으로 방문하여 각 노드의 데이터를 화면에 출력하는 프로그램을 작성하라.

#include <stdio.h>
#include <stdlib.h> //malloc(), free() 사용
#include <assert.h>

const int N = 21;

struct node {
	char data;
	node* left;
	node* right;
};

typedef node* BTREE;

BTREE create_tree(char a[], int i, int size);
BTREE init_node(char d1, BTREE p1, BTREE p2);
BTREE new_node(void);
void preorder(node* root);



int main()
{
	char mail[N] = "kdhong@hankook.ac.kr";

	node* rt = NULL;

	rt = create_tree(mail, 0, N);

	preorder(rt);
}

//create a linked binary tree from an array
BTREE create_tree(char a[], int i, int size)
{
	if (i >= size) {
		return NULL;
	}
	else {
		return (init_node(a[i], create_tree(a, 2 * i + 1, size), create_tree(a, 2 * i + 2, size)));
	}
}

//initialize a node in a binary tree
BTREE init_node(char d1, BTREE p1, BTREE p2)
{
	BTREE t;

	t = new_node();
	t->data = d1;
	t->left = p1;
	t->right = p2;

	return t;
}

//create a new node
BTREE new_node(void)
{
	BTREE t;

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

	return t;
}

void preorder(node* root)
{
	if (root != NULL) {
		printf("%c", root->data);
		preorder(root->left);
		preorder(root->right);
	}
}

//트리 만드는거 그냥 예제에서 긁어옴.

반응형