Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.04.2022, 19:01   #1
slava_q9
Пользователь
 
Регистрация: 03.03.2022
Сообщений: 14
Восклицание В списке содержится несколько нулей. Разместить их вначале списка

Помогите написать реализацию чтобы нулевые элементы выводились в начале списка, не могу понять(

Заранее спасибо

Код:
#include <iostream>
using namespace std;
 
struct Node // Узел
{
    int value; // Значение узла (значение)
    Node* next; // Следующий элемент узла
};
 
int main(int argc, char const* argv[]) {
    setlocale(LC_ALL, "Rus");
 
    Node* head = NULL; // голова списка
    Node* tail = NULL; // последний элемент списка
 
    int currentValue; // текущее значение
    Node* newNode = 0; // текущий узел
 
    int N;
    cout << "Введите кол-во чисел в списке: ";
    cin >> N;
 
    for (int i = 0; i < N; i++) {
        cout << "Введите число: ";
        cin >> currentValue;
 
        newNode = new Node();
        newNode->value = currentValue;
        newNode->next = NULL;
        if (head == NULL) {
            head = newNode;
            tail = newNode;
        }
        else {
            tail->next = newNode;
            tail = newNode;
        }
    }
    Node* current = head;  //Указатель на первый элемент списка (на голову)
 
    cout << "\nСписок до изменений: \n";
    while (current != NULL) {
        cout << current->value << " ";
        current = current->next;
    }
    cout << endl;
 
    current = head;
 
    Node* next = NULL;  // Следующий элемент списка
    Node* beginZero = NULL;
   
        for (int i = 1; i <= N; i++)
            next = current->next;
        {
            if (currentValue == 0) beginZero = current;
        }
        for (int i = 1; i <= N; i++)
            next = current->next;
       {
            if (currentValue == !0) beginZero = current;
 
       }
 
    current = next;
    current = head;
 
    cout << "\nСписок после изменений: \n";
    while (current != NULL) {
        cout << current->value << " ";
        current = current->next;
    }
    cout << endl;
    return 0;
}
slava_q9 вне форума Ответить с цитированием
Старый 17.04.2022, 20:58   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Самый первый элемент проверять на 0 нет надобности, он просто станет последним в последовательности нулевых или первым в ненулевых. А остальные можно просто переставить в начало.
Код:
for (prev = head, current = head->next; current != NULL; current = current->next) if (current->value==0) {
  prev->next = current->next;
  current->next = head;
  head = current;
  current = prev;
} else prev = current;

Последний раз редактировалось macomics; 17.04.2022 в 21:02.
macomics вне форума Ответить с цитированием
Старый 17.04.2022, 23:29   #3
сфинкс
Форумчанин
 
Аватар для сфинкс
 
Регистрация: 17.06.2012
Сообщений: 957
По умолчанию

qb64 qbasic гораздо короче и массив синтезирует
вызывая уважение пользователя
и внутри распечатка перемещений

Код:
N = 6: Dim a(N): Randomize Timer 'nuli.bas
For i = 1 To N - 1 Step 2: a(i) = Int(Rnd * 9 + 1): a(i + 1) = 0: Next
For i = 1 To N: Print a(i);: Next: Print: Print

For i = 1 To N - 1: For j = i To N - 1
    If a(j + 1) = 0 Then Swap a(j), a(j + 1)
        Print i; i + 1,: For k = 1 To N: Print a(k);: Next: Print
Next: Next: Print: Print

For i = 1 To N: Print a(i);: Next
3 0 7 0 2 0
распечатка перемещений 15 штук и ответ
0 0 0 3 7 2

qb64 qbasic on-line компилятор:
_https://boxgm.itch.io/qbjs

да и количество перестановок как в милли визуализации

Случайные и Массивы https://programmersforum.ru/showthread.php?t=344371 Учим C# & basic & excel & python https://programmersforum.ru/showthre...=327446&page=5 ничего нерекомендую

Последний раз редактировалось сфинкс; 17.04.2022 в 23:35.
сфинкс вне форума Ответить с цитированием
Старый 19.04.2022, 13:38   #4
slava_q9
Пользователь
 
Регистрация: 03.03.2022
Сообщений: 14
По умолчанию

macomics, спасибо выручили))))
slava_q9 вне форума Ответить с цитированием
Старый 19.04.2022, 18:06   #5
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от сфинкс Посмотреть сообщение
3 0 7 0 2 0
распечатка перемещений 15 штук и ответ
0 0 0 3 7 2

