Печать моего связанного списка в обратном порядке на C ++

c++ linked-list

20684 просмотра

6 ответа

Так что я довольно новичок в C ++, и сегодня я решил сесть и понять, как работают связанные списки. Пока мне очень нравится это делать, но я столкнулся с проблемой при попытке напечатать свой связанный список в обратном порядке (а не в обратном порядке связанного списка!)

Кроме того, я хотел сделать это без двойного связанного списка:

#include <iostream>
#include <string>

using namespace std;

class LinkedList
{
    public:
        LinkedList()
        {
            head = NULL;
        }

        void addItem(string x)
        {
            if(head == NULL)
            {
                head = new node();
                head->next = NULL;
                head->data = x;
            } else {
                node* temp = head;
                while(temp->next != NULL)
                    temp = temp->next;

                node* newNode = new node();
                newNode->data = x;
                newNode->next = NULL;
                temp->next = newNode;
            }
        }
        void printList()
        {
            node *temp = head;
            while(temp->next != NULL)
            {
                cout << temp->data << endl;
                temp = temp->next;
            }
            cout << temp->data << endl;
        }

        void addToHead(string x)
        {
            node *temp = head;
            head = new node;
            head->next = temp;
            head->data = x;
        }

        int countItems()
        {
            int count = 1;
            for(node* temp = head; temp->next != NULL; temp = temp->next)
                ++count;
            return count;
        }

        void printReverse()
        {
            node* temp2;
            node* temp = head;
            while(temp->next != NULL)
                temp = temp->next;

            //Print last node before we enter loop
            cout << temp->data << endl;

            for(double count = countItems() / 2; count != 0; --count)
            {
                //Set temp2 before temp
                temp2 = head;
                while(temp2->next != temp)
                    temp2 = temp2->next;
                cout << temp2->data << endl;

                //Set temp before temp2
                temp = head;
                while(temp->next != temp2)
                    temp = temp->next;
                cout << temp->data << endl;
            }
            cout << "EXIT LOOP" << endl;
        }

    private:
        struct node
        {
            string data;
            node *next;
        }

    *head;
};

int main()
{
    LinkedList names;

    names.addItem("This");
    names.addItem("is");
    names.addItem("a");
    names.addItem("test");
    names.addItem("sentence");
    names.addItem("for");
    names.addItem("the");
    names.addItem("linked");
    names.addItem("list");

    names.printList();

    cout << endl;

    names.addToHead("insert");

    names.printList();

    cout << endl;

    cout << names.countItems() << endl;

    cout << "Print reverse: " << endl;
    names.printReverse();
    cout << endl;

    return 0;
}

Теперь я не уверен точно, почему мой код падает, любая помощь приветствуется!

Спасибо!

Автор: Marcan Источник Размещён: 12.11.2019 09:04

Ответы (6)


4 плюса

Решение

Внутри printListвы также должны проверить head == NULL, в противном случае вы получаете доступ к элементам указателя, указывающего на NULL. Следующее должно работать.

    void printList()
    {
        node *temp = head;
        while(temp != NULL) // don't access ->next
        {
            cout << temp->data << endl;
            temp = temp->next;
        }
    }

В printReverse()I действительно не могу понять , почему вы берете половину подсчетов элементов для печати и печати двух элементов в каждой итерации. Тем не менее, вам действительно не нужен цикл for. Вы можете просто остановиться сразу temp == headпосле цикла, с тех пор вы просто распечатали головку. И печатать только один элемент, следующий указатель которого указывает на ранее напечатанный элемент.

Другая, рекурсивная попытка решить проблему выглядит так:

    void printReverse()
    {
        printReverseRecursive(head);
    }
    void printReverseRecursive(node *n)
    {
        if(n) {
            printReverseRecursive(n->next);
            cout << n->data << endl;
        }
    }
Автор: leemes Размещён: 05.01.2013 11:08

2 плюса

void printReverse()
{
    printReverse(head) //kickstart the overload function below
}
void printReverse(node *n)
{
    if(n == 0) return;
    printReverse(n->next);   //print the next
    cout << n->data << endl; //before printing me
}
Автор: user34537 Размещён: 05.01.2013 11:32

2 плюса

Вам следует подумать о переписывании вашего цикла, чтобы он начинался с последнего элемента (как вы это сделали), и чтобы условие цикла было остановлено, когда вы достигнете head. Двойной код внутри forцикла вместе со странной count/2логикой, безусловно, сбивает вас с толку (и нас).

temp = [last element]

while not at head
    print temp
    temp = previous element

print head

Обратите внимание, что у вас уже есть код для temp = previous elementдетали:

temp2 = head;
while(temp2->next != temp)
    temp2 = temp2->next;

Поскольку я предполагаю, что это присваивание какого-то типа, я намеренно не даю вам код на С ++ для этого. Даже если это не задание, работа с ним с учетом этого должна стать тем опытом обучения, который вам нужен. Однако, если вы решите проблему и у вас все еще есть проблема, не стесняйтесь обновить свой вопрос (или опубликовать новый).

Автор: JaredC Размещён: 05.01.2013 11:17

1 плюс

for(double count = countItems() / 2; count != 0; --count)
            {
                //Set temp2 before temp
                temp2 = head;
                while(temp2->next != temp)
                    temp2 = temp2->next;
                cout << temp2->data<< "   " << endl;

                //Set temp before temp2
                temp = head;
                while(temp->next != temp2)
                    temp = temp->next;
                cout << temp->data << "   "<< endl;
            }
            cout << "EXIT LOOP" << endl;

Ваша программа падает из-за второго цикла. Подсказка: просмотрите его, добавив в список только два элемента, например «Hello» -> «You» -> NULL. И присмотритесь к своему предикату цикла (temp-> next! = Temp2).

Автор: kaan Размещён: 05.01.2013 11:49

0 плюса

void ReversePrint (Node * head) {

Node *curNode=head;

if(curNode!=NULL){

    if(curNode->next!=NULL){
        ReversePrint(curNode->next);
    }

    cout<<curNode->data<<endl;

}

}

Автор: Jay Размещён: 17.09.2017 08:38

0 плюса

Распечатка выписки должна быть такой:

void print() {
    node *temp;
    temp= head;
    while (temp != NULL) {
        cout << temp->data << " ";
        temp = temp->next;
    }
}
Автор: Butterfly Размещён: 02.08.2017 05:16
Вопросы из категории :
32x32