๋์ ํ ๋น ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ๋
ํ๋ก๊ทธ๋จ์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น๋ฐ๋ ๋ฐฉ๋ฒ
-์ ์ (static)
-๋์ (dynamic)
์ ์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น
- ํ๋ก๊ทธ๋จ์ด ์์๋๊ธฐ ์ ์ ๋ฏธ๋ฆฌ ์ ํด์ง ํฌ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น๋ฐ๋ ๊ฒ- ๋ฉ๋ชจ๋ฆฌ์ ํฌ๊ธฐ๋ ํ๋ก๊ทธ๋จ์ด ์์ํ๊ธฐ ์ ์ ๊ฒฐ์ ex) int score_s[100];- ์ฒ์์ ๊ฒฐ์ ๋ ํฌ๊ธฐ๋ณด๋ค ๋ ํฐ ์ ๋ ฅ์ด ๋ค์ด์จ๋ค๋ฉด ์ฒ๋ฆฌํ์ง ๋ชปํจ- ๋ ์์ ์ ๋ ฅ์ด ๋ค์ด์จ๋ค๋ฉด ๋จ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ญ๋น๋จ
๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น
- ์คํ ๋์ค์ ๋์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น๋ฐ๋ ๊ฒ- ์ฌ์ฉ์ด ๋๋๋ฉด ์์คํ ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฐ๋ฉ(full)
ex) score = (int *) malloc(100*sizeof(int));
- ํ์ํ ๋งํผ๋ง ํ ๋น(malloc)์ ๋ฐ๊ณ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋งค์ฐ ํจ์จ์ ์ผ๋ก ์ฌ์ฉ
์์ 1
#include <stdio.h>
#include <stdlib.h>
// malloc, free, exit ๋ฑ์ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ค.
int main(void)
{
int *list;
list = (int*)malloc(3 * sizeof(int)); //๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น
if (list == NULL) { //๋ฐํ๊ฐ์ด NULL์ธ์ง ๊ฒ์ฌ
printf("๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ์ค๋ฅ\n");
exit(1); //exit(1)์ ํธ์ถํ์ฌ ํ๋ก๊ทธ๋จ์ ์ข
๋ฃ. 1์ ์ผ๋ฐ์ ์ผ๋ก ์ค๋ฅ๋ฅผ ์๋ฏธํ๋ ์ข
๋ฃ ์ํ ์ฝ๋
}
list[0] = 10;
list[1] = 20;
list[2] = 30;
free(list); //๋์ ๋ฉ๋ชจ๋ฆฌ ํด์
return 0;
}
ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ์์์ฃผ์ : list
list = (int*)malloc(3 * sizeof(int));
: malloc ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋์ ์ผ๋ก ํ ๋น
3 * sizeof(int)๋ intํ ๋ณ์ 3๊ฐ๋ฅผ ์ ์ฅํ ์ ์๋ ํฌ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์ฒญํ๋ค
sizeof(int)๋ intํ ๋ณ์์ ํฌ๊ธฐ๋ฅผ ๋ฐ์ดํธ ๋จ์๋ก ๋ฐํํ๋ค
์ด ํฌ๊ธฐ๋งํผ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น๋ฐ์ list ํฌ์ธํฐ๊ฐ ์ด๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋๋ค.
๋ฐํ๊ฐ์ void*ํ์ด๋ฏ๋ก (int*)๋ฅผ ์ฌ์ฉํ์ฌ int*ํ์ผ๋ก ํ ๋ณํ
๋์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ
๋์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฐฐ์ด๊ณผ ๊ฐ์ด ์ทจ๊ธ
int *score = (int *) malloc (sizeof(int) * 10)
score[0] = 100;
score[1] = 200;
score[2] = 300;
...
ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๋ ๋ฐฐ์ด์ฒ๋ผ ์ธ๋ฑ์ค๋ฅผ ํตํด ์ ๊ทผํ ์ ์๋ค.
- malloc ํจ์๋ sizeof(int) * 10 ๋ฐ์ดํธ ๋งํผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ค
- ์ฌ๊ธฐ์ sizeof(int)๋ intํ ๋ณ์์ ํฌ๊ธฐ(๋ณดํต 4๋ฐ์ดํธ)๋ฅผ ๋ฐํ. ๋ฐ๋ผ์ 10 * 4 ๋ฐ์ดํธ ํฌ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น๋๋ค
- malloc์ ๋ฐํ๊ฐ์ void* ํ์ด๋ฏ๋ก (int *)๋ก ํ ๋ณํํ์ฌ int*๋ก ์ฌ์ฉ
- score๋ ํฌ์ธํฐ์ด์ง๋ง ๋ฐฐ์ด์ฒ๋ผ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ทผํ ์ ์๋ค. ์ด๋ C์์ ํฌ์ธํฐ์ ๋ฐฐ์ด์ด ๋งค์ฐ ์ ์ฌํ๊ฒ ๋์ํ๊ธฐ ๋๋ฌธ. score[i]๋ *(score + i)์ ๊ฐ๋ค.
ํฌ์ธํฐ ์ฐ์ฐ์ผ๋ก๋ ์ฌ์ฉ ๊ฐ๋ฅ
*score = 100;
*(score+1) = 200;
*(score+2) = 300;
...
- ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๋ ํฌ์ธํฐ ์ฐ์ฐ์ผ๋ก๋ ๋ค๋ฃฐ ์ ์๋ค
- *(score + i)๋ score[i]์ ๊ฐ๋ค.
- ํฌ์ธํฐ ์ฐ์ฐ์ ์ฌ์ฉํ์ฌ ๋ฐฐ์ด์ ์์์ ์ ๊ทผํ๊ณ ๊ฐ์ ํ ๋นํ ์ ์๋ค.
- score + 3์ score ํฌ์ธํฐ๋ฅผ 3๋งํผ ์ด๋์ํจ ์์น๋ฅผ ๊ฐ๋ฆฌํค๋ฉฐ, ์ฌ๊ธฐ์ ์ญ์ฐธ์กฐ ์ฐ์ฐ์ *๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ์ค์
์ฐ๊ฒฐ๋ฆฌ์คํธ (linked list)
๋ฐฐ์ด(array)
- ๊ตฌํ์ด ๊ฐ๋จํ๊ณ ๋น ๋ฅด๋ค๋ ์ฅ์ ์ด ์์ง๋ง ํฌ๊ธฐ๊ฐ ๊ณ ์ ๋๋ฉฐ ์ค๊ฐ์์ ์ฝ์ , ์ญ์ ๊ฐ ์ด๋ ต๋ค๋ ๋จ์ ์ด ์๋ค. (์ ์ฐ์ฑ ๋จ์ด์ง)
- ์ค๊ฐ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ๊ฐ์ ธ์ฌ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค. list[3]...
์ฐ๊ฒฐ๋ฆฌ์คํธ(linked list)
- ๊ฐ๊ฐ์ ์์(node)๊ฐ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ ์์(node)๋ฅผ ๊ฐ๋ฆฌํจ๋ค(pointํ๋ค).
- ์ค๊ฐ์ ์์๋ฅผ ์ฝ์ ํ๊ฑฐ๋ ์ญ์ ํ๊ธฐ ์ฉ์ดํ๋ค (ํ์ํ ๋๋ง๋ค ๋์ ์ผ๋ก ๊ณต๊ฐ์ ๋ง๋ค์ด์ ์ถ๊ฐ)
- ์ค๊ฐ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ๊ฐ์ ธ์ฌ ์ ์๊ณ ์์์๋ถํฐ ์ฐจ๋ก๋ก ๊ฒ์ํด์ผ ํ๋ค. ๊ตฌํ์ด ์ด๋ ต๊ณ ์ค๋ฅ๊ฐ ๋๊ธฐ ์ฝ๋ค.
๋ ธ๋์ ํฌ์ธํฐ ์์ฑํ๊ธฐ
#include <stdio.h>
#include <stdlib.h>
struct node{ //๋
ธ๋ ์์ฑ
int score;
struct node* next;
};
void main()
{
struct node* new_node;
new_node = (struct node*) malloc (sizeof(struct node)); // ํฌ์ธํฐ ์์ฑ
new_node -> score = 100;
new_node -> next = NULL;
}
๋ ธ๋ ์์ฑํ๊ธฐ
ex) 5๋ช ์ ์ฑ์ ์ ์ ์ฅํ๋ ์ฐ๊ฒฐ ๋ฆฌ์คํธ
์ฐ๊ฒฐ๋ฆฌ์คํธ ์์ฑ๊ณผ์
#include <stdio.h>
#include <stdlib.h>
#define MAX_COUNT 5
struct node{
int score;
struct node* next; // ๋ค์ ๋
ธ๋์ ์์น๋ฅผ ๊ฐ๋ฆฌํด
};
void print_list(struct node* list_head)
{
// ๋ฆฌ์คํธ์ ๋ด์ฉ์ ๋ชจ๋ ์ถ๋ ฅ
while(list_head != NULL) {
printf("%d => ", list_head->score);
list_head = list_head -> next;
}
printf("\n")
}
void main()
{
int count = 0;
int tmp_score = 0;
struct node* new_node; // ์๋ก์ด ๋
ธ๋ ์์น ์ ์ฅํ ํฌ์ธํฐ
struct node* list_head = NULL; // ๋ฆฌ์คํธ์ ์์ ๋
ธ๋
while (count < MAX_COUNT){
// ์ฌ์ฉ์๋ก๋ถํฐ ์
๋ ฅ
printf("score %d: ", count);
scanf("%d", &tmp_score);
// 1. ๋
ธ๋ ์์ฑ
new_node =
(struct node*) malloc (sizeof(struct node));
new_node->score = tmp_score;
// 2. ๋
ธ๋ ์ฐ๊ฒฐ
new_node -> next = list_head;
list_head = new_node;
// 3. ๋ฆฌ์คํธ ์ถ๋ ฅ
print_list(list_head);
count++;
}
}
๊ฒฐ๊ณผ
score 0: 77
77 =>
score 1: 100
100 => 77 =>
score 2: 92
92 => 100 => 77 =>
score 3: 87
87 => 92 => 100 => 77 =>
score 4 : 95
95 => 87 => 92 => 100 => 77 =>
๊ณ์ํ๋ ค๋ฉด ์๋ฌด ํค๋ ๋๋ฅด์ญ์์ค . . .
์๋ฃํ์ ์ฌ์ ์ํ๋ ๋ฐฉ๋ฒ : typedef
- struct node๋ฅผ node_t๋ผ๋ ์ด๋ฆ์ ์๋ฃํ์ผ๋ก ์ ์
- int, double์ฒ๋ผ node_t๋ก ์ฌ์ฉ
#include <stdio.h>
#include <stdlib.h>
#define MAX_COUNT 5
typedef struct node {
int score;
struct node* next;
} node_t;
void print_list(node_t* list_head) {
// ๋ฆฌ์คํธ์ ๋ด์ฉ์ ๋ชจ๋ ์ถ๋ ฅ
while (list_head != NULL) {
printf("%d => ", list_head->score);
list_head = list_head->next;
}
printf("\n"); // ์ธ๋ฏธ์ฝ๋ก ์ถ๊ฐ
}
int main() {
int count = 0;
int tmp_score = 0;
node_t* new_node; // ์๋ก์ด ๋
ธ๋ ์์น ์ ์ฅํ ํฌ์ธํฐ
node_t* list_head = NULL; // ๋ฆฌ์คํธ์ ์์ ๋
ธ๋
node_t* temp; // ์์ ๋
ธ๋๋ฅผ ์ํด ์ฌ์ฉ
while (count < MAX_COUNT) {
// ์ฌ์ฉ์๋ก๋ถํฐ ์
๋ ฅ
printf("score %d: ", count);
scanf("%d", &tmp_score);
// 1. ๋
ธ๋ ์์ฑ
new_node = malloc(sizeof(node_t));
if (new_node == NULL) {
fprintf(stderr, "Memory allocation failed\n");
return 1; // ๋ฉ๋ชจ๋ฆฌ ํ ๋น ์คํจ ์ ์ข
๋ฃ
}
new_node->score = tmp_score;
// 2. ๋
ธ๋ ์ฐ๊ฒฐ
new_node->next = list_head;
list_head = new_node;
// 3. ๋ฆฌ์คํธ ์ถ๋ ฅ
print_list(list_head);
count++;
}
// ๋์ ์ผ๋ก ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ํด์
while (list_head != NULL) {
temp = list_head;
list_head = list_head->next;
free(temp);
}
return 0; // ์ ์ ์ข
๋ฃ
}
์ฑ์ ์ ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์ ์ถ๋ ฅํ๊ธฐ ์์
- ํ์ ์ ๋ณด(ํ๋ฒ, ์ด๋ฆ, ์ฑ์ )๋ฅผ ์ ๋ ฅ๋ฐ๊ณ ์ฑ์ ์์ผ๋ก ์ ๋ ฌ์ ์ ์งํ๋ ํ๋ก๊ทธ๋จ ์์ฑ
- next_p๋ผ๋ ํฌ์ธํฐ๋ก, ์๋ก์ด ๋ ธ๋๊ฐ ๋ค์ด๊ฐ ์์น(์ ๋ ฌ๋ ์ ์๋ ์์น)๋ฅผ ์ฐพ์์ค
struct node* list_head;
struct node* next_p;
newt_p = list_head;
while(next_p){
if(next_p > score < new_node -> score)
break;
next_p = newt_p -> next;
}
ํฌ์ธํฐ๊ฐ ๋ค์ด๊ฐ ์ ์ฃผ์(prev_p)์ ํ ์ฃผ์(next_p)๊ฐ ๋ ๊ฐ ๋ค ํ์ํ๋ฉฐ ํฌ์ธํฐ ๋ํ ๋ ๊ฐ๊ฐ ํ์ํ๋ค.
void main() {
int count = 0;
int tmp_score = 0;
node_t* new_node; // ์๋ก์ด ๋
ธ๋ ์์น ์ ์ฅํ ํฌ์ธํฐ
node_t* list_head = NULL; // ๋ฆฌ์คํธ์ ์์ ๋
ธ๋
node_t* next_p;
node_t* prev_p;
while (count < MAX_COUNT) {
// ์ฌ์ฉ์๋ก๋ถํฐ ์
๋ ฅ
printf("score %d: ", count);
scanf("%d", &tmp_score);
// 1. ๋
ธ๋ ์์ฑ
new_node = (node_t*) malloc (sizeof(node_t));
new_node->score = tmp_score;
// 2. ๋
ธ๋ ์ฝ์
์์น ๊ฒ์
next_p = list_head; // ๋ฆฌ์คํธ ํค๋๋ถํฐ ๊ฒ์
prev_p = NULL; // prev_p๋ NULL๋ก ์ด๊ธฐํ
while(next_p){
// ํ์ฌ ๋
ธ๋์ score ๊ฐ์ด ์ ๋
ธ๋์ score ๊ฐ๋ณด๋ค ์์ผ๋ฉด
// ์ ๋
ธ๋๋ฅผ ํ์ฌ ๋
ธ๋ ์์ ์ฝ์
ํด์ผ ํ๋ฏ๋ก ๋ฃจํ ์ข
๋ฃ
if(next_p -> score < new_node -> score)
break;
// ํ์ฌ ๋
ธ๋์ ์ด์ ๋
ธ๋๋ฅผ ์
๋ฐ์ดํธ
prev_p = next_p;
// ๋ค์ ๋
ธ๋๋ก ์ด๋
next_p = next_p -> next;
}
// 2. ๋
ธ๋ ์ฝ์
new_node.next = next_p; // ์ ๋
ธ๋์ ๋ค์ ๋
ธ๋๋ ํ์ฌ ๋
ธ๋(next_p)๋ฅผ ๊ฐ๋ฆฌํด
if(prev_p){ // ํ์ฌ ๋
ธ๋๊ฐ ๋ฆฌ์คํธ์ ์ค๊ฐ์ ์ฝ์
๋์์ ๋
prev_p -> next = new_node; // ํ์ฌ ๋
ธ๋(prev_p)์ ๋ค์ ๋
ธ๋๋ฅผ ์ ๋
ธ๋๋ก ์
๋ฐ์ดํธ
} else { //์ฒ์์ ์ฝ์
ํ ๋ prev_p๋ null๋ก ์ด๊ธฐํ๋๋ฏ๋ก
list_head = new_node; // ๋ฆฌ์คํธ์ ์์ ๋
ธ๋๋ฅผ ์ ๋
ธ๋๋ก ์
๋ฐ์ดํธ
}
// 3. ๋ฆฌ์คํธ ์ถ๋ ฅ
print_list(list_head); // ๋ฆฌ์คํธ์ ํ์ฌ ์ํ๋ฅผ ์ถ๋ ฅ
count++; // ๋ค์ ๋
ธ๋๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํด ์นด์ดํธ ์ฆ๊ฐ
}
}