qb64 qbasic on-line компилятор:
_https://boxgm.itch.io/qbjs

да и количество перестановок как в милли визуализации
Отлично, только в примере на Си будет вообще 3 перемещения. Вы сравниваете сортировку массива с динамическим списком. Даже если не принимать во внимание оператор Swap, который совершает 3 операции присвоения, то алгоритм на Си сделает только 12 присвоений и всего 5 итераций цикла.

Последний раз редактировалось macomics; 19.04.2022 в 18:25.
macomics вне форума Ответить с цитированием
Старый 20.04.2022, 14:18   #6
сфинкс
Форумчанин
 
Аватар для сфинкс
 
Регистрация: 17.06.2012
Сообщений: 957
По умолчанию

ваш пример поймут 1% от 1% читателей
зато мой пример поймут все

и qbasic qb64 на экране показывает
моё любимое слово: визуализации

добавлено после всех: отступы расставил
язык высочайшего уровня qbasic qb64
Случайные и Массивы https://programmersforum.ru/showthread.php?t=344371 Учим C# & basic & excel & python https://programmersforum.ru/showthre...=327446&page=5 ничего нерекомендую

Последний раз редактировалось сфинкс; 20.04.2022 в 18:46.
сфинкс вне форума Ответить с цитированием
Старый 20.04.2022, 14:24   #7
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от сфинкс Посмотреть сообщение
ваш пример поймут 1% от 1% читателей
зато мой пример поймут все
Спорное утверждение
Хотя бы отступы соблюдали у закрывающих конструкций.
macomics вне форума Ответить с цитированием
Старый 21.04.2022, 06:20   #8
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

Цитата:
Сообщение от сфинкс Посмотреть сообщение
qb64 qbasic гораздо короче
слишком многословно

Код:
#include <iostream>
#include <algorithm>
#include <list>

int main()
{
    std::list<int> arr{1,4,8,0,7,4,0,7,0,0,7,3,5,8,0,7,5,0};
    std::partition(arr.begin(),arr.end(),[](auto& i){return i==0;});
    for(const auto& s:arr)std::cout << s << ',';
}
Цитата:
0,0,0,0,0,0,4,7,7,8,7,3,5,8,4,7,5,1 ,

Последний раз редактировалось Алексей1153; 21.04.2022 в 06:22.
Алексей1153 вне форума Ответить с цитированием
Старый 21.04.2022, 12:55   #9
сфинкс
Форумчанин
 
Аватар для сфинкс
 
Регистрация: 17.06.2012
Сообщений: 957
По умолчанию

пример выше:

148074070073580750
000000
148747735875
477873584751

порядок цифр вопиюще душно токсично нарушен

в сообщении ниже кусок кода
вместо работо-способной программы: пол-работы и неуважение

вот поэтому мы так и живём
Случайные и Массивы https://programmersforum.ru/showthread.php?t=344371 Учим C# & basic & excel & python https://programmersforum.ru/showthre...=327446&page=5 ничего нерекомендую

Последний раз редактировалось сфинкс; 21.04.2022 в 13:54.
сфинкс вне форума Ответить с цитированием
Старый 21.04.2022, 13:37   #10
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

сфинкс, про поддержание порядка в задании не сказано. Но если сильно нужно, то
std:: partition
->
std::stable_partition
Алексей1153 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В списке содержится несколько нулей. Разместить их вначале через один элемент, первый, третий, пятый и т.д. slava_q9 Общие вопросы C/C++ 0 15.04.2022 20:56
В списке содержится несколько нулей. Разместить их вначале через один элемент, первый, третий, пятый и т.д slava_q9 Общие вопросы C/C++ 1 18.03.2022 10:35
В списке содержится несколько нулей. Разместить их вначале через один элемент, первый, третий, пятый и т.д slava_q9 C/C++ Базы данных 1 09.03.2022 11:46
Как разместить в окне несколько дополнительных данных? taras-proger77 Win Api 8 15.04.2019 12:16
Среди простых чисел, не превосходящих заданного N, найти такое, в двоичной записи которого содержится минимальное число нулей. Ace_400 Общие вопросы C/C++ 6 23.12.2017 22:01