2012-10-25 5 views
-1

C++로 큐 클래스를 만들고 프론트 함수를 작동시키는 데 문제가 있습니다. 대기열의 첫 번째 노드 값을 인쇄합니다. 내 queue.cpp 클래스는 여기이상한 함수 동작 C++, 같은 대답을 반환하지 않습니다.

#include "queue.h" 
#include <stdlib.h> 
#include <iostream> 
using namespace std; 

queue::queue() 
{ 
    front_p = NULL; 
    back_p = NULL; 
    current_size = 0; 
} 

void queue::enqueue(int item) 
{ 
    node newnode = node(item, NULL); 
    if (front_p == NULL) //queue is empty 
    { 
     front_p = &newnode; 
     back_p = &newnode; 
    } 
    else 
    { 
     back_p->next = &newnode; 
     back_p = &newnode; 
    } 
    current_size ++; 
} 

int queue::dequeue() 
{ 
    //if there is only one node 
    if (front_p == back_p) 
    { 
     front_p = NULL; 
     back_p = NULL; 
    } 
    //if there are two or more 
    else 
     front_p = front_p->next; 
    current_size --; 
} 

int queue::front() 
{ 
    if (front_p != NULL) 
     return (*front_p).data; 
} 

bool queue::empty() 
{ 
    if (front_p == NULL && back_p == NULL) 
     return true; 
    else 
     return false; 
} 

int queue::size() 
{ 
    return current_size; 
} 

내 헤더 파일 (queue.h)은 여기

class queue 
{ 
    public: 
    queue(); // constructor - constructs a new empty queue. 
    void enqueue(int item); // enqueues item. 
    int dequeue(); // dequeues the front item. 
    int front(); // returns the front item without dequeuing it. 
    bool empty(); // true iff the queue contains no items. 
    int size(); // the current number of items in the queue. 
    int remove(int item); // removes all occurrances of item 
     // from the queue, returning the number removed. 

    private: 
    class node // node type for the linked list 
    { 
     public: 
      node(int new_data, node * next_node){ 
       data = new_data ; 
       next = next_node ; 
      } 
      int data ; 
      node * next ; 
    }; 

    node* front_p ; 
    node* back_p ; 
    int current_size ; // current number of elements in the queue. 
}; 

테스트 프로그램 (tester.cpp)

#include <iostream> 
#include "queue.h" 
#include <stdlib.h> 
using namespace std; 

int main(int argc, char * const argv[]) 
{ 
    queue q1; 
    q1.enqueue(5); 
    cout << "front: " << q1.front() << endl; 
    cout << "front: " << q1.front() << endl; 
    cout << "front: " << q1.front() << endl; 
    q1.enqueue(10); 
    cout << "front: " << q1.front() << endl; 
    cout << "front: " << q1.front() << endl; 
    cout << "size: " << q1.size() << endl; 
} 

메이크입니다

all: tester 

tester: queue.o tester.o 
    g++ tester.o queue.o -o tester 

tester.o: tester.cpp 
    g++ -c tester.cpp 

queue.o: queue.cpp queue.h 
    g++ -c queue.cpp 

clean: 
    rm -f tester *.o 

테스트 프로그램을 실행할 때 다음과 같이 나타납니다.

front: 5 
front: 6299744 
front: 6299744 
front: 10 
front: 6299744 
size: 2 

첫 번째 대기열에 넣은 후, 앞면은 대기열 앞면의 값을 반환합니다. 그러나 그 후 그것은 이상한 숫자를 반환하고 어디에서 왔는지 전혀 모른다! 그런 다음 다시 대기열에 넣으면 다시 인쇄됩니다. 앞면을 두 번 호출 한 후에 만 ​​엉망인 값을 인쇄하기 시작합니다. 아무도 나에게 무슨 일이 벌어지고 있는지 이해할 수 있습니까? 소유하지 않은 당신은 메모리에 대한 포인터를 가지고 있기 때문에

+0

모든 기능을 확인하고 반품을 사용하지 않는 사람은 약간의 도움이 필요할 수 있습니다. –

답변

4

여러분의 프로그램은 정의되지 않은 동작으로 실행 : 함수의 끝에서

void queue::enqueue(int item) 
{ 
    node newnode = node(item, NULL); 
    if (front_p == NULL) //queue is empty 
    { 
     front_p = &newnode; 
     back_p = &newnode; 
    } 
    else 
    { 
     back_p->next = &newnode; 
     back_p = &newnode; 
    } 
    current_size ++; 
} 

newnode 파괴하지만, front_pback_p는 여전히 메모리를 가리키는 위치. 동적 할당 :

node* newnode = new node(item, NULL); 

또는 std::shared_ptr<node>을 사용하십시오.

+0

이렇게하려고하면 컴파일되지 않을 것입니다. 큐 :: 노드를 queue :: node * –

+1

'node * newnode = new node (item, NULL); '로 변환 할 수 없다고합니다. 별표가 보이십니까? 포인터와 동적 할당을 잘 이해하지 않으면 큐 클래스를 작성할 수 없습니다. – john

+0

@ Dan 대답에서 말한 것 외에'queue :: front()'가 올바르게 구현되지 않았습니다. 'front_o'가 null 일 때 무엇을 반환해야하는지에 대한 지정은 없습니다. – jogojapan