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