#include <stdio.h>

#include <stdlib.h>

#include "Point.h"

#include "ArrayList.h"


int main(void)

{

    List list;

    Point compPos;

    Point * ppos;


    ListInit(&list);


    ppos = (Point*)malloc(sizeof(Point));

    SetPointPos(ppos, 2, 1);

    LInsert(&list, ppos);


    ppos = (Point*)malloc(sizeof(Point));

    SetPointPos(ppos, 2, 2);

    LInsert(&list, ppos);


    ppos = (Point*)malloc(sizeof(Point));

    SetPointPos(ppos, 3, 1);

    LInsert(&list, ppos);


    ppos = (Point*)malloc(sizeof(Point));

    SetPointPos(ppos, 3, 2);

    LInsert(&list, ppos);


    printf("현재 데이터의 수: %d \n", LCount(&list));


    if(LFirst(&list, &ppos))

    {

        ShowPointPos(ppos);


        while(LNext(&list, &ppos))

            ShowPointPos(ppos);

    }

    puts("");


    compPos.xpos = 2;

    compPos.ypos = 0;


    if(LFirst(&list, &ppos))

    {

        if(PointComp(ppos, &compPos) == 1)

        {

            ppos = LRemove(&list);

            free(ppos);

        }


        while(LNext(&list, &ppos))

        {

            if(PointComp(ppos, &compPos) == 1)

            {

                ppos = LRemove(&list);

                free(ppos);

            }

        }

    }


    printf("남은 데이터의 수: %d \n", LCount(&list));


    if(LFirst(&list, &ppos))

    {

        ShowPointPos(ppos);


        while(LNext(&list, &ppos))

            ShowPointPos(ppos);

    }

    puts("");

    

    return 0;

}



main함수를 보면 LRemove 함수가 삭제된 데이터를 반환하도록 디자인한 이유를 알 수 있다. 위의 코드에서 리스트에 저장된 데이터는 'Point 구조체 변수의 주소 값' 이다. 이 주소 값은 Point 구조체를 동적으로 할당한 결과이기 때문에, 반드시 free 함수를 통한 메모리의 해제과정을 거쳐야 한다. 


일반적인 리스트는 메모리의 해제까지 책임을 지지 않는다. 

리스트에 저장된 값이 주소 값인 경우, 그리고 그 주소 값이 동적 할당의 결과인 경우를 구분하여 메모리의 해제를 진행하도록 구현하는 것은 무리가 있다.

때문에 LRemove 함수처럼 데이터를 소멸하는 함수는, 소멸된 데이터를 반환하도록 정의해야 한다. 그래서 메모리 소멸의 기회를 줄 수 있어야 한다. 


Posted by scii
: