c++질문
c++공부한지 얼마 되지 않는 학생입니다.
소스 보면서 공부하고 있는데 , 소스는 간단한 linked list구현하는 소스입니다.
저기 밑에 Remove함수에서 질문있습니다.
class List {
public:
List(); // initialize the list
~List(); // de-allocate the list
void Prepend(int value); // Put item at the beginning of the list
int Remove(); // Take item off the front of the list
bool Empty(); // is the list empty?
void SelfTest();
private:
ListElement *first; // Head of the list, NULL if list is empty
ListElement *last; // Last element of list
};
class ListElement {
public:
ListElement(int value) { item = value; next = NULL;};
// constructor for list element
ListElement *next; // next element on list,
// NULL if this is the last
int item; // value of this element
};
//----------------------------------------------------------------------
// List::Remove
// Remove the first integer from the front of the list.
// Error if nothing on the list.
//
// Returns:
// The removed integer.
//----------------------------------------------------------------------
int
List::Remove() {
ListElement *element = first;
int value;
ASSERT(!Empty());
element = first; -->이것이 어떻게 가능한지요? first는 pointer인데인데...-_-; 이거 없어도 돼지 않을까요?
value = first->item;
if (first == last) { // list had one item, now has none
first = NULL;
last = NULL;
} else {
first = element->next;
}
delete element; // deallocate list element -- no longer needed
return value;
}
----잘하고 싶습니다. 그러기 위해서는 노력해야죠. 별 방도가 있나요.ㅠ-ㅠ
Re: c++질문
prepend란 단어가 익숙치 않아 찾아보니 신기하네요.
사전에는 없지만 웹검색을 해보니 같은 뜻으로 많이 쓰는군요.
주로 아래의 것은 private로 해주는 게 일반적입니다.
List가 아래의 member을 접근하기 위해서 member function를 만드시던가 아니면 List는 내 친구(friend class List;)라고 해주세요.
조금 질문이 이상합니다.
세줄 위로 올라가면 ListElement* element = first;라고 해주는데 이것은 이상하지 않으신가요?
어쨌든 element = first;는
ListElement의 포인터로 타입이 똑같은 변수 사이의 대입입니다.
"first가 가리키고 있던 것을 element도 가리키게 하겠다."
라는 뜻이지요.
그리고 없으면 안됩니다.
한번 element를 없애고 element자리에 모두 first로 치환시켜서 작동해 보세요. 그럼 원하던 결과가 나오지 않을 것입니다.
제일 처음 것을 가리키던 것을 없애기 위해서 Remove함수에서는 일반적으로 다음의 작업들을 해야합니다.
1) first를 delete한다. (메모리 새는 것 방지)
2) first를 first->next로 바꾼다. (다음 분, 당신이 이제 일등입니다.)
하지만 element라는 백업 없이는 위의 둘을 수행할 수가 없습니다.
(List가 이중연결리스트가 아닌한에야..)
1)번을 먼저하면 2)번에서 first->next가 의미 없어지지요.
2)번을 먼저하면 1)번에서 작업할 "원래 first"를 잃어버리게 됩니다.
그래서 element에 first의 백업을 해놓고,
2)번을 수행하고
1)번은 "원래 first"의 값을 들고 있는 element에 대해 수행합니다.
댓글 달기