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

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

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

Author24 — интернет-сервис помощи студентам
Пусть дан список. После каждого элемента добавьте предшествующую ему часть списка. Не совсем понимаю,как это сделать. Единственное,что я смогла сделать,это создать список и вывести его))
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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.09.2017, 22:34
Ответы с готовыми решениями:

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

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

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

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

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

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 5
AlexVRud, Да, тоже как вариант
0
245 / 139 / 53
Регистрация: 23.11.2015
Сообщений: 394
19.09.2017, 00:55 6
Цитата Сообщение от 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  [ТС] 7
нужно именно указателями, класс создавать нельзя

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

Добавлено через 1 час 20 минут
Старый воин, помогите,пожалуйста! завтра лабу сдавать, а я все сижу туплю
0
93 / 92 / 21
Регистрация: 16.08.2017
Сообщений: 188
Записей в блоге: 1
20.09.2017, 05:00 13
Лучший ответ Сообщение было отмечено 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  [ТС] 14
Старый воин, я вас обожаю!!! спасибо, все понятно объяснили! СПАСИБО.

Добавлено через 1 час 5 минут
Старый воин, только у меня выводит неправильно в конце, какое то число -842150451. как это исправить?
0
93 / 92 / 21
Регистрация: 16.08.2017
Сообщений: 188
Записей в блоге: 1
20.09.2017, 17:35 15
Лучший ответ Сообщение было отмечено 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  [ТС] 16
Старый воин, спасибо большое!! только там нужно будет создавать элементы не пока n>0, а пока n-1>0 (44 строка). потому что если до n идти, создастся на 1 элемент больше) СПАСИБО ВАМ ОГРОМНОЕ!!!
1
93 / 92 / 21
Регистрация: 16.08.2017
Сообщений: 188
Записей в блоге: 1
27.09.2017, 21:49 17
Да, верно!
0
27.09.2017, 21:49
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.09.2017, 21:49
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru