프로그래밍 C언어 28

함수 포인터(Function Pointer)

이번 글은 C언어의 함수 포인터(Function Pointer)에 대해 알아보겠습니다. 함수포인터는 기존의 주소값 저장하던 포인터기능을 함수에 접목하여 함수를 호출하는 대리자의 역할을 대신하는 겁니다. 이는 C#의 대리자(delegate)와 비슷한 기능을 합니다. 컬렉션 글에서 대리자를 다룬 적이 있으니 관심이 있으시면 살펴보시면 될 것 같습니다. ㅎㅎ컬렉션(Collections) (tistory.com) 컬렉션(Collections)컬렉션이란? 아래의 기능을 사용하여 여러 개의 데이터를 하나의 구조로 그룹화하여 관리하는 기능입니다. using System.Collections;using System.Collections.Generic; //컬렉션에서 제네릭을 사용하기 위한hwangameinformati..

퀵 정렬(Quick Sort)

퀵 정렬(Quick Sort)은 효율적이고 널리 사용되는 정렬 알고리즘입니다. 주요 특징들입니다.분할 정복 방식: 배열을 정렬하기 위해 배열을 작은 부분 배열로 분할하고 각 부분 배열을 재귀적으로 정렬합니다.피벗 선택: 배열에서 하나의 요소를 피벗(pivot)으로 선택분할: 피벗을 기준으로 작은 값들을 왼쪽, 큰 값들은 오른쪽으로 분할재귀적 정렬: 분할된 두 부분 배열에 대해 재귀적으로 퀵 정렬을 수행합니다. pivot은 기존 배열에서 자주 사용한 head와 전혀 다른 형태입니다. 배열에서 head와 tail은 배열의 양 끝 고정이지만 pivot은 정렬 과정 중 해당 요소를 주기적으로 바꿔가며 오름차순을 만들어냅니다. 가장 자주 사용하는 정렬로 이름대로 빠르다는 장점이 있습니다.#include #incl..

버블 정렬(Bubble Sort)

버블 정렬은 리스트를 반복적으로 순회하며 인접한 두 요소를 비교하고, 잘못된 순서라면 교환합니다. 모든 요소를 여러 번 비교해야 하기 때문에 일반적으론 비효율적입니다. 여기서 두 요소를 비교, 교환은 앞써 쓴 글인 삽입 정렬 (Insertion Sort)과 비슷하지만 비교 방식과 에서 다른 형태를 가지고 있습니다. 그림으로 설명하겠습니다.삽입 정렬: 순차적으로 리스트를 확인하며 두 요소를 비교, 정렬하는 방식버블 정렬: 리스트를 반복 순회하며 두 요소를 비교, 정렬하는 방식즉, 버블 정렬은 리스트를 계속 순회하기 때문에 삽입 정렬보다 비효율적인 정렬 방식입니다.#include #include #include #define MAX_LEN 10// Init: Initializationvoid InitRand..

삽입 정렬 (Insertion Sort)

삽입 정렬이란 자료 구조를 순차적으로 순회하면서 순서에 어긋나는 요소를 찾고, 그 요스를 올바른 위치에 다시 삽입해나가는 정렬 알고리즘입니다.  위는 구조에 대한 예시를 그림으로 설명하는 겁니다. 왼쪽부터 오른쪽 방향으로 데이터를 읽어나가다 수가 작은 값을 왼쪽으로 옮기고 큰 값을 오른쪽으로 옮기는 형태를 취하고 있습니다. #include #include // srand, rand#include // time(NULL)#define MAX_LEN 10// _startIdx 부터 _endIdx 까지를 한 칸씩 이동void LeftMove(int* _pArr, int _startIdx, int _endIdx);void InsertionSort(int* _pArr);void main(){ // 삽입정렬..

선택 정렬(Selection Sort)

선택 정렬이란 배열을 반복적으로 순회하며 가장 작은(또는 큰) 원소를 찾아서 정렬되지 않은 부분의 시작 위치와 교환하는 것입니다.선택 정렬은 배열 전체를 한 번 읽고 거기서 가장 작은(큰) 값을 맨 왼쪽으로 옮기는 형태의 정렬 방식입니다. 배열의 크기 만큼 반복한 결과값을 가져오는 정렬입니다. #include #include #include #define MAX_LEN 5void SelectionSort(int* _pArr);void main(){ // 선택정렬(Selection Sort) // 빅-오 표기법(Big-O Notation) srand(time(NULL)); //srand: 난수 생성 함수 //time(NULL) 현재 시간 int arr[MAX_LEN] = { 0 }; //5 크기의 정..

단일 연결 목록 (Single Linked - List)

단일 연결 목록에 대해 알기 전에 노드라는 개념을 먼저 알아야할 필요가 있습니다.노드란? 데이터 구조에서 데이터와 연결 정보를 포함하는 기본 요소로, 비트와 바이트를 포함할 수 있습니다. 노드는 데이터 저장 및 연결의 역할을 합니다. 우리가 지난 글들에서 자주 다뤘던 비트와 바이트 단위의 데이터와 포인터를 포함하는 구조체를 구현합니다. 연결 리스트, 트리, 그래프 등의 데이터 구조에서 다른 노드와의 관계를 표현합니다.그림으로 설명드리겠습니다.노드는 받아들이는 데이터(Data)와 다음 노드와의 연결 정보(Next)로 구성되어있습니다. 이제 그 노드를 다루는 리스트 중에서 단일 연결 리스트에 대해 알아보겠습니다.위의 그림은 리스트를 표현한 것입니다. 풀어서 정리하겠습니다.리스트 길이: 노드의 개수리스트의 1..

스택 (Stack)

#include #include #include #include #define MAX_LEN 5int g_iarr[MAX_LEN] = { 0 };int g_curIdx = 0;void Push(int _data); //데이터 삽입용int Pop(); //데이터 제거용 (스택에서 데이터를 꺼내는 기능)void PrintAll(); //출력용inline int CheckEmpty() { return g_curIdx == 0; }inline int RandomRange(int _min, int _max){ // 70 ~ 100 return _min + rand() % (_max - _min + 1);}inline int PrintEmptyMessage() { printf("스택이 비어있음!\n"); }void..