Функция перемещения элементов списка в конец списка не работает несколько раз - PullRequest
0 голосов
/ 25 апреля 2019

Мне нужно сделать функцию, которая перемещает n-й элемент в односвязном списке в конец списка.Я создал некоторый код, который делает это, но он работает только один раз, если я пытаюсь сделать это снова, он перемещает выбранный элемент до конца, но тот, который был перемещен ранее, удаляется / исчезает.Моя теория состоит в том, что это фактически не меняет ссылку на хвост.так что я застрял прямо сейчас!

void move(int n)
    {
        if (head == NULL || head->next == NULL)
        {
            return;
        }
        node *first = head;
        node *temp =new node;

        for (int i = 1; i < n-1; i++)
        {
            first=first->next;
        }
        temp = first->next;
        first->next=first->next->next;
        temp->next = NULL;

        tail->next = temp;
        tail=temp;
    }

мой ввод: 1 2 3 4 5

после перемещения 3-го элемента в первый раз:

1 2 4 5 3

после перемещения 3-го элемента (4) во второй раз:

1 2 5 4

, но должно быть

1 2 5 3 4

1 Ответ

0 голосов
/ 25 апреля 2019

Я проверил ваш код в своей собственной реализации.Ваша функция move () работает нормально.Тем не менее, вы не должны использовать 'new' в своей 8-й строке кода, как выделено @molbdnilo и @PaulMakenzie.Но он не несет ответственности за эту проблему.Проблема с другой частью вашего кода.

#include<iostream>
using namespace std;

class List
{
    struct Node
    {
        int number;
        Node* next;
    };  

    Node* head;
    Node* tail;

    public:
    List()
    {
        head = NULL;
        tail = NULL;
    }
        void insert(int num)
    {
        Node* temp = new Node();
        temp->number = num;
        temp->next = NULL;

        if (head == NULL)
        {
            head = temp;
            tail = temp;
        }
        else
        {
            Node* point = head;
            while (point->next != NULL)
                point = point->next;

            point->next = temp;
            tail = point->next;
        }
    }
    void display()
    {
        Node* point = head;
        while (point != NULL)
        {
            cout << point->number << " ";
            point = point->next;
        }
    }

    void move(int n)
    {
        if (head == NULL || head->next == NULL)
        {
            return;
        }
        Node *first = head;
        Node *temp;

        for (int i = 1; i < n-1; i++)
        {
            first=first->next;
        }
        temp = first->next;
        first->next=first->next->next;
        temp->next = NULL;

        tail->next = temp;
        tail=temp;
    }
};

int main()
{
    List a;
    a.insert(1);
    a.insert(2);
    a.insert(3);
    a.insert(4);
    a.insert(5);

    a.move(3);
    a.move(3);

    a.display();

}


...