如何让我的程序向后打印链接列表?我让printForward函数工作正常,但printBackwards函数似乎没有做任何事情。我想我已走上正轨,但我现在有点卡住了。我认为while循环没有运行,因为temp由于某种原因是NULL。
任何帮助都会很棒。
由于
List.h
#include <iostream>
using namespace std;
class LinkedList
{
private:
struct Node
{
int data;
Node * next;
Node * prev;
};
Node * head, *tail;
public:
LinkedList();
bool addAtBeginning(int val);
bool remove(int val);
void printForward() const;
void printBackward() const;
};
#endif
List.cpp
#include "List.h"
LinkedList::LinkedList()
{
head = NULL;
tail = NULL;
}
bool LinkedList::addAtBeginning(int val)
{
Node* temp;
temp = new Node;
temp->data = val;
temp->next = head;
head = temp;
return false;
}
bool LinkedList::remove(int val)
{
return false;
}
void LinkedList::printForward() const
{
Node* temp = head;
while (temp != NULL) {
cout << temp->data << " ";
temp = temp->next;
}
cout << endl;
}
void LinkedList::printBackward() const
{
Node* temp = tail;
while (temp != NULL) {
cout << temp->data << " ";
temp = temp->prev;
}
cout << endl;
}
app.cpp
#include "list.h"
int main()
{
LinkedList aList;
aList.addAtBeginning(3);
aList.addAtBeginning(10);
aList.addAtBeginning(1);
aList.addAtBeginning(7);
aList.addAtBeginning(9);
aList.addAtBeginning(12);
aList.printForward();
aList.printBackward();
system("pause");
return 0;
}
答案 0 :(得分:0)
我觉得有点奇怪的是你只有addAtBeginning
方法,最后没有方法可以添加,后者我认为是链接列表的正常使用。话虽如此,我认为这里的直接问题是你永远不会将tail
分配给任何东西。试试这个版本的addAtBeginning
:
bool LinkedList::addAtBeginning(int val)
{
Node* temp;
temp = new Node;
temp->data = val;
temp->next = head;
if (head != NULL)
{
head->prev = temp;
}
if (head == NULL)
{
tail = temp;
}
head = temp;
return false;
`}
这里的逻辑是,对于空列表的第一个添加,我们将头部和尾部分配给初始节点。然后,在后续添加中,我们向列表的头部添加一个新元素,然后分配next
和prev
指针,以在两个方向上链接新节点。这应该允许你向后迭代列表,从尾部开始。
答案 1 :(得分:0)
使用给定的更新addAtBeginning函数:
bool LinkedList::addAtBeginning(int val)
{
Node* temp;
temp = new Node;
temp->data = val;
temp->prev = temp->next = NULL;
// If adding first node, then head is NULL.
// Then, set Head and Tail to this new added node
if(head == NULL){
// If this linked list is circular
temp->next = temp->prev = temp;
head = tail = temp;
}else{ // If we already have at least one node in the list
// If this linked list is circular
temp->prev = head->prev;
temp->next = head;
head->prev = temp;
head = temp;
}
return false;
}
但是请记住,如果你将这个函数复制到它使这个列表循环的部分,你将得到一个无限循环。因此,要么改变打印功能,要么不要复制那些部分。