2017-10-21 2 views
-1

"Source.cpp, Queue.h, Queue.cpp"파일에 코드를 작성했습니다.링크 된 목록이있는 대기열에 대한 코드에서 버그를 찾을 수 없습니다.

프로그램을 실행할 때마다 오류가 표시되고 이유를 모르겠습니다. 필요한 모든 라이브러리가 포함되어 있습니다.

//Source.Cpp "주요 기능"

Queue<int>X; 
//trying to run the program . 
for (int i = 0; i < 5; i++) 
{ 
    X.Push(i + 1); 
    cout << X.Size() << endl; 
} 
X.front();/ 
X.Pop(); 
X.front(); 
X.Pop(); 


return 0; 

//Queue.h

// 노드 클래스 그것의 모든 기능을 가진 파일 .header.

template<class Mine> 
class Node 
{ 
public: 
    Mine Value; 
    Node<Mine> *Prev; 
    Node(); 
    Node(Mine); 
}; 

template<class Mine> 
    //Queue Class 
class Queue 
{ 
    int Elements; 
    Node<Mine> *Front, *Back; 

public: 
    Queue(); 
    ~Queue(); 
    int Size();//returns Queue Size 
    void Push(Mine);//Push a new value to the back 
    void Pop();//removes a value from the front 
    void Clear();// delete all the elements 
    bool isEmpty();// checks if there are no elements in the queue 
    Mine front();//returns the value in the front 

}; 

//Queue.cpp

// 구현 내가 쓴 국지적 인 코드입니다.

template<class Mine> 
Node<Mine>::Node() 
{ 
Value = 0; 
Prev = 0; 
} 

template<class Mine> 
Node<Mine>::Node(Mine Value) 
{ 
this->Value = Value; 
Prev = 0; 
} 

template<class Mine> 
Queue<Mine>::Queue() 
{ 
Elements = 0; 
Front = Back = 0; 
} 

template<class Mine> 
Queue<Mine>::~Queue() 
{ 
Clear(); 
} 

template<class Mine> 
int Queue<Mine>::Size() 
{ 
return Elements; 
} 

template<class Mine> 
void Queue<Mine>::Push(Mine Value) 
{ 
Node<Mine> *NEW = new Node<Mine>(Value); 
if (Front==0) 
    { 
    Front = Back = NEW; 
    Back->Prev = 0; 
    } 
else 
    { 
    Back->Prev=NEW; 
    Back = NEW; 
    Back->Prev = 0; 
    } 
    Elements++; 
} 

template<class Mine> 
void Queue<Mine>::Pop() 
{ 
Node<T>*tmp; 
assert(!isEmpty()); 
tmp = Front->Prev; 
delete Front; 
Front = tmp; 
delete tmp; 

if (Elements==1)Front=Back; 
Elements--; 

} 
    template<class Mine> 
    void Queue<Mine>::Clear() 
    { 
    for (int i = 0; i < Elements; i++) 
    { 
     Pop(); 
    } 
    } 
    template<class Mine> 
    bool Queue<Mine>::isEmpty() 
    { 
    return Elements == 0; 
    } 
    template<class Mine> 
    Mine Queue<Mine>::front() 
    { 
    assert(!isEmpty()); 
    return Front->Value; 
    } 

프로그램을 실행하려고 할 때마다 작동을 멈 춥니 다.

+0

C++의 queue stl을 사용하지 않는 이유는 무엇입니까? 왜 휠체어를 재발 명하고 있습니까? –

+1

@Ahmed Samy 최소한 함수 void Queue :: Pop()이 잘못되었습니다. 예를 들어,이 Front = tmp; 삭제 tmp; 은 의미가 없습니다. –

+0

질문에 오류 메시지를 추가 하시겠습니까? –

답변

1

회원 기능 Pop이 잘못되었습니다. 우선은 큐

delete Front; 
Front = tmp; 
delete tmp; 

에서 한 번에 두 개의 노드를 삭제하고이 결과 대기열이 Pop를 호출 한 후 비어있는 경우 0으로 Back를 설정하지 않습니다.

기능이 데이터 멤버가 이미의 생성자 0으로 설정되어 있기 때문에이

Back->Prev = 0; 

같은

또한
template<class Mine> 
void Queue<Mine>::Pop() 
{ 
    assert(!isEmpty()); 

    Node<T> *tmp = Front->Prev; 
    delete Front; 

    Front = tmp; 

    if (--Elements == 0) Back = nullptr; 
} 

문이 멤버 함수 Push에서 중복되는 다음과 같은 방법으로 볼 수 있습니다 마디. 이 클래스 Queue의 구현 세부 사항 때문에보기의 디자인 관점에서

클래스 Node 클래스 Queue의 내부 사설 구조이어야한다.

데이터 구성원의 이름을 Prev에서 Next으로 변경하는 것이 논리적으로 일관성이 있습니다.