我无法让这个程序将节点附加到链表的末尾。我知道它必须对“addBack”函数做一些事情,因为“addFront”函数工作得很好。我认为这应该足够了,但如果需要更多的代码,只需要问,你们就会收到。
template <typename E>
void SLinkedList<E>::addBack(const E& e)
{
E *temp = head;
while (temp -> next != NULL)
temp = temp -> next;
SNode<E> * v = new SNode<E>;
temp -> next = v;
v -> elem = e;
v -> next = NULL;
}
答案 0 :(得分:1)
此代码存在两个问题。首先,头部不是类型E的指针,而是它是SNode类型的指针。 当添加第一个项目时,2个列表可能为空(头部将为NULL)。所以你需要单独处理这个案例。 以下代码应该有效:
template <typename E>
void SLinkedList<E>::addBack(const E& e)
{
SNode<E> * v = new SNode<E>;
v -> elem = e;
v -> next = NULL;
if(head == NULL) //list is empty
head = v;
else
{
SNode<E> *temp = head;
while (temp -> next != NULL)
temp = temp -> next;
temp -> next = v;
}
}
但是对于更快的插入,您必须有两个指针,包括列表的头部和尾部。您不需要迭代整个列表来查找尾部。但是,在列表中添加和删除节点时,您必须同时满足头部和尾部的要求。 如果你有两个指针,这将是函数:
template <typename E>
void SLinkedList<E>::addBack(const E& e)
{
SNode<E> * v = new SNode<E>;
v -> elem = e;
v -> next = NULL;
if(head == NULL) //list is empty
head = tail = v;
else
tail -> next = v;
}