[英]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;
}
不會做任何有用的事情。 分配給pData
的Data
永遠不會分配給范圍更長的變量,因此在函數退出時會泄漏。 此外, 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.