Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/40: Рейтинг темы: голосов - 40, средняя оценка - 4.63
2 / 2 / 1
Регистрация: 28.11.2016
Сообщений: 85

После каждого элемента списка добавить предшествующую ему часть списка

18.09.2017, 22:34. Показов 8414. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пусть дан список. После каждого элемента добавьте предшествующую ему часть списка. Не совсем понимаю,как это сделать. Единственное,что я смогла сделать,это создать список и вывести его))
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include "stdafx.h"
#include <iostream>
using namespace std;
struct Node {
    int data;
    Node *next;
};
void PLEASE_WORKING(Node *ptr, int n) {
//здесь,скорее всего,должен быть весь функционал,который вставляет после элемента часть списка.
}
 
 
int main()
{
    int n;
    cin >> n;
    Node *head,*last;
    head = new Node;
    last = head;
    int k = 1;
    while (n > 0) {
        last->next = new Node;
        last = last->next;
        last->data = k;
        last->next = NULL;
        k++;
        n--;
    }
    for (Node *current = head; current != last;) {
        current = current->next;
        cout << current->data << endl;
    }
    int l = 0;
    for (Node *uk = head; uk != last;) {
        l++;
        uk = uk->next;
        PLEASE_WORKING(uk,l);
    }
 
    system ("pause");
    return 0;
}
застопорилась,не знаю,что дальше. помогите,натолкните на мысль,пожалуйста))
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.09.2017, 22:34
Ответы с готовыми решениями:

Добавить после каждого положительного элемента списка нулевой элемент
дан односвязный список. как добавить после каждого положительного элемента нулевой элемент и записать это в файл?

Обработка списка: после каждого нуля добавить предшествующую часть списка
Дан список чисел, нужно после каждого нуля добавить предшествующую часть списка. Написал что-то, но не работает, выдает ошибку. sp _...

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

16
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,922
18.09.2017, 23:41
Список стоило бы оформить отдельным классом вместо того чтобы управлять указателями из main'а.
Для вывода два варианта: либо проходить с начала до искомого, попутно выводя найденное.
Либо сделать список двусвязным (к переменной *next добавить *prev) и перебирать от текущего до начала.
0
 Аватар для Старый воин
93 / 92 / 21
Регистрация: 16.08.2017
Сообщений: 188
Записей в блоге: 1
18.09.2017, 23:51
Здравствуйте!
Судя по формулировке, задание можно понимать так (на мой взгляд):
1. Допустим, существует список (3, 6, 1, 8).
2. После каждого элемента добавляем пердшествующую ему часть списка следующим образом. Перед первым элементом ничего нет, следовательно, добавить нечего. После второго элемента добавляем первый (в нашем случае 3). После третьего элемента добавляем первый и второй (3 и 6) и так далее.
Результат будет таким: 3, 6, 3, 1, 3, 6, 8, 3, 6, 1
0
694 / 304 / 99
Регистрация: 04.07.2014
Сообщений: 851
19.09.2017, 00:10
А может так?

3618 -> 3()618 -> 36(3)18 -> 3631(363)8 -> 36313638(3631363) -> 363136383631363
0
 Аватар для Старый воин
93 / 92 / 21
Регистрация: 16.08.2017
Сообщений: 188
Записей в блоге: 1
19.09.2017, 00:35
AlexVRud, Да, тоже как вариант
0
 Аватар для Babysitter
245 / 139 / 53
Регистрация: 23.11.2015
Сообщений: 394
19.09.2017, 00:55
Цитата Сообщение от AlexVRud Посмотреть сообщение
3618 -> 3()618 -> 36(3)18 -> 3631(363)8 -> 36313638(3631363) -> 363136383631363
C++
1
2
3
4
5
6
7
    std::list<int> l { 3, 6, 1, 8 };
    auto i = l.begin();
    auto k = ++i;
    ++k;
    for(; i != l.end(); i = k, ++k) {
        l.insert(k, l.begin(), i);
    }
0
2 / 2 / 1
Регистрация: 28.11.2016
Сообщений: 85
19.09.2017, 11:55  [ТС]
нужно именно указателями, класс создавать нельзя

Добавлено через 8 минут
сделать список двусвязным 5 минут, просто как саму функцию сделать, как алгоритм сделать, я не представляю пока
0
 Аватар для Nishen
1358 / 856 / 366
Регистрация: 26.02.2015
Сообщений: 3,814
19.09.2017, 13:50
Цитата Сообщение от marymap Посмотреть сообщение
нужно именно указателями
Цитата Сообщение от marymap Посмотреть сообщение
класс создавать нельзя
И как это вяжется между собой?
0
 Аватар для Старый воин
93 / 92 / 21
Регистрация: 16.08.2017
Сообщений: 188
Записей в блоге: 1
19.09.2017, 15:18
marymap, То есть, реализовать список не используя "list"?
0
2 / 2 / 1
Регистрация: 28.11.2016
Сообщений: 85
19.09.2017, 15:45  [ТС]
Старый воин, да
0
 Аватар для Старый воин
