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