我正在为一个作业制作一个Queue单链表。我的insert方法应该在链表的末尾添加值。我的first()方法应该返回链表中第一个节点的值。以下是我的尝试:
void QueueList::insert(const BinType & item)
{
try
{
Node *before = head;
Node *after = before->next;
if (numberOfNodes == 0)
{
before->next = tail = CreateNode(item, after);
}
else
{
Node *tmp = head;
while (tmp && tmp->next != NULL) tmp = tmp->next;
Node *tmp1 = CreateNode(item, nullptr);
if (tmp == NULL)
head = tmp1;
else
tmp->next = tmp1;
}
numberOfNodes++;
}
catch (const std::exception err)
{
cerr << "QueueList Error: " << err.what() << endl;
}
}
我的第一个方法
BinType QueueList::first() const { return head->item; }
我的司机
QueueList one;
one.insert(2);
cout<<one.first()<<endl;
当我这样做时,控制台打印0.我不知道为什么它不返回2?
编辑:班级代码
#include "QueueList.h"
#include <sstream>
#include <string>
#include <iostream>
using namespace std;
namespace DB{
void QueueList::releaseNodes()
{
Node *del = head;
while (head != nullptr) {
head = head->next;
del->next = nullptr;
delete del;
del = head;
}
tail = nullptr;
numberOfNodes = 0;
}
QueueList::Node* QueueList::CreateNode(const BinType & item, Node * const next)
{
if (new Node(item,next) == nullptr)
{
throw bad_alloc();
}
return new Node(item,next);
}
QueueList::QueueList()
{
head = tail = CreateNode(BinType(), nullptr);
numberOfNodes = 0;
}
QueueList::~QueueList()
{
releaseNodes();
}
void QueueList::insert(const BinType & item)
{
try
{
Node *before = head;
Node *after = before->next;
if (numberOfNodes == 0)
{
before = tail = CreateNode(item, nullptr);
}
else
{
Node *tmp = head;
while (tmp && tmp->next) tmp = tmp->next;
Node *tmp1 = CreateNode(item, nullptr);
if (tmp == NULL)
head = tmp1;
else
tmp->next = tmp1;
}
numberOfNodes++;
}
catch (const std::exception err)
{
cerr << "QueueList Error: " << err.what() << endl;
}
}
BinType QueueList::remove()
{
if (numberOfNodes == 0)
{
throw bad_alloc();
}
Node *del;
del = head->next;
head->next = del->next;
numberOfNodes--;
}
BinType QueueList::first() const
{
return head->item;
}
int QueueList::size() const
{
return numberOfNodes;
}
bool QueueList::isEmpty() const
{
if (head == nullptr)
{
return true;
}
}
}
答案 0 :(得分:0)
您遇到的问题是您正在创建一个本地变量before
,它是指向链接列表头部的指针。插入时,您更改了before
指向的内容。请记住,这不会影响列表头部实际指向的内容。您只需将before
更改为指向新节点而不是头节点。
在您的项目中,请确保您正在更新班级的head
和tail
属性,而不是可能指向head
和tail
的本地指针。此外,在类构造函数中,您应该将头设置为NULL而不是实际节点。否则,isEmpty在创建空列表时不会解析为true。
由于这是一个类项目,可能最好让你调试其他问题,我可能会看到这么好运!有时,使用GDB逐步执行代码以查明它何时执行您不打算执行的操作是有帮助的。