2013-08-27 2 views
0

push_front() 단일 링크 된 목록의 메서드를 멤버 함수으로 구현하는 방법은 무엇입니까? 당신이 this 포인터에 할당 할 수 없기 때문에 아래의 코드는, (error: lvalue required as left operand of assignment)를 컴파일되지 않습니다. 이걸 어떻게 돌릴 수 있니?push_front()를 연결 목록 멤버 함수로 사용

#include<algorithm> 
using namespace std; 

class ListElem{ 
public: 
    ListElem(int val): _val(val){} 
    ListElem *next() const { return _next; } 
    void next(ListElem *elem) { _next = elem; } 
    void val(int val){ _val = val; } 
    int val() const { return _val;} 
    void print(); 
    void push_front(int); 
private: 
    ListElem *_next;  
    int _val; 
}; 

void ListElem::push_front(int val) 
{ 
    ListElem *new_elem = new ListElem(val); //new node 
    new_elem->next(this); // new node points to old head 
    this = new_elem; // make new node the new head, error! 
    return; 
} 

void ListElem::print() 
{ 
    ListElem *pelem = this; 
    while(ListElem *pnext_elem = pelem->next()) 
    { 
     cout << pelem->val() << ' '; 
     pelem = pnext_elem;  
    } 
    cout << pelem->val() << endl; 
} 

int main() 
{ 
    //initialization 
    ListElem *head = new ListElem(1); 
    ListElem *elem = head; 
    for (int ix = 2; ix < 10; ++ix) 
    { 
     ListElem *elem_new = new ListElem(ix); 
     elem -> next(elem_new); 
     elem = elem_new;  
    } 
    head->print(); 

    //insert at the beginning 
    head->push_front(7); 
    head->print(); 
} 
+2

는 push_front 목록에 방법이다, 내가 보는 모든 목록 * 노드 * 클래스입니다. – Borgleader

+0

@Borgleader, 나는 연결리스트의 머리가 목록 자체 ([책] (이다 생각 http://books.google.pl/books?id=FQzczWtdm3gC&pg=PT36&lpg=PT36&dq=%22term+linked+list+is+ 자주 + 사용 + as + 속기 + for + first + element + for + a + linked + list.png 22page = 20page = 20pixel & 20list % 20is % 20often % 20used % 20as % 20shorthand % 20for % 20the % 20first % 20element % 내지 200f % 20A % 20linked % 20list. % 22 F = 거짓)). 이것은 좋은 접근 방법이 아닌가? – cpp

+1

나는 "자주"라고 말하지 않을 것입니다. 확실히 std 라이브러리에서 어떻게 완료되었는지는 아닙니다. 그리고 그것은 push_front를 지원하지 않습니다. – Borgleader

답변

2

논리적으로는,는 push_front()는이 같은 그것을 할 수 있고, 아닌 ListElement 클래스

+0

내 연결 목록이 머리가 node로 정의되어 있으면 push_front()를 구현할 수 없습니다. – cpp

+1

이 객체를 노드로 사용하는 List 클래스가 있어야합니다. –

1

당신은 잘못 this을 사용하고 있습니다. 당신은 static 회원이 말,라는 ListElem *head을 갖고 싶어하고 this을 사용하고 어디에 사용합니다. 또한 초기화해야합니다.

void ListElem::push_front(int val) 
{ 
    ListElem *new_elem = new ListElem(_val); 
    _val = val; 
    new_elem->next(_next); 
    _next = new_elem; 
} 

: 당신이 정말로 그것을 그런 식으로하고 싶은 경우

+0

그러면 프로그램 전체에서 하나의 목록 만 가질 수 있습니다. – molbdnilo

1

List 클래스의 방법이어야합니다 이렇게하면 "현재"노드의 데이터가 새 데이터로 바뀌고 "현재"데이터가 새 노드로 이동하여 동일한 목록 내용이 생성됩니다.
는 그러나 그것의 노드 목록을 conflate 정말 올바른 아니에요.

당신이 링크 한 책은 모든 것에 대해 매우 비 OO 접근법을 취합니다 (Java와 C++ 예제는 음역 C와 유사합니다). 그리고 목록의 유형을 노드의 유형과 융합하는 것은 꽤 확실합니다. 나중에 버그로 이어집니다. 당신이 다음이

ListElem* x = head; 
head->push_front(99); 

을 할 경우 예를 들어

, *x의 내용은 당신이 기대 정말로하지 않은, 변경됩니다.

+0

고맙습니다. 훌륭한 대답입니다. – cpp

관련 문제