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);
}
}//트리 만드는거 그냥 예제에서 긁어옴.