2016-01-23 87 views
-2

我给了一个列表类,它有一个Node内部类。这里是内部类:push_front方法C++

class Node 
{ 
public: 
    /** 
    * The constructor 
    * @param data the data to be stored in this node 
    */ 
    explicit Node(const Object& data) 
     : data(data), next(NULL) {} 

    Object data; 
    Node * next; 
}; 

我们被告知写push_front方法,将一个元素推到一个列表的前面。我有一些麻烦提出正确的方法来做到这一点。该list类有3个私人属性:uint sizeNode * firstNode * last

我想到了push_front应的工作方式是这样的:如果列表目前是空的(即size = 0),那么任何对象,我们正在努力推动宜成为该清单上的最后一个元素。我们尝试推动的任何其他元素将成为第一个并指向下一个节点。

void push_front(const Object& item) 
{ 
    Node * new_node = new Node(item); 

    if (size == 0) 
    { 
     new_node = last; 
    } 
    else 
    { 
     Node * temp = first; 
     first->data = new_node; 
     first->next = temp; 
    } 

我不禁觉得这不是正确的方法来做到这一点。任何人都可以指引我正确的方向或建议我如何以正确的方式做到这一点?谢谢。 }

+0

你能对你的感觉拟订一项不对了? –

+0

我也建议删除C++ 11标记,除非你特别想要定位C++ 11的功能。 –

回答

2

线条

Node * new_node = new Node(item); 

if (size == 0) 
{ 
    new_node = last; 
} 

显然是有问题的。你已经分配了一个对象,但是如果这个对象是空的,你就把它扔掉了。这没有多大意义。

你也没有更新size任何地方,所以这也是一个问题。

你可能想沿着线的东西:

void push_front(const Object& item) 
{ 
    Node * new_node = new Node(item); 
    ++size; 

    if (size == 1) 
    { 
     new_node->next = nullptr; 
     first = last = new_node; 
     return; 
    } 

    new_node->next = first; 
    first = new_node; 
} 
+0

@ 5gon12eder非常感谢 - 你是对的。纠正。 –

+0

我们是如何预先增加的?我们是否应该在列表中推送一些内容后才修改'size'?换句话说,我们可以在最后加上'size ++',if语句是'if(size == 0)'吗? – GenericUser01

+0

@ GenericUser01“在列表中推送某些东西”在函数启动之前未启动,函数结束时已结束,并且在函数中处于不确定状态。在函数内部,基本上可以随意更新'size'。 –

2

所有你需要做的是:

  • 构建堆上
  • 如果size == 0使firstlast都指向新节点,否则分配当前的first一个新节点到new_node->next并使first指向什么new_node指向
  • 增量size

您的代码停止在new_node = last;决策意识(你刚才泄漏的内存,不关心first?),还有请在不匹配:

first->data = new_node; 
+0

我的想法是,“如果列表是空的,即size = 0,那么将这个新元素作为列表中的最后一个元素。之后,列表中的任何新元素都不能是最后一个元素,它可以只成为第一个元素。“至于增加规模,这是一个错字。我在没有注意的情况下打字,本来打算忘记。 – GenericUser01

+0

至于else中的代码段,我试图创建一个临时节点来保存'first'的当前内容,然后改变它的内容,使它包含'new_node'中的信息,然后让' new_node'(现在是'first')指向前一个元素。这至少是我试图去做的事情。 – GenericUser01