'컴퓨터 과학 > 자료구조' 카테고리의 다른 글
[자료구조] 6. 동적 메모리 할당 (3) | 2018.12.12 |
---|---|
[자료구조] 5.포인터 (1) | 2018.12.12 |
[자료구조] 4.구조체 (0) | 2018.12.11 |
[자료구조] 3.배열 (0) | 2018.12.11 |
[자료구조] 2. 순환 (1) | 2018.11.29 |
[자료구조] 6. 동적 메모리 할당 (3) | 2018.12.12 |
---|---|
[자료구조] 5.포인터 (1) | 2018.12.12 |
[자료구조] 4.구조체 (0) | 2018.12.11 |
[자료구조] 3.배열 (0) | 2018.12.11 |
[자료구조] 2. 순환 (1) | 2018.11.29 |
1. 동적 메모리 할당의 개념
프로그램 실행 중에 필요한 만큼 메모리를 확보하여 사용하는 것을 메모리 할당이라고 한다.
또 사용이 끝나면 메모리를 반납하는 것을 메모리 해제라고 한다.
이렇게 메모리를 할당받는 방법에는 크게 정적과 동적의 두 가지가 있다.
1 ) 정적 메모리 할당
정적 메모리 할당은 프로그램이 시작되기 전에 미리 정해진 크기의 메모리를 할당받는 것을 말한다.
프로그램 시작전에 메모리 크기를 아는 경우 사용하며 프로그램 실행 중에 크기가 변경될 수 없다.
ex )
1
2
3
4
5
6
7 |
#include<stdio.h>
int main(){
int a[10];
} |
cs |
2 ) 동적 메모리 할당
동적 메모리 할당은 프로그램 실행 중에 메모리를 할당받는 것을 말한다.
필요한 만큼의 메모리를 할당받아 사용할 수 있으며 사용이 끝나면 메모리를 반납해야된다.
-> 매우 효율적
동적 메모리 할당과 해제를 하기위해 사용하는 함수는 크게 3개다.
malloc(int size) : 메모리 할당
free(void *ptr) : 메모리 할당 해제
sizeof(var) : 변수난 타입의 크기 반환
ex)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 |
#include<stdio.h>
#include<malloc.h>
int main(){
int *ipt;
int i;
ipt = (int *)malloc(sizeof(int));
*ipt = 123;
printf("*ipt = %d, %u \n", *ipt, ipt);
free(ipt);
ipt = (int *)malloc(sizeof(int)*5);
for(i=0;i<5;i++){
ipt[i] = i+1;
printf("ipt + %d = %u, %d\n", i, ipt+i, ipt[i]);
}
free(ipt);
} |
cs |
[컴퓨터 과학 총론] 컴퓨터 과학 총론 (0) | 2021.03.12 |
---|---|
[자료구조] 5.포인터 (1) | 2018.12.12 |
[자료구조] 4.구조체 (0) | 2018.12.11 |
[자료구조] 3.배열 (0) | 2018.12.11 |
[자료구조] 2. 순환 (1) | 2018.11.29 |
1. 포인터의 개념
- 포인터 변수 : 다른 변수의 주소를 가지고 있는 변수
- 포인터의 연산자
포인터의 연산자에는 번지연산자 ( & ), 간접연산자 ( * )가 있다.
( 번지연산자와 간접연산자는 단항 연산자이기 때문에 연산우선순위도 단항 연산자와 같다. )
ex ) &충북대 = 123 (번지)
*123 = 충북대
- 포인터 변수를 사용하는 이유
컴퓨터는 모든 값을 번지로 변환하여 처리한다.
예를 들어 a = 3 + b ; 를 처리할때
컴퓨터는 *100 = 3 + *104 ; 이렇게 변환하여 처리하기 때문에
명칭이 아닌 번지를 직접 사용하면 효율적인 프로그램을 만들 수 있다.
- 포인터 사용
다음은 간단하게 포인터 변수를 사용하여 출력하는 소스이다.
1
2
3
4
5
6
7
8 |
#include<stdio.h>
int main(){
int a = 100, b = 200;
int *p;
p = &a;
printf("*p = %d \n", *p);
} |
cs |
2. 배열과 포인터
배열의 이름이 배열의 시작 부분을 가리키는 포인터이다.
3. 구조와 포인터
구조체의 멤버에 접근하는 표기법은 "->"이다.
4. 포인터의 포인터
포인터도 변수이기 때문에 포인터의 포인터 선언도 가능하다.
1
2
3
4
5
6
7
8
9 |
#include<stdio.h>
int main(){
int a;
int *p;
int *pp;
p = &a;
pp = &p;
} |
cs |
[컴퓨터 과학 총론] 컴퓨터 과학 총론 (0) | 2021.03.12 |
---|---|
[자료구조] 6. 동적 메모리 할당 (3) | 2018.12.12 |
[자료구조] 4.구조체 (0) | 2018.12.11 |
[자료구조] 3.배열 (0) | 2018.12.11 |
[자료구조] 2. 순환 (1) | 2018.11.29 |
1. 구조체의 개념
구조체 : 타입이 다른 데이터를 묶는 방법
( 배열은 타입이 같고 구조체는 타입이 다르다 )
2. 구조체의 대입과 비교
아래 소스와 같이 C언어는 구조체 변수를 다른 구조체 변수로 대입 가능하다.
1 2 3 4 5 6 7 8 9 10 11 12 | #include<stdio.h> typedef struct person{ char name[100]; int age; }person; int main(){ persion a, b; b = a; } | cs |
하지만 구조체 변수끼리 비교하는 것은 불가능하여 비교하려면 직접 함수를 만들어 사용해야 된다.
[자료구조] 6. 동적 메모리 할당 (3) | 2018.12.12 |
---|---|
[자료구조] 5.포인터 (1) | 2018.12.12 |
[자료구조] 3.배열 (0) | 2018.12.11 |
[자료구조] 2. 순환 (1) | 2018.11.29 |
[자료구조] 1.자료구조의 개념 (1) | 2018.11.29 |
1. 배열의 개념
배열 : 같은 자료형을 가진 연속된 메모리 공간
2. 배열의 응용 - 다항식
다항식을 배열로 표현하는 방법에는 두 가지 방법이 있다.
1 ) 모든 계수를 순서대로 배열에 저장하는 방법
ex) 5X^2 + 4X + 1
5 |
4 |
1 |
-> 덧셈 방법 (두 번째 방법보다는 간단)
#include#define MAX(a,b) ((a>b)?a:b) #define MAX_DEGREE 100 typedef struct{ int degree; //차수 int coef[MAX_DEGREE]; //계수 }polynomial; polynomial poly_add(polynomial A, polynomial B){ polynomial C; int A_index=0, B_index=0, C_index=0; int A_degree=A.degree; int B_degree=B.degree; C.degree = MAX(A.degree, B.degree); while(A_index<=A.degree && B_index <=B.degree){ if(A_degree > B_degree){ C.coef[C_index++] = A.coef[A_index++]; A_degree--; } else if(A_degree == B_degree){ C.coef[C_index++]=A.coef[A_index++]+B.coef[B_index++]; A_degree--; B_degree--; }else{ C.coef[C_index++] = B.coef[B_index++]; B_degree--; } } return C; } int main(){ polynomial a = { 4, {1,2,3,4,5}}; polynomial b = { 3, {1,2,3,4}}; polynomial c = poly_add(a,b); printf("%d %d %d %d %d",c.coef[0], c.coef[1], c.coef[2], c.coef[3], c.coef[4]); }
2) 0이 아닌 계수들을 (계수, 차수)의 형식으로 구조체 배열에 저장하는 방법
ex) 5X^3 + 4X + 1
5 |
4 |
1 |
3 |
1 |
0 |
다항식에 따라서 첫 번째 방법이 공간을 많이 차지할 수도 있고 두 번째 방법이 공간을 많이 차지할 수도 있다.
3. 배열의 응용 - 희소행렬
희소 행렬이란 행렬의 값이 대부분 0인 경우를 말한다.
이러한 행렬을 배열로 표현하는 방법에는 두 가지가 있다.
1) 2차원 배열을 사용하여 모든 항을 표현하는 방법
ex) A = 1 2 0
0 0 6
7 0 0
1 |
2 | 0 |
0 |
0 | 6 |
7 |
0 |
0 |
-> 덧셈 방법 (두 번째 방법보다는 간단)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #include<stdio.h> #define ROWS 3 #define COLS 3 void matrix_add(int A[ROWS][COLS], int B[ROWS][COLS], int C[ROWS][COLS]){ int r,c; for(r=0;r<ROWS;r++){ for(c=0;c<COLS;c++){ C[r][c] = A[r][c] + B[r][c]; } } } int main(){ int array1[ROWS][COLS] = {{1,2,0},{0,0,6},{7,0,0}}; int array2[ROWS][COLS] = {{0,2,1},{6,0,0},{0,0,7}}; int array3[ROWS][COLS]; matrix_add(array1, array2, array3); printf("%d %d %d\n", array3[0][0], array3[0][1], array3[0][2]); printf("%d %d %d\n", array3[1][0], array3[1][1], array3[1][2]); printf("%d %d %d\n", array3[2][0], array3[2][1], array3[2][2]); } | cs |
2) 항이 0이 아닌 요소들만을 (행, 열, 값)으로 표현하는 방법
ex) A = 1 2 0
0 0 6
7 0 0
0 |
0 |
1 |
0 | 1 |
2 |
2 |
3 |
6 |
3 |
0 | 7 |
[자료구조] 6. 동적 메모리 할당 (3) | 2018.12.12 |
---|---|
[자료구조] 5.포인터 (1) | 2018.12.12 |
[자료구조] 4.구조체 (0) | 2018.12.11 |
[자료구조] 2. 순환 (1) | 2018.11.29 |
[자료구조] 1.자료구조의 개념 (1) | 2018.11.29 |
1. 순환의 개념
순환이란 어떤 알고리즘이나 함수가 자기 자신을 호출하여 문제를 해결하는 프로그래밍 기법이다.
ex) 팩토리얼 함수, 피보나치 함수, 이항 계수 계산, 각종 이진트리, 이진탐색, 하노이탑 등..
다음은 간단한 팩토리얼 예제다.
int factorial(int n){ printf("factorial(%d)\n",n); if(n<2) return(1); else return (n*factorial(n-1)); }
2. 순환과 반복
순환 : 자기 자신을 다시 호출하여 작업을 수행하는 방식
반복 : 반복시키는 문장을 작성하는 것
순환의 대표적인 예로는 하노이탑이 있다.
다음은 하노이탑 프로그램이다.
void hanoi(int n, char from, char tmp, char to){ if (n == 1) printf("원판 1을 %c에서 %c으로 옮긴다.\n", from, to); else{ hanoi(n-1, from, to, tmp); printf("원판 %d을 %c에서 %c으로 옮긴다.\n",n, from, to); hanoi(n-1, tmp, from, to); } } int main(){ hanoi(4, 'A', 'B', 'C'); }
[자료구조] 6. 동적 메모리 할당 (3) | 2018.12.12 |
---|---|
[자료구조] 5.포인터 (1) | 2018.12.12 |
[자료구조] 4.구조체 (0) | 2018.12.11 |
[자료구조] 3.배열 (0) | 2018.12.11 |
[자료구조] 1.자료구조의 개념 (1) | 2018.11.29 |
1. 자료구조 개념
자료구조란 자료의 집합으로 자료들을 효율적으로 이용할 수 있도록 자료를 조직적으로 구분하여 표현한 것이다.
알고리즘이란 주어진 문제를 처리하는 절차이다.
→ 프로그램은 자료구조와 알고리즘으로 구성되어있음
* 자료 구조의 분류 *
2. 자료의 표현
1) 정수의 표현
고정 소수점 방식 - 소수점이 어느 한 위치에 고정 되어 있음
- 최상위 한 비트는 부호를 표시하고 나머지 비트에는 숫자를 표시
2) 실수의 표현
부동 소수점 방식 - 소수부(유효숫자)와 지수부(소수점이 있는 위치)로 구성되어 있음
3. 추상데이터 타입
추상데이터 타입은 데이터를 추상적으로 정의한 것을 의미한다.
ex) 객체지향 프로그램에서 '클래스'가 추상데이터타입 ( c에서는 구조체 사용하여 비슷하게 구현 )
출처 : http://hyeonstorage.tistory.com/256
쉽게 배우는 자료구조
C언어로 쉽게 풀어쓴 자료구조
[자료구조] 6. 동적 메모리 할당 (3) | 2018.12.12 |
---|---|
[자료구조] 5.포인터 (1) | 2018.12.12 |
[자료구조] 4.구조체 (0) | 2018.12.11 |
[자료구조] 3.배열 (0) | 2018.12.11 |
[자료구조] 2. 순환 (1) | 2018.11.29 |