Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
0 / 0 / 0
Регистрация: 18.02.2018
Сообщений: 73

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

27.01.2019, 14:56. Показов 3606. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Может кто-нибудь помочь с решением задачи, пожалуйста. Нужно разбить двунаправленный связной список на два по указанному значению информационного поля элемента для разбиения. Буду благодарен!
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.01.2019, 14:56
Ответы с готовыми решениями:

Добавление нового элемента в список после указанного элемента по значению информационного поля
Добавление нового элемента в список после указанного элемента по значению информационного поля.

Сформировать двунаправленный список, тип информационного поля char*
Всем привет, кто сможет помочь с заданием? 1. Сформировать двунаправленный список, тип информационного поля char*. 2. Распечатать...

Сформировать двунаправленный список, тип информационного поля int
Нужна небольшая помощь, нужно удалить из списка все элементы с четными номерами, а у меня удаляется лишь первый четный элемент. Удаляя...

5
9 / 6 / 3
Регистрация: 01.07.2018
Сообщений: 49
27.01.2019, 22:06
Если Вам нужно, чтобы список разбивался без учета информационного поля, то вот:

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
#include <iostream>
#include <list>
using namespace std;
 
int main()
{
    int sizeLst, val;
    cin >> sizeLst; // размер списка
    
    list <int>myLst, part1, part2;
    for(int i = 0; i < sizeLst; i++)
    {
        cin >> val;
        myLst.push_back(val);
    }
    
    // выводим весь список
    cout << "List: ";
    for(int q : myLst)
        cout << q << " ";
    cout << endl;
    
    int splitVal;
    cin >> splitVal;
    
    bool isLst = false;
 
    auto it = myLst.begin();
    while(it != myLst.end())
    {
        if(*it == splitVal)
        {
            it++;
            isLst = true;
            break;
        }
        part1.push_back(*it);
        it++;
    }
    
    if(!isLst)
        cout << "Item " << splitVal << " isn't list\n";
    else
    {
        // выводим первую часть списка
        cout << "List 1: ";
        for(auto q = part1.begin(); q != part1.end(); q++)
            cout << *q << " ";
        cout << endl;
        
        while(it != myLst.end())
        {
            part2.push_back(*it);
            it++;
        }
        
        // выводим вторую часть
        cout << "List 2: ";
        for(int q : part2)
            cout << q << " ";
        cout << endl;
    }
    return 0;
}
Пример:
10
213 43 -11 3349 0 1994 12 -1000 1445 55
List: 213 43 -11 3349 0 1994 12 -1000 1445 55
12
List 1: 213 43 -11 3349 0 1994
List 2: -1000 1445 55

Добавлено через 6 минут
Если список следует разбить начиная с инф. поля, то замените код в строках 29-39 на

C++
1
2
3
4
5
while(it != myLst.end() && *it != splitVal)
{
    part1.push_back(*it);
    it++;
}
Добавлено через 6 минут
Компилировать с опцией -std=c++11
1
611 / 416 / 151
Регистрация: 11.01.2019
Сообщений: 1,746
28.01.2019, 10:11
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
#include <list>
#include <random>
#include <type_traits>
#include <iostream>
 
/* заполнение произвольного одномерного контейнера с элементами произвольного типа произвольно распределенными случайными числами */
template <class ForwardIterator, class Distribution>
void random_array_fill(ForwardIterator begin, ForwardIterator end, Distribution&& dist) {
    std::random_device rd;
    std::mt19937 gen(rd());
    for (; begin != end; ++begin) *begin = dist(gen);
}
 
/* вывод содержимого диапазона в произвольный поток с произвольным разделителем */
template <class ForwardIterator, class Stream = std::ostream, class char_t = char>
void output_range(ForwardIterator begin, ForwardIterator end, Stream & stream = std::cout, const char_t * delimiter = " ", bool trailing_newline = true) {
    --end;
    while (begin != end) stream << *begin++ << delimiter;
    stream << *end;
    if (trailing_newline) stream << std::endl;
}
 
/* разбиение списка с элементами произвольного типа по заданному значению value */
template <class T>
std::pair<std::list<T>, std::list<T>> split_list(const std::list<T>& source_list, T value) {
    std::list<T> left_list, right_list;
    std::for_each(source_list.begin(), source_list.end(), [&left_list, &right_list, value](T node) {
        if (node < value) left_list.push_back(node);
        else 
            if (node > value) right_list.push_back(node);
    });
    return std::make_pair(left_list, right_list);
}
 
