2012-03-13 2 views
2

C++의 템플릿 연결된 일반 목록에서 작업 중이며 push() 메소드에 문제가 있습니다. 나는 그 문제를 안다고 생각하지만 해결책을 찾을 수는 없다. 내가 가진 푸시 방법은 다음과 같습니다. 목록으로 일부 정수를 눌러 목록을 통과하고 메모리에 임의의 공간 것으로 보인다 번호를 인쇄에있는 값의 결과를 인쇄 한 후링크 된 목록 푸시 방법

template <class T> void DLL<T>::pushFront(T value) { 
    Node<T> node(value); 
    temp = node; 
    temp->setPrev(*head); 
    temp->setNext(*(head->getNext())); 
    head->setNext(*temp); 
    temp->getNext()->setPrev(*temp);                                  
    this->length++;                                      
} 

. 이것은 푸시 함수가 반환 된 후에 노드 변수가 파괴되는 것과 관련이 있다고 생각합니다. 왜 이것이 작동하지 않는지 아는 사람이 있습니까? 모든 다른 테스트에서 setNext/Prev() 및 getNext/Prev() 함수가 모두 올바르게 작동합니다. 나는

편집 *

변수 헤드와 임시 형 노드 < T의 전역은 ... 난처한 상황에 빠진거야> *

+0

가 3 행 온도 = 노드로되어 있습니다 :이 경우,이 같은 나온다? – tmpearce

답변

1

당신은 목록에 노드를 저장하는 포인터를 사용한다.

Node<T> node(value); 
temp = node; 

이 코드가 범위를 벗어나면 "노드"에 할당 된 메모리가 해제되어 연결된 목록이 손상됩니다. 대신 사용 포인터 :

template <class T> void DLL<T>::pushFront(T value) { 
    Node<T> *node = new Node<T>(value); 
    node->setPrev(head); 
    node->setNext(head->getNext()); 
    head->setNext(node); 
    node->getNext()->setPrev(node); 
    this->length++; 
} 

클래스 노드가 같은 것을 할 위치 : 모든

template<class T> class Node { 
public: 
    /* ... */ 
private: 
    Node<T> *next; 
    T data; 
}; 
+0

이 방법을 사용하는 경우에도 여전히 동일한 결과가 나타납니다. "새로운 노드 (값)"을 유지해야하는 특정 방법이 있습니까? 메서드 내에서 선언 된 것은 맞습니까? –

+0

예, 괜찮습니다. 노드 구조에 문제가있을 수 있습니다. 그 방법을 제공 한 이후로 무엇인지 알기는 어렵습니다. – mfontanini

0

먼저, head하지 글로벌이어야한다 - 그것은 DLL의 구성원이어야를, 그래서 각 dll (약자 약어, IMO) 머리 (그리고 아마도 꼬리)가 있습니다.

둘째, getnext, setnext, getprevsetprev은 100 % 무의미한 시간 낭비입니다. 변수를 읽거나 할당하는 대신 캡슐화 또는 가독성을 사용하지 않고 아무 것도 얻지 못합니다.

세 번째로, @ fontanini가 이미 지적한대로 push 노드 일 때마다 실제로 노드를 할당해야하며 매번 단일 노드를 다시 사용하지 않아야합니다.

넷째로, 적어도 부분적으로는 부분적으로는 getnext/setprev 등의 추악함/읽을 수 없음으로 인해 복잡 해지는 것처럼 보입니다. 일단 노드가 있으면

나는 그것을 한 적이
template <class T> 
void DLL<T>::pushFront(T value) { 
    node<T> *tmp = new node<T>(value); 
    tmp -> next = head; 
    tmp -> next -> prev = tmp; 
    head = tmp; 
    ++length; 
} 

, 나는 그것이 조금 간단하게 만 생각 노드의 ctor에에 포인터를 전달하는 것으로 나타났습니다 : 연결리스트의 전면 만 (플러스 길이를 증가) 세 가지 작업을합니다.

template <class T> 
void DLL<T>::pushFont(T value) { 
    // These parameters are value, prev, and next, respectively.        
    node<T> *tmp = new node<T>(value, NULL, head); 
    tmp->next->prev = tmp; 
    head = tmp; 
    ++length; 
}