Разделите четные и нечетные узлы в связанном списке сначала с нечетным узлом - PullRequest
0 голосов
/ 07 апреля 2020

Мой код не отображает вывод. Это мой вопрос

Учитывая список, измените его так, чтобы все нечетные элементы отображались перед четными. Порядок нечетных и четных элементов должен оставаться неизменным.

Формат ввода Первая строка содержит целое число N, количество элементов в списке.

Следующая строка содержит N разделенных пробелами целых элементов списка

Пример ввода 5 1 2 3 4 5

Пример ввода 1 3 5 2 4

#include <iostream>
using namespace std;
class node
{
public:
    int data;
    node *next;
    node (int d)
    {
        data = d;
        next = NULL;
    }

};
void insert(node *&head, node*&tail ,int data)
{
    if (head == NULL)
    {
        head = tail = new node (data);
        return ;
    }

    else
    {
        node* n = new node(data);
        tail->next = n;
        tail = n;
    }


}
void seg(node *&head)
{
    node *current = head;
    node *estart = NULL;
    node *Eend = NULL;
    node *ostart = NULL;
    node *oend = NULL;
    while (current != NULL)
    {
        int value = current->data;
        if (value % 2 == 0)
        {
            if (estart == NULL)
            {
                estart = Eend = current;

            }
            else
            {
                Eend->next = current;
                current = Eend;
            }
        }
        else
        {
            if (ostart == NULL)
            {
                ostart = oend = current;
            }
            else
            {
                oend->next = current;
                current = oend;
            }
        }
        current = current->next;
    }
    if (ostart != NULL)
    {
        head = ostart;
        oend->next = estart;
        Eend->next = NULL;
    }
    else
    {
        head = estart;
        Eend->next = NULL;
    }
}
void print(node *head)
{
    while (head != NULL)
    {
        cout << head->data;
        head = head->next;
    }
    cout << endl;
}
int main()
{
    node *head = NULL, *tail = NULL;
    int n;
    cin >> n;
    int m;
    for (int i = 1; i <= n; i++)
    {
        cin >> m;
        insert(head, tail, m);
    }
    seg(head);
    print(head);
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 07 апреля 2020

Если нет необходимости использовать собственный класс связанного списка, вы можете легко сделать это с помощью std::stable_partition. Считайте числа в контейнер, такой как std::vector, а затем просто выполните std::stable_partition(a.begin(), a.end(), [](int x) { return x % 2; }). Этот синтаксис с квадратными скобками является лямбда-выражением , и в основном это функциональный литерал.

0 голосов
/ 07 апреля 2020

Ваша функция seg неправильно связывает узлы. При обновлении концов четных / нечетных связанных списков вместо

Eend->next = current;
current = Eend;

и

oend->next = current;
current = oend;

необходимо выполнить

Eend = Eend->next = current;

и

oend = oend->next = current;

соответственно. Это правильно увеличивает концы четных / нечетных списков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...