int main()
{
    /* создаем и заполняем двусвязный список */
    std::list<double> l(10, 0);
    random_array_fill(std::begin(l), std::end(l), std::normal_distribution<double>(10.0, 1.5));
    /* выводим исходный список */
    std::cout << "Source list: ";
    output_range(std::begin(l), std::end(l));
 
    /* разбиваем список относительно заданного значения, например, 10.0, но несложно организовать ввод с клавиатуры */
    auto lists = split_list(l, 10.0);
    /* выводим полученные 2 подсписка */
    std::cout << "Sublist 1: ";
    output_range(std::begin(lists.first), std::end(lists.first));
    std::cout << "Sublist 2: ";
    output_range(std::begin(lists.second), std::end(lists.second));
 
    return 0;
}
1
0 / 0 / 0
Регистрация: 18.02.2018
Сообщений: 73
30.01.2019, 19:07  [ТС]
jugu, спасибо за помощь! Но я хотел задать пару вопросов.
При компиляции с заменой в 29-39 строках не выходит разделить список, видимо я ввожу не верное значение для переменной splitVal, хотелось бы узнать, как будет правильно?
C++
1
2
3
4
5
while(it != myLst.end() && *it != splitVal)
{
    part1.push_back(*it);
    it++;
}
И куда мне впихнуть эту опцию?
-std=c++11
Миниатюры
Разбить двунаправленный связной список на два по указанному значению информационного поля элемента  
0
9 / 6 / 3
Регистрация: 01.07.2018
Сообщений: 49
30.01.2019, 20:13
Лучший ответ Сообщение было отмечено Dmitriy1o1 как решение

Решение

Это я ошибся в этом кусочке кода, попробуйте вот так
C++
1
2
3
4
5
while(*it != splitVal && it != myLst.end())
{
    part1.push_back(*it);
    it++;
}
Добавлено через 10 минут
Если у вас относительно новая среда разработки VS2016-17 то работать должен и без нее. -std=c++11 это указание компилятору использовать стандарт C++11 года

Добавлено через 39 минут
Вот код, который разделяет начиная с элемента splitVal включительно
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
#include <iostream>
#include <list>
using namespace std;
int main()
{
    int sizeLst, val;
    cin >> sizeLst;
    list <int>myLst, part1, part2;
    for(int i = 0; i < sizeLst; i++)
    {
        cin >> val;
        myLst.push_back(val);
    }
    cout << "List: ";
    for(int q : myLst)
        cout << q << " ";
    cout << endl;
    int splitVal;
    cin >> splitVal;
    bool isLst = false;
    auto it = myLst.begin();
    while(it != myLst.end())
    {
        if(*it == splitVal)
        {
            isLst = true;
            break;
        }
        part1.push_back(*it);
        it++;
    }
    if(!isLst)
        cout << "Item " << splitVal << " isn't list\n";
    else
    {
        cout << "List 1: ";
        for(auto q = part1.begin(); q != part1.end(); q++)
            cout << *q << " ";
        cout << endl;
        while(it != myLst.end())
        {
            part2.push_back(*it);
            it++;
        }
        cout << "List 2: ";
        for(int q : part2)
            cout << q << " ";
        cout << endl;
     }
    return 0;
}
Добавлено через 2 минуты
Разница лишь в том, что в первой версии кода в 33 строке мы "перепрыгиваем" элемент splitVal, в этом коде элемент splitVal учитывается
1
0 / 0 / 0
Регистрация: 18.02.2018
Сообщений: 73
30.01.2019, 21:17  [ТС]
Ещё раз спасибо, что потратили свое время, вроде разобрался!)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.01.2019, 21:17
Помогаю со студенческими работами здесь

Нужно создать двунаправленный список. Тип информационного поля char
Нужно добавить в список элементы с номерами 1,3,5... ______________ Даже не могу представить создание списка char..помогите ,пожалуйста

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

Двунаправленный связной список
Народ! Плиз хелп ми! Дела такие: нужно сделать двунаправленный связной список, в котором есть такие функции: -ListOut (выводит...

Разбить массив на несколько по значению элемента
Есть массив вида: , , , , , , , ]

Как связать между собой два поля (список значений одного поля зависит от значения другого поля)
Есть таблица: предмет, КодТипаМатериала (список), КодМатериала (список) для примера: стул, ткань, чёрное сукно ...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru