-
[Data Structure] 배열의 크기 조정하기알고리즘 & 자료구조 2021. 1. 24. 16:03
소스 코드를 보기전에 먼저 생각해보자
우리가 이미 일정한 크기의 배열을 선언 했다면,
그 크기를 키우려면 어떻게 해야할까?
list[0] = 1;
list[1] = 2;
list[2] = 3;
밑에 표를 메모리라 생각해보자
list[3] 에 4를 저장하고 싶지만 h라는 값이 메모리에 담겨있다.
e m m a 1 2 3 h e l l o 단순히 메모리의 위치 바로옆에 일정 크기의 메모리를 덧붙일수 없다.
따라서 안전하게 새로운 공간에 큰 크기의 메모리를 다시 할당하고 기존 배열의 값들을 하나씩 옮겨줘야 한다.
이러한 작업은 O(n), 즉 배열의 크기 n만큼의 실행 시간이 소요될것이다.
이 과정을 코드로 나타내면 아래와 같다.
#include <stdio.h> #include <stdlib.h> int main(void) { // 첫번째 방법 /* //int 자료형 3개로 이루어진 list 라는 포인터를 선언하고 메모리 할당 int *list = malloc(3*sizeof(int)); //포인터가 잘 선언 되었는지 확인 if(list == NULL) { return 1; } //list 배열의 각 인덱스에 값 저장 list[0] = 1; list[1] = 2; list[2] = 3; //int 자료형 4개 크기의 tmp 라는 포인터를 선언하고 메모리 할당 int *tmp = malloc(4*sizeof(int)); if(list == NULL) { return 1; } //list의 값을 tmp로 복사 for(int i= 0; i < 3; i++) { tmp[i] = list[i]; } //tmp배열의 네 번째 값도 저장 tmp[3] = 4; //list의 메모리를 초기화 free(list); //list가 tmp와 같은 곳을 가리키도록 지정 list = tmp; //새로운 배열 list의 값 확인 for(int i = 0; i < 4; i++) { printf("%d\n", list[i]); } free(list); */ //2 번째 방법 'realloc'사용 하면 좀더 깔끔하게 작성 가능 int *list = malloc(3*sizeof(int)); if(list == NULL) { return 1; } list[0] = 1; list[1] = 2; list[2] = 3; int *tmp = realloc(list,4 *sizeof(int)); if(tmp == NULL) { return 1; } list = tmp; list[3] = 4; for(int i = 0; i < 4; i++) { printf("%d\n", list[i]); } free(list); }
728x90반응형'알고리즘 & 자료구조' 카테고리의 다른 글
[Data Structure]연결 리스트 : 코딩 (0) 2021.01.24 [Data Structure]연결 리스트 : 도입 (0) 2021.01.24 [알고리즘] 병합 정렬 (0) 2021.01.21 [알고리즘]재귀 (0) 2021.01.21 [알고리즘] 선택 정렬 (0) 2021.01.20