链接列表,添加节点结束

时间:2014-09-21 03:16:39

标签: c++ list linked-list

我正在研究一个项目,我得到了这个功能来完成

void addToEnd(node*& head, string newVal)

Effect:  adds new node to tail end of list 
Precondition: head is a pointer to first node in the list (list MAY be empty)
Postcondition: list contains one more node

我的问题是newVal是什么字符串?

这个类的value_type是DOUBLE类型,所以我很困惑newVal是什么字符串。所以我不能在节点中设置newVal,因为它有两种不同的类型。

这是我到目前为止所拥有的。我不确定我是否朝着正确的方向前进。

node *temp = new node;
temp = head;

while(temp->link() != NULL){
    temp = temp->link();
}

head->set_link(temp);

我甚至不确定在这段代码中使用字符串的位置。

link()返回成员变量node* link_field set_link()设置link_field

的新链接

1 个答案:

答案 0 :(得分:1)

好吧,我们猜测他们会以某种方式将某个字符串转换为带有std::stod之类函数的双字符串。

至于你的列表操作代码,还有一些问题:

node *temp = new node;
temp = head;

这会创建一个新节点,将其指针放在temp中,然后立即用temp覆盖head,从而丢失(泄漏)新节点。别这么做。

while(temp->link() != NULL){
    temp = temp->link();
}

这很接近,但可能无效。问题是您需要跟踪真实节点指针,而不是副本。

通常,在使用指针而不是引用的链表API中,"添加节点"功能看起来像:

void addToEnd(node** head, string newVal)
{
    while(*head)
        head = &((*head)->next);
    *head = new node;
    (*head)->value = newVal;
    (*head)->next = 0;
}

请注意,如果列表为空,则传入的头指针将更改为指向新节点。如果列表不为空,则改为改变最后next指针。

您提供的API(即linkset_link方法)不允许这样做,因为头指针不是node并且这些函数需要node。所以你必须有所不同,即你必须单独处理空列表案例。

void addToEnd(node*& head, string newVal)
{
    // Create the node.
    node* newNode = new node;
    newNode->value = std::stod(newVal);
    newNode->set_link(0);

    if(!head) // Empty list?
    {
        head = newNode;
        return;
    }

    // Find last node.
    node* item = head;
    while(item->link())
        item = item->link();
    item->set_link(newNode);
}