我正在研究一个项目,我得到了这个功能来完成
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
答案 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(即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);
}