가장 가까운 점 삭제

Download Report

Transcript 가장 가까운 점 삭제

new 및 delete 연산자
 동적 메모리의 관리
int *a;
a = new int;
int size의 메모리를 할당받음
*a = 3;
….
delete a;
할당된 메모리 반납
 배열
int *a;
a = new int[10];
정수형 변수 10개분의 메모리 할당
*a = 3;
….
delete [] a;
프로그래밍 응용 #18
배열의 경우 delete [] a 의 형식으로 반납
1
List
 List의 구조
데이터(100번지)
데이터(104번지)
데이터(112번지)
NULL
주소
주소
주소
주소
NULL
NULL
104
100
112
104
NULL
 리스트의 특징
• 데이터 저장하는데 메모리를 많이 차지함
• 데이터의 추가 및 삽입이 간단
데이터(100번지)
데이터(112번지)
NULL
주소
주소
NULL
NULL
112
100
NULL
프로그래밍 응용 #18
2
리스트 클래스
 CPtrList 클래스 : 리스트 데이터 구조를 지원하는 클래스
 주요 멤버함수
• IsEmpty() : 리스트에 저장된 항목이 없으면 TRUE
• GetHead() : 첫 노드의 값을 반환
• GetTail() : 마지막 노드의 값을 반환
• GetHeadPosition() : 첫 노드의 포인터 반환
• GetTailPosition() : 마지막 노드의 포인터 반환
• GetAt(pos) : 주어진 포인터가 가르키는 값 반환
• GetNext(pos) : 주어진 포인터 가르키는 값 반환 후 다음 노드 가르킴
• GetPrev(pos) : 주어진 포인터 가르키는 값 반환 후 이전 노드 가르킴
• AddTail( data ) : data를 맨 마지막에 삽입
• InsertAfter( pos, data) : 주어진 포인터 뒤에 데이터 삽입
• InsertBefore( pos, data) : 주어진 포인터 앞에 데이터 삽입
• RemoveAt (pos) : 주어진 포인터의 노드 삭제
• RemoveTail() : 마지막 노드 삭제
• RemoveAll() : 모든 노드 삭제
프로그래밍 응용 #18
3
리스트 데이터 추가
 예제
• new CPoint(10, 20) : CPoint class 의 크기만큼 메모리를 할당받아서 사용. 초기
값은 10,20임 (생성자사용한 것임)
CPtrList ptr;
main() {
ptr.AddTail( new CPoint(10,20) );
ptr.AddTail( new CPoint(30,40) );
ptr.AddTail( new CPoint(50,60) );
}
• ptr.AddTail( 주소값이 여기에 와야 됨 )
프로그래밍 응용 #18
4
리스트 예제
 예제
CPtrList ptr;
CPoint a;
function() {
CPoint b;
ptr.AddTail( a );
// No!
ptr.AddTail( &a );
// Yes
ptr.AddTail( b );
// No!
ptr.AddTail( &b );
// No!
}
프로그래밍 응용 #18
5
직선 그리는 프로그램
 왼쪽 마우스를 click하면 click한 점을 리스트에 추가함
• Cpoint pt[100] 대신에 CPtrList ptr을 사용
CPtrList ptr;
void CLecture181View::OnLButtonDown(UINT nFlags, CPoint point)
{
ptr.AddTail( new CPoint(point) );
Invalidate();
}
 POSITION : 리스트의 위치를 가르키는 변수형
• POSITION pos; 와 같이 사용
프로그래밍 응용 #18
6
리스트의 값을 다루기
 리스트의 값을 조작
CPtrList ptr;
CPoint *p
POSITION pos;
function {
ptr.AddTail( new CPoint(10,20) );
ptr.AddTail( new CPoint(30,40) );
ptr.AddTail( new CPoint(50,60) );
pos = ptr.GetHeadPosition();
p = (CPoint *) ptr.GetNext( pos );
*p.x = 100;
p = (CPoint *) ptr.GetNext( pos );
*p.x = 200;
}
프로그래밍 응용 #18
7
리스트의 값을 다루기
 리스트의 값을 조작