93 / 92 / 21
Регистрация: 16.08.2017
Сообщений: 188
Записей в блоге: 1
19.09.2017, 19:25
Цитата Сообщение от marymap Посмотреть сообщение
сделать список двусвязным 5 минут, просто как саму функцию сделать, как алгоритм сделать, я не представляю пока
Я правильно понимаю, что создать список с использованием указателей для Вас трудностей не составляет? В таком случае, воспользуйтесь алгоритмом, который Babysitter Вам предложил. Провести аналогии с методами класса list думаю тоже не сложно.
Или требуется помощь в создании функций работы со списком на указателях?
0
2 / 2 / 1
Регистрация: 28.11.2016
Сообщений: 85
19.09.2017, 23:00  [ТС]
Старый воин, я и половины не понимаю,что там написано.методы и классы еще не изучала, вот поэтому сложно разобраться

Добавлено через 1 час 20 минут
Старый воин, помогите,пожалуйста! завтра лабу сдавать, а я все сижу туплю
0
 Аватар для Старый воин
93 / 92 / 21
Регистрация: 16.08.2017
Сообщений: 188
Записей в блоге: 1
20.09.2017, 05:00
Лучший ответ Сообщение было отмечено marymap как решение

Решение

Утром на форум загляните. Попробую помочь.

Добавлено через 4 часа 43 минуты
Вот, как-то так

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include "stdafx.h"
#include <iostream>
using namespace std;
struct Node {
    int data;
    Node *next;
};
//Функция возвращает указатель на следующий элемент списка
//В качестве параметров принимает указатель на первый элемент
//и указатель на текущий элемент
Node *INSERT(Node *heder,Node *current){
  //если текущий элемент равен первому, то вставлять
  //ничего не надо и сразу переходим к следующему элементу
  if(current==heder)
  {
    return current->next;
  }
  //здесь уже нужно вставлять элементы
  else
  {
    Node *p=heder;//указатель на первый элемент
    Node *prev=current;//вставляем после этого элемента
    Node *pp;//здесь храним указатель на элемент, перед
        //которым вставляем (т.е. следующий после текущего)
    //пока не переберем все элементы списка до текущего
    while(p!=current)
    {
      pp=prev->next;//сохраняем указатель на элемент, перед которым нужно вставить
      prev->next=new Node;//создаем новый элемент
      prev=prev->next;//теперь работаем с ним
      prev->data=p->data;//запись данных
      prev->next=pp;//запись указателя на следующий элемент
      p=p->next;//переходим к следующему элементу
    }
    return prev->next;//возвращаем указатель на следующий элемент списка,
              //который нужно прочитать
  }
}
 
int main()
{
    int n;
    cin >> n;
    Node *head,*last;
    head = new Node;
    last = head;
    int k = 1;
    while (n > 0) {
        last->next = new Node;
        last = last->next;
        last->data = k;
        last->next = NULL;
        k++;
        n--;
    }
    for (Node *current = head; current != last;) {
        current = current->next;
        cout << current->data << endl;
    }
    for (Node *uk = head; uk != NULL;) {
    uk=INSERT(head,uk);
    }
    for (Node *uk = head; uk != NULL;) {
    cout << uk->data << " ";
    uk=uk->next;
    }
    cout << endl;
    system ("pause");
    return 0;
}
У Вас там не совсем правильно список заполняется... Первый элемент всегда нулю равен.
0
2 / 2 / 1
Регистрация: 28.11.2016
Сообщений: 85
20.09.2017, 13:03  [ТС]
Старый воин, я вас обожаю!!! спасибо, все понятно объяснили! СПАСИБО.

Добавлено через 1 час 5 минут
Старый воин, только у меня выводит неправильно в конце, какое то число -842150451. как это исправить?
0
 Аватар для Старый воин
93 / 92 / 21
Регистрация: 16.08.2017
Сообщений: 188
Записей в блоге: 1
20.09.2017, 17:35
Лучший ответ Сообщение было отмечено marymap как решение

Решение

Здравствуйте!
Это так ноль выводится. Я предупредил, что заполнение списка не совсем правильно происходит. Я использую Linux, поэтому у меня вместо этих цифр ноль выводится. Сейчас все поправил и протестировал в Visual Studio 2015. Все должно быть хорошо. В коде лишние комментарии убрал и прокомментировал только то, что устраняет эту ошибку. Внимательно сравните со старым вариантом.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include "stdafx.h"
#include <iostream>
using namespace std;
struct Node {
    int data;
    Node *next;
};
Node *INSERT(Node *heder, Node *current) {
    if (current == heder)
    {
        return current->next;
    }
    else
    {
        Node *p = heder;
        Node *prev = current;
        Node *pp;
        while (p != current)
        {
            pp = prev->next;
            prev->next = new Node;
            prev = prev->next;
            prev->data = p->data;
            prev->next = pp;
            p = p->next;
        }
        return prev->next;
    }
}
 
