2012-07-15 3 views
1

null 개체 모델로 이중 연결 목록을 만들려고합니다. 지금까지리스트의 시작 부분에 노드를 추가하는 메소드와 노드를 표시하는 메소드를 구현했습니다. 내 문제는 디스플레이 기능은 항상 0을 표시한다는 것입니다. 누군가 잘못했거나 해결 방법을 지적 할 수 있습니까? 또한 올바르게 null 개체 모델을 여기에서 구현하는 올바른 방향으로 가고 있습니까?null null 개체 모델을 사용하는 C++ 이중 연결 목록

참고 : 이것은 학교 과제입니다. 설명없이 솔루션을 게시하지 마십시오. 여기서 무슨 일이 일어나고 있는지 배우고 이해하고 싶습니다.

편집 : 표시 문제를 수정 한 후에 나는 getHead() 또는 getTail nullNode 클래스 (빈 목록의 경우) 또는 elementNode 클래스 (노드가있는 목록의 경우)가 아닌. 나는 이것을 고치는 방법에 붙어있다.

container.getNext() 및 container (빈 목록)의 주소를 출력하면 두 주소가 동일하므로 end() 셀프()를 end nullNode 클래스?

class node { 
public: 

    node(){/* Do nothing */} 

    node(int e){ element = e; } 

    int getData(){ return element; } 

    void setData(int e){ element = e; } 

    friend class list; 
protected: 
    node* getNext(){ return next; } 

    void setNext(node* n){ next = n; } 

    node* getPrev() { return prev; } 

    void setPrev(node* n){ prev = n; } 

    node* self(); 

private: 

    int element; 
    node* next; 
    node* prev; 
}; 

class nullNode : public node{ 
public: 
    nullNode(){/* Do nothing */} 

    int getData(){ return NULL; } 

    void setData(int e){ /* Do Nothing */ } 

    node* getNext(){ return head; } 

    void setNext(node* n){ head = n; } 

    node* getPrev() { return tail; } 

    void setPrev(node* n){ tail = n; } 

    node* self(){ return NULL; } 
private: 
    node* head; 
    node* tail; 
}; 

class elementNode : public node{ 
public: 
    elementNode(){/* Do nothing */} 

    elementNode(int element){ 
     setData(element); 
} 

    int getData(){ return node::getData(); } 

    void setData(int e){ node::setData(e); } 

    node* getNext(){ return node::getNext(); } 

    void setNext(node* n){ node::setNext(n); } 

    node* getPrev() { return node::getPrev(); } 

    void setPrev(node* n){ node::setPrev(n); } 

    node* self(){ return this; } 
}; 

class list{ 
public: 

    list(); 

    node* getHead(){ return (container.getNext())->self(); } 

    node* getTail(){ return (container.getPrev())->self(); } 

    node* addHeadNode(int e); 

    void removeNode(node* n); 

    void insertBefore(node* n, int e); 

    void insertAfter(node* n, int e); 

    void displayNode(node *n); 

private: 

    nullNode container; 
}; 

list::list() 
{ 
    container.setNext(&container); 
    container.setPrev(&container); 
} 

node* list::addHeadNode(int e) 
{ 
    node* foo = new elementNode(e); 

    foo->setPrev(&container); 
    foo->setNext(container.getNext()); 
    container.getNext()->setPrev(foo); 
    container.setNext(foo); 
    return foo; 
} 

void list::displayNode(node* n) 
{ 
    cout << "Node Data: " << n->getData() << endl; 
} 
int main() 
{ 
    list myList; 
    node* myNode; 
    myNode = myList.addHeadNode(5); 
    myList.displayNode(myNode); 

    return 0; 
} 
+0

당신은을 검사하기 위해 귀하의 코드 라인 별 디버거에서 단계별로한다 프로그램이 진행됨에 따라 변수 값. 또는 비슷한 효과를 내기 위해 많은 양의 print 문을 추가 할 수 있습니다. 예를 들어,'addHeadNode()'함수 안에서'foo-> getData()'를 검사한다면, 맞습니까? –

답변

0
elementNode(int element) 
{ 
    node e; 
    e.setData(element); 
} 

이 코드는 무엇을하고 있는가? 노드 e을 만들었지 만 모든 목록에 추가되지 않고 버려진 것처럼 보입니다.

0

문제는 여기에 무슨 일

elementNode(int element){ 
    node e; 
    e.setData(element); 
} 

숨 깁니다? 먼저 node 클래스의 인스턴스를 만든 다음 해당 멤버 함수 인 setData을 호출합니다. 물론 eelement의 값으로 수정되었지만 바로 다음 순간 인 eelement은 정보가 element 인 동안 초기화되지 않은 범위가 끝나고 (종료 됨 : }) 끝나기 때문에 사라졌습니다. 어디서나 저장됩니다. 당신이 상속 setData 멤버 함수를 호출

elementNode(int element){ 
    setData(element); 
} 

으로 위의 코드를 대체 할 경우

그러나, element의 값을 저장하고 프로그램 출력 5 예상대로된다.

elementNode(int element){ 
    node e; 
    e.setData(element); 
} 

당신은 실제로 단지 다음을 폐기 관련이없는 노드를 구성 :

+0

그래, 그건 완벽하게 이해가된다. 고맙습니다! 내가 이해할 수없는 또 다른 문제가있다.수정 된 원본 글. – Derek

0

귀하의 elementNode 생성자는 node 부분 초기화하기 위해 노력하고있다.

은 당신이 원하는 것은 서브 클래스 생성자의 초기화 목록에서 수행 할 수있는 슈퍼 클래스의 생성자를 호출하는 것입니다

elementNode(int element) : node(element) { 
}