我无法让这个程序将节点附加到链表的末尾。我知道它必须与"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;
}
此代码有两个问题。首先,头不是E类型的指针,而是SNode类型的指针。当添加第一个项目时,第二个列表可能为空(头将为空)。所以你需要单独处理这个案子。以下代码应该有效:
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;
}