int main()
{
    int n;
    cin >> n;
    Node *head, *last;
    head = new Node;
    //вот здесь мы создали первый элемент списка
    //и должны заполнить поле data
    head->data = 1;
    last = head;//говорим, что первый элемент является и последним
    //он сейчас единственный
    int k = 2;//так как первый элемент списка уже =1, то следующий =2
    //в цикле создаем и заполняем элементы списка
    while (n > 0) {
        last->next = new Node;
        last = last->next;
        last->data = k;
        last->next = NULL;
        k++;
        n--;
    }
    for (Node *current = head; current != last;) {
        //здесь сначала выводим элемент, а затем переходим
        //к следующему. Иначе вывод начнется со второго элемента
        cout << current->data << endl;
        current = current->next;
    }
    for (Node *uk = head; uk != NULL;) {
        uk = INSERT(head, uk);
    }
    for (Node *uk = head; uk != NULL;) {
        cout << uk->data << " ";
        uk = uk->next;
    }
    cout << endl;
    system ("pause");
    return 0;
}
Удачи!

Добавлено через 15 секунд
Здравствуйте!
Это так ноль выводится. Я предупредил, что заполнение списка не совсем правильно происходит. Я использую Linux, поэтому у меня вместо этих цифр ноль выводится. Сейчас все поправил и протестировал в Visual Studio 2015. Все должно быть хорошо. В коде лишние комментарии убрал и прокомментировал только то, что устраняет эту ошибку. Внимательно сравните со старым вариантом.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include "stdafx.h"
#include <iostream>
using namespace std;
struct Node {
    int data;
    Node *next;
};
Node *INSERT(Node *heder, Node *current) {
    if (current == heder)
    {
        return current->next;
    }
    else
    {
        Node *p = heder;
        Node *prev = current;
        Node *pp;
        while (p != current)
        {
            pp = prev->next;
            prev->next = new Node;
            prev = prev->next;
            prev->data = p->data;
            prev->next = pp;
            p = p->next;
        }
        return prev->next;
    }
}
 
int main()
{
    int n;
    cin >> n;
    Node *head, *last;
    head = new Node;
    //вот здесь мы создали первый элемент списка
    //и должны заполнить поле data
    head->data = 1;
    last = head;//говорим, что первый элемент является и последним
    //он сейчас единственный
    int k = 2;//так как первый элемент списка уже =1, то следующий =2
    //в цикле создаем и заполняем элементы списка
    while (n > 0) {
        last->next = new Node;
        last = last->next;
        last->data = k;
        last->next = NULL;
        k++;
        n--;
    }
    for (Node *current = head; current != last;) {
        //здесь сначала выводим элемент, а затем переходим
        //к следующему. Иначе вывод начнется со второго элемента
        cout << current->data << endl;
        current = current->next;
    }
    for (Node *uk = head; uk != NULL;) {
        uk = INSERT(head, uk);
    }
    for (Node *uk = head; uk != NULL;) {
        cout << uk->data << " ";
        uk = uk->next;
    }
    cout << endl;
    system ("pause");
    return 0;
}
Удачи!

Добавлено через 3 минуты
Вот же... мышка клик задублировала
1
2 / 2 / 1
Регистрация: 28.11.2016
Сообщений: 85
27.09.2017, 12:00  [ТС]
Старый воин, спасибо большое!! только там нужно будет создавать элементы не пока n>0, а пока n-1>0 (44 строка). потому что если до n идти, создастся на 1 элемент больше) СПАСИБО ВАМ ОГРОМНОЕ!!!
1
 Аватар для Старый воин
93 / 92 / 21
Регистрация: 16.08.2017
Сообщений: 188
Записей в блоге: 1
27.09.2017, 21:49
Да, верно!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.09.2017, 21:49
Помогаю со студенческими работами здесь

Добавить символ звездочки после каждого неотрицательного элемента списка
Не получается написать функцию, которая принимает на вход список, и преобразует его следующим образом: после каждого неотрицательного...

После каждого элемента списка, стоящего на четной позиции добавить элемент =-1
Не могу нормально написать программу.:wall: Вообщем, после каждого элемента спика, стоящего на четной позиции добавить элемент =-1.

Вставить после каждого нечетного элемента первого списка наибольший элемент второго списка
Сформировать два списка из N целочисленных случайных элементов (N – вводится пользователем, значения элементов выбирать из диапазона ...

Удалить из каждого списка два элемента после каждого элемента с нечетным значением и подсчитать количество удаленных
Вот честно не пойму как это сделать буду очень благодарен если кто-то поможет

Добавить в конец каждого элемента списка восклицательный знак
При нажатии на кнопку в конец каждого элемента списка добавляется восклицательный знак. Ну как это сделать?:(


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru