2012-10-25 95 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; 
} 

的makefile

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 

正如你所看到的,在第一次入隊之後,front返回它應該是的,隊列前面的值。但之後它會返回一些奇怪的數字,我不知道它來自哪裏!然後當我再次入球時,它再次打印出來。只有在調用前兩次後纔會開始打印混亂的值。任何人都可以幫助我理解發生了什麼?

+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轉換爲queue :: node * –

+1

'node * newnode = new node(item,NULL);'。看到星號?除非您對指針和動態分配有很好的理解,否則不能編寫隊列類。 – john

+0

@Dan除了答案中的內容,'queue :: front()'沒有正確實現。當'front_o'爲空時沒有規定返回什麼。 – jogojapan