CPtrList ptr;
CPoint *p
POSITION pos;
function {
ptr.AddTail( new CPoint(10,20) );
ptr.AddTail( new CPoint(30,40) );
ptr.AddTail( new CPoint(50,60) );
pos = ptr.GetTailPosition();
p = (CPoint *) ptr.GetPrev( pos );
*p.x = 100;
p = (CPoint *) ptr.GetPrev( pos );
p->x = 200;
}
프로그래밍 응용 #18
8
리스트 예제
 리스트 중간에 추가
CPtrList ptr;
CPoint *p
POSITION pos;
function {
ptr.AddTail( new CPoint(10,20) );
ptr.AddTail( new CPoint(30,40) );
pos = ptr.GetHeadPosition();
ptr.InsertAfter(pos, new CPoint(25,34) );
}
프로그래밍 응용 #18
9
리스트의 값을 모두 더하기
 예제 : 리스트에 들어 있는 x 데이터를 모두 더함
CPtrList ptr;
CPoint *p
POSITION pos;
function {
int sumx = 0;
if ( ! ptr.IsEmpty() ) {
pos = ptr.GetHeadPosition();
while ( pos != NULL ) {
p = (CPoint *) ptr.GetNext( pos);
sumx = sumx + p->x;
}
}
}
프로그래밍 응용 #18
10
리스트의 최대값 구하기
 리스트에 들어있는 x의 최대값을 구함
CPtrList ptr;
CPoint *p
POSITION pos;
function {
}
프로그래밍 응용 #18
11
직선 그리는 프로그램
 OnDraw 함수
void CLecture181View::OnDraw(CDC* pDC)
{
POSITION pos;
CPoint *p;
if ( !ptr.IsEmpty() ) {
pos = ptr.GetHeadPosition();
p = (CPoint *) ptr.GetNext(pos);
pDC->Rectangle(p->x - 2, p->y -2, p->x + 2, p->y + 2);
pDC->MoveTo( *p );
while ( pos != NULL ) {
p = (CPoint *) ptr.GetNext(pos);
pDC->LineTo( *p );
pDC->Rectangle(p->x - 2, p->y -2, p->x + 2, p->y + 2);
}
}
}
프로그래밍 응용 #18
12
라인 그리기 : 라인 삭제
 오른쪽 버튼을 누르면 마지막 라인을 하나 제거함
• 주의 : 리스트에서 제거되어도 할당된 메모리는 살아 있음
- 수동으로 반납해야 됨
void CLecture181View::OnRButtonDown(UINT nFlags, CPoint point)
{
if ( ! ptr.IsEmpty() ) {
p = (CPoint *) ptr.GetTail();
ptr.RemoveTail();
delete p;
Invalidate();
}
}
프로그래밍 응용 #18
13
가장 가까운 점 삭제
 오른쪽 버튼을 누르면 가장 가까운 점 삭제
void CLecture181View::OnRButtonDown(UINT nFlags, CPoint point)
{
if ( !ptr.IsEmpty() ) {
pos = ptr.GetHeadPosition();
p = (CPoint *) ptr.GetNext(pos);
minpos = pos;
mindist = (point.x - p->x)*(point.x - p->x) +
(point.y - p->y)*(point.y - p->y);
while ( pos != NULL ) {
oldpos = pos;
p = (CPoint *) ptr.GetNext(pos);
dist = (point.x - p->x)*(point.x - p->x) +
(point.y - p->y)*(point.y - p->y);
if ( dist < mindist ) {
minpos = oldpos;
mindist = dist;
}
}
프로그래밍 응용 #18
14
가장 가까운 점 삭제
 오른쪽 버튼을 누르면 가장 가까운 점 삭제
p = (CPoint *) ptr.GetAt(minpos);
ptr.RemoveAt(minpos);
delete p;
Invalidate();
}
}
프로그래밍 응용 #18
15