전체 글 127

[C언어] 동적할당 사용 예제

코드 설명 입력받을 정수의 개수 정하기(입력받기) (scanf_s) 개수만큼 정수 입력하기 (scanf_s) 문자 배열을 선언하여 정렬 중 로딩 화면 출력하기 (char* dot [], char* loading []) 사용자가 종료할 때까지 반복하기 위해 while문 사용 goto문을 사용하여 선택지에 없는 번호를 입력했을 경우 다시 정렬 선택 코드로 올라가기 Windows 헤더 파일을 include 하여 "system(cls);"를 사용 -> 화면 클리어 마지막으로 free함수로 메모리 해제 정렬 방법 선택하기(오름차순, 내림차순 -> 따로 void함수 만들기) 이중 for문 사용 값을 임시 저장할 변수 temp를 선언하여 값 비교 후 저장 #include #include #include void so..

C언어 2021.09.07

[C언어] 동적할당 (dynamic allocation)

동적 할당(dynamic allocation) 동적 할당은 힙 영역에 동적으로 메모리를 할당하는 것을 말합니다. 힙 영역은 메모리 할당과 해제가 자유롭습니다. 하지만 메모리 해제( free() )는 제대로 해줘야 합니다. 메모리 해제를 하지 않을 경우 메모리 낭비가 일어나게 됩니다. malloc() 이외에도 calloc(), realloc() 등이 있습니다. 자료형* 포인터명 = (자료형*)malloc(sizeof(자료형)*크기); //사용법1 자료형* 포인터명 = (자료형*)malloc(크기); //사용법2 동적 할당 초기화(clear allocation) -> calloc() 자료형* 포인터명 = (자료형*)calloc(크기, sizeof(자료형)); 동적 할당 크기 변경(resize allocati..

C언어 2021.09.06

[자료구조 - C언어] 재귀함수(Recursion) - Factorial, fib, Hanoi

재귀 함수 (Recursion) 재귀 함수는 자기 자신을 참조하는 함수입니다. Factorial과 Fibonacci, Tower of Hanoi는 반복 루프를 사용하는 것보다 재귀 함수를 사용할 때 코드를 더 간단하게 이해하기 쉽게 작성할 수 있습니다. 다만 재귀 함수를 사용하면 메모리에 스택이 계속 쌓이게 되어 효율성은 약간 떨어집니다. 또한, 재귀 함수를 사용할 때는 꼭 탈출구(종료 조건)를 넣어 줘야 합니다. 재귀 함수의 예시 팩토리얼(Factorial) 재귀 함수의 가장 간단한 예시는 팩토리얼이라고 할 수 있습니다. loop문 사용 (fact) -> ret *= i을 사용하여 팩토리얼 구하기 재귀 함수 사용 (fact_re) -> n * fact_re(n - 1)을 리턴하여 팩토리얼 구하기 #in..

[자료구조 - C언어] 정렬(Sort) - Bubble, Insertion, Selection

Bubble Sort (버블 정렬) -> 서로 인접한 두 값을 비교하여 정렬하는 알고리즘 오름차순으로 정렬할 때, 두 값을 비교하여 더 작은 값을 앞에 위치시킨다. 1회전 정렬을 끝내면 가장 큰 값이 가장 마지막에 위치하게 된다. 2회전, 3회전 반복될수록 그다음으로 큰 값의 위치가 정해진다. Ex) 8, 1, 6, 3, 2 정렬하기 #include #include #define ASIZE 5 void bubble_print(int* array, int size) { for (int n = 0; n < size; n++) { printf("%d ", array[n]); } printf("\n"); } int main(int argc, char* argv[]) { int array[ASIZE] = { 8,..

C언어 2021.08.30

[자료구조 - C언어] 큐(Queue)

Queue - FIFO(First In First Out) 형식 큐(queue)는 스택과 반대로 입구와 출구가 나뉘어 있습니다. 즉, 가장 먼저 들어온 자료가 가장 먼저 나가게 되는 형식입니다. 1 #include 2 #include 3 4 typedef struct node{ 5 char value; 6 struct node *prev; 7 struct node *next; 8 }NODE; 9 10 typedef struct _queue{ 11 NODE *head; 12 NODE *tail; 13 }QUEUE; 14 15 QUEUE *queue_create(){ 16 QUEUE *queue; 17 queue = (QUEUE*)malloc(sizeof(QUEUE)); 18 19 queue->head = ..

[자료구조 - C언어] 스택(Stack)

Stack - LIFO형식 스택에서는 자료를 넣고 빼는 곳이 하나만 있는 LIFO(Last In First Out) 형식이다. 즉, 제일 처음 들어간 자료가 가장 마지막에 나오게 된다. #include#include #include typedef struct node{ char value; struct node *next; }NODE; NODE *stack_push(NODE *top_node, char value){ NODE *new_top_node = NULL; new_top_node = (NODE*)malloc(sizeof(NODE)); new_top_node->value = value; new_top_node->next = top_node; return new_top_node; } NODE *sta..

[자료구조 - C언어] Linked List(3) - delete

Delete - 노드 삭제하기 delete_node : 인덱스 값과 삭제할 노드의 개수를 입력하여 해당 노드를 삭제함. #include #include typedef struct node { char value; struct node *next_node; }NODE; NODE *create_node(char v){ NODE *mynode; mynode = (NODE*)malloc(sizeof(NODE)); mynode->value = v; mynode->next_node = NULL; return mynode; } void append_node(NODE* h, NODE* n) { struct node *tail; if (h == NULL || n == NULL) return; tail = h; while..

[자료구조 - C언어] Linked List(2) - create, insert

사용된 함수 create_node : 동적 메모리를 할당받아 메인 함수에서 입력받은 값을 구조체 멤버 변수(value)에 대입함. append_node : tail노드에 새로운 노드를 붙이는 역할을 함. prepend_node : head노드 앞에 새로운 노드를 붙이는 역할을 함. print_node : 생성된 노드를 출력함. Create - 노드 생성하기 - 배열을 이용하여 "string"으로 노드 구성하기 - #include #include typedef struct node { char value; struct node* next_node; }NODE; NODE* create_node(char v) { NODE* mynode; mynode = (NODE*)malloc(sizeof(NODE)); //..

[자료구조 - C언어] Linked List

Array대신 Linked List를 사용하는 이유는 무엇일까? 예를 들어, char arr[6] = "linked"; 이런 배열이 있다고 하자. 0~5까지의 배열 칸에 알파벳이 하나씩 들어가 있을 것이다. 여기서 'n'을 삭제하려면 'n' 삭제하고 뒤에 있는 나머지 배열 칸의 값들을 전부 복사하여 한 칸씩 앞에 넣어 줘야 한다. 이렇게 배열 인덱스를 바꿔 주는 것은 번거롭고 복잡하기 때문에 "링크드 리스트(Linked List)"를 사용하여 추가, 삭제 등 각 노드의 수정을 용이하게 한다. 연습하기 1 헤드 노드 하나만 생성하여 값을 넣고 다음 노드에는 NULL로 설정하기 #include typedef struct node { char value; struct node *next_node; }NODE;..

[C언어] 로또 번호 뽑기

976회차 당첨번호 : 4, 12, 14, 25, 35, 37 + 2(보너스 번호) 난수 사용(srand, rand, time.h) goto문 사용 : goto문은 코드 길이를 줄여주지만 가독성이 아주 떨어집니다. Sleep() 함수 사용 / Windows 헤더 파일 include * srand와 rand의 차이점 srand는 일련의 규칙성을 가지고 난수를 생성하고, rand는 규칙성 없이 여러 개의 패턴으로 난수를 생성합니다. 로또 번호 추출하기 #include #include #include #include void sortArr(int* lotto, int length) { //난수로 추출한 번호 정렬 for (int i = 0; i < length - 2; i++) { for (int j = i ..

C언어 2021.08.17