在链表的末尾添加并在链表中显示第一个值?

时间:2016-03-18 23:36:40

标签: c++

我正在为一个作业制作一个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;
}
 }




}

1 个答案:

答案 0 :(得分:0)

您遇到的问题是您正在创建一个本地变量before,它是指向链接列表头部的指针。插入时,您更改了before指向的内容。请记住,这不会影响列表头部实际指向的内容。您只需将before更改为指向新节点而不是头节点。

在您的项目中,请确保您正在更新班级的headtail属性,而不是可能指向headtail的本地指针。此外,在类构造函数中,您应该将头设置为NULL而不是实际节点。否则,isEmpty在创建空列表时不会解析为true。

由于这是一个类项目,可能最好让你调试其他问题,我可能会看到这么好运!有时,使用GDB逐步执行代码以查明它何时执行您不打算执行的操作是有帮助的。