我正在做一个项目,我被赋予了这个功能来完成
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
的新链接
好吧,我们猜测他们希望你用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(即link
和set_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);
}