簡體   English   中英

在 C++ 中為鏈表類實現入隊函數

[英]Implementing an enqueue function for a Linked list class in C++

每個節點都存儲一個指向數據類對象的指針,因此處理所有內存分配等工作非常混亂。

我認為問題在於 enqueue 函數的實現方式或 Node 對象的創建或 Data 對象的創建有問題。 因為我對指針沒有信心,這也可能是一個問題,因為我可能會不正確地分配東西。

最終發生的情況是,在向隊列中添加許多節點后,隊列中只有一個節點。 (它用於雜貨店模擬)

//Add data to front 
bool Queue::enqueue(Data newData) {
    return this->enqueue(this->pTail, newData);
}
bool Queue::enqueue(Node * pTail, Data newData) {
    //If queue is empty, head and tail point to the new Node
    Data * pData = new Data(newData);
    //Test if data was allocated to heap
    if (pData == nullptr) {
        return false;
    }
    //If empty
    if (pTail == nullptr) {
        pTail = new Node(pData);
        this->pHead = pTail;
    }
    //If queue isnt empty
    else {
        //Add new node to the old end, then set new end to new node
        pTail->setPNext(new Node(pData));
        pTail = pTail->getPNext();
    }
    return true;
}

節點類

class Node {
private:
    Data * pData;    
    Node * pNext;
public:
    Node() {
        pNext = nullptr;
    }
    Node(Data * n) {
        pData = n;
        pNext = nullptr;
    }
    ~Node() {
    }
    //Setter
    void setPNext(Node * newPNext) {
        pNext = newPNext;
    }
    void setData(Data newData) {
        pData->setData(&newData);
    }
    //Getters here

數據類

class Data {
private:
    int customerNumber;
    int serviceTime;   
    int totalTime;    
public: 
    Data() {
    }
    Data(int n, int s, int tPrev) {
        customerNumber = n;
        serviceTime = s;
        totalTime = tPrev;
    }
    Data(Data &d) {
        customerNumber = d.getCNum();
        serviceTime = d.getSTime();
        totalTime = d.getTotalTime();
    }
    Data &operator= (Data &d) {
        customerNumber = d.getCNum();
        serviceTime = d.getSTime();
        totalTime = d.getTotalTime();

        return *this;
    }

Queue 類的實現應該沒問題,所以我不會在這里包含它。

在 main 中,創建數據點然后添加到隊列中

    //Create new customer data (ints)
    Data newData(newCustomerNumber, newExpressTime, totalExpressTime);

    //Add customer to queue
    express.enqueue(newData);

bool Queue::enqueue(Node * pTail, Data newData)

您有兩個名為pTail變量。 一個是成員變量Queue::pTail ,但是這個成員被局部參數pTail隱藏( Variable Shadowing ),這是一個完全不同的變量,因為參數pTail是在更近的范圍內定義的。

Node指向由參數pTail通過引用傳遞和是相同的Node作為Queue::pTail點,但pTail本身由值來傳遞和僅僅是為地址的拷貝Queue::pTail的值。 這意味着當您重新pTail

pTail = new Node(pData);

例如, pTail副本被重新指向。 調用函數中的原始內容保持不變。

解決方案:

也通過引用傳遞指針。 改變

bool Queue::enqueue(Node * pTail, Data newData)

bool Queue::enqueue(Node *& pTail, Data newData)

旁注:

Data * pData = new Data(newData);
if (pData == nullptr) {
    return false;
}

不會做任何有用的事情。 分配給pDataData永遠不會分配給范圍更長的變量,因此在函數退出時會泄漏。 此外, new的默認行為是在失敗時拋出異常而不是返回nullptr 由於我沒有在任何地方看到默認行為被替換,我懷疑nullptr的測試永遠不會被使用。

Queue::enqueue應該看起來更像

bool Queue::enqueue(Node *& pTail, Data newData) {
    if (pTail == nullptr) {
        pTail = new Node(pData);
        this->pHead = pTail;
    }
    else {
        pTail->setPNext(new Node(pData));
        pTail = pTail->getPNext();
    }
    return true;
} 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM