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

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

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

Может кто-нибудь помочь с решением задачи, пожалуйста. Нужно разбить двунаправленный связной список на два по указанному значению информационного поля элемента для разбиения. Буду благодарен!
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.01.2019, 14:56
Ответы с готовыми решениями:

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

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

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

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

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

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
609 / 414 / 151
Регистрация: 11.01.2019
Сообщений: 1,745
28.01.2019, 10:11 3
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  [ТС] 4
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 5
Лучший ответ Сообщение было отмечено 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  [ТС] 6
Ещё раз спасибо, что потратили свое время, вроде разобрался!)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.01.2019, 21:17

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru