如何在C ++中向后打印链接列表

时间:2018-06-05 01:36:39

标签: c++ linked-list

如何让我的程序向后打印链接列表?我让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;
}

2 个答案:

答案 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;
`}

这里的逻辑是,对于空列表的第一个添加,我们将头部和尾部分配给初始节点。然后,在后续添加中,我们向列表的头部添加一个新元素,然后分配nextprev指针,以在两个方向上链接新节点。这应该允许你向后迭代列表,从尾部开始。

答案 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;
}

但是请记住,如果你将这个函数复制到它使这个列表循环的部分,你将得到一个无限循环。因此,要么改变打印功能,要么不要复制那些部分。