ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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

    댓글

Designed by Tistory.