链表,将节点添加到末尾



我正在做一个项目,我被赋予了这个功能来完成

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_fieldset_link()设置到link_field 的新链接

好吧,我们猜测他们希望你用std::stod这样的函数将字符串变成双精度。

至于你的列表操作代码,有几个问题:

node *temp = new node;
temp = head;

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

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);
}

相关内容

  • 没有找到相关文章

最新更新