c++질문

cutesun1의 이미지

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;
}

----잘하고 싶습니다. 그러기 위해서는 노력해야죠. 별 방도가 있나요.ㅠ-ㅠ

yui의 이미지

class List {
  public:
    List();			// initialize the list
    ~List();			// de-allocate the list

    void Prepend(int value); 	// Put item at the beginning of the list

prepend란 단어가 익숙치 않아 찾아보니 신기하네요.
사전에는 없지만 웹검색을 해보니 같은 뜻으로 많이 쓰는군요.

    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

주로 아래의 것은 private로 해주는 게 일반적입니다.
List가 아래의 member을 접근하기 위해서 member function를 만드시던가 아니면 List는 내 친구(friend class List;)라고 해주세요.

     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인데인데...-_-; 이거 없어도 돼지 않을까요? 

조금 질문이 이상합니다.
세줄 위로 올라가면 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에 대해 수행합니다.

    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;
}

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.