구조체 주소값을 저장
Programming/Data Structure 2012. 12. 25. 03:43 |#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 함수처럼 데이터를 소멸하는 함수는, 소멸된 데이터를 반환하도록 정의해야 한다. 그래서 메모리 소멸의 기회를 줄 수 있어야 한다.
'Programming > Data Structure' 카테고리의 다른 글
연결 리스트 (Linked List) (3) | 2012.12.26 |
---|---|
배열 기반 리스트의 장점과 단점 (0) | 2012.12.25 |
배열기반의 리스트 구현 (0) | 2012.12.25 |
배열을 이용한 리스트의 구현 (0) | 2012.12.24 |
추상 자료형: Abstract Data Type (0) | 2012.12.24 |