Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 读取访问冲突(此->;headPtr为0xcdcd)_C++_Linked List - Fatal编程技术网

C++ 读取访问冲突(此->;headPtr为0xcdcd)

C++ 读取访问冲突(此->;headPtr为0xcdcd),c++,linked-list,C++,Linked List,Remove(T&item)应该删除headPtr并将“item value”存储在“item”中并返回true,否则如果队列中没有元素,则返回false。我在这个函数中得到一个“读取访问冲突错误”。 下面是类和函数定义: class SharedQueue { public: SharedQueue(); ~SharedQueue(); //Return true if the queue is empty bool IsEmpty() const;

Remove(T&item)应该删除headPtr并将“item value”存储在“item”中并返回true,否则如果队列中没有元素,则返回false。我在这个函数中得到一个“读取访问冲突错误”。 下面是类和函数定义:

class SharedQueue {
public:
    SharedQueue();
    ~SharedQueue();

    //Return true if the queue is empty
    bool IsEmpty() const;

    //Enqueue the next item at the tail of the queue.
    void Add(T value);

    //Dequeue the next queue element and store it in "item" variable.  The function returns false if the queue is empty and no item can be retrieved.
    bool Remove(T &item);
    void Print();
private:
    struct QueueItem {
        T item;
        QueueItem *next;
    };
    //Fill in the The private data members.
    QueueItem *headPtr;
    QueueItem *tailPtr;
};

template <typename T> SharedQueue<T>::SharedQueue() {
    headPtr = NULL;
    tailPtr = NULL;
}

template <typename T>SharedQueue<T>::~SharedQueue() {
    QueueItem *temp;
    while (headPtr != NULL) {
        temp = headPtr;
        headPtr = headPtr->next;
        delete temp;
    }
}

template <typename T> bool SharedQueue<T>::IsEmpty() const {
    if (headPtr == NULL && tailPtr == NULL) {
        return true;
    }
    return false;
}

template <typename T> void SharedQueue<T>::Add(T aValue) {
    if (headPtr == NULL) {
        QueueItem *newItem = new QueueItem;
        newItem->item = aValue;
        tailPtr = headPtr = newItem;
    }
    else {
        QueueItem *newItem = new QueueItem;
        newItem->item = aValue;
        tailPtr->next = newItem;
        tailPtr = tailPtr->next;
    }
}

template <typename T> bool SharedQueue<T>::Remove(T &item) {
    if (headPtr == NULL) {
        return false;
    }
    else {
        QueueItem temp = *headPtr;
        item = headPtr->item;
        delete headPtr;
        headPtr = temp.next;
        return true;
    }
}

template <typename T> void SharedQueue<T>::Print() {
    QueueItem *temp = headPtr;
    while (temp != NULL) {
        std::cout << temp->item << "\n";
        temp = temp->next;
    }
}
类共享队列{
公众:
SharedQueue();
~SharedQueue();
//如果队列为空,则返回true
bool IsEmpty()常量;
//将队列末尾的下一个项目排队。
空加(T值);
//将下一个队列元素出列并将其存储在“item”变量中。如果队列为空且无法检索任何项目,则函数返回false。
bool移除(T和项目);
作废打印();
私人:
结构队列项{
T项;
队列项目*下一步;
};
//填写私有数据成员的列表。
队列项目*headPtr;
队列项目*tailPtr;
};
模板SharedQueue::SharedQueue(){
headPtr=NULL;
tailPtr=NULL;
}
模板SharedQueue::~SharedQueue(){
队列项目*温度;
while(headPtr!=NULL){
温度=水头;
headPtr=headPtr->next;
删除临时文件;
}
}
模板bool SharedQueue::IsEmpty()常量{
if(headPtr==NULL&&tailPtr==NULL){
返回true;
}
返回false;
}
模板void SharedQueue::Add(T aValue){
如果(headPtr==NULL){
QueueItem*newItem=新的QueueItem;
newItem->item=aValue;
tailPtr=headPtr=新项目;
}
否则{
QueueItem*newItem=新的QueueItem;
newItem->item=aValue;
tailPtr->next=newItem;
tailPtr=tailPtr->next;
}
}
模板bool SharedQueue::Remove(T和item){
如果(headPtr==NULL){
返回false;
}
否则{
QueueItem temp=*headPtr;
物料=表头->物料;
删除headPtr;
headPtr=下一个温度;
返回true;
}
}
模板无效SharedQueue::Print(){
QueueItem*temp=headPtr;
while(temp!=NULL){
std::下一个cout项;
}
}

将项目添加到非空的
共享队列时

您从未设置
newItem->next=NULL


您的私有
struct QueueItem
可以(也可能应该)有自己的构造函数/析构函数,以帮助确保这样的设置是一致的。

当您将项添加到非空
共享队列时

您从未设置
newItem->next=NULL


您的私有
struct QueueItem
可以(也可能应该)有自己的构造函数/析构函数,以帮助确保这样的设置是一致的。

为什么不使用
std::queue
而不是手动实现?而且你的类没有复制构造函数,所以这可能会把你的项目搞砸。看见在任何情况下,我都建议将
Remove()
else
更改为:
QueueItem*temp=headPtr->next;物料=表头->物料;删除headPtr;headPtr=温度和顺便说一句,当你删除最后一项时,别忘了将
tail
也重置为NULL。这是一个课堂作业,讲师给了我们起始代码,我们必须填写所有内容。请看:@Bobby:请展示一个演示你如何实际使用这个类的代码。@Bobby:你根本没有展示测试代码,只有类实现,但没有实际使用该类的代码。顺便说一句,由于您在构造之后从未将
tail
设置为NULL,
IsEmpty()
在至少添加了一个项之后,即使删除了所有项,也不会返回true。为什么不使用
std::queue
而不是手动实现呢?而且你的类没有复制构造函数,所以这可能会把你的项目搞砸。看见在任何情况下,我都建议将
Remove()
else
更改为:
QueueItem*temp=headPtr->next;物料=表头->物料;删除headPtr;headPtr=温度和顺便说一句,当你删除最后一项时,别忘了将
tail
也重置为NULL。这是一个课堂作业,讲师给了我们起始代码,我们必须填写所有内容。请看:@Bobby:请展示一个演示你如何实际使用这个类的代码。@Bobby:你根本没有展示测试代码,只有类实现,但没有实际使用该类的代码。顺便说一句,由于您在构造之后从未将
tail
设置为NULL,
IsEmpty()
在至少添加了一项之后,即使删除了所有项,也不会返回true。捕捉得好,我完全错过了。捕捉得好,我完全错过了。
    QueueItem *newItem = new QueueItem;
    newItem->item = aValue;
    tailPtr->next = newItem;
    tailPtr = tailPtr->next;