2 / 2 / 1
Регистрация: 18.04.2017
Сообщений: 48
1

Односвязный список: после каждого отрицательного элемента добавить новый элемент, равный 0

07.01.2019, 12:42. Показов 5950. Ответов 4

Author24 — интернет-сервис помощи студентам
Односвязный массив. Нужно после каждого отрицательного элемента добавить после него новый элемент равный 0.
Создал функцию "add point" для добавления элементов, но как бы не пытался, все время крашится, не знаю как реализовать. Буду благодарен за помощь
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <iostream>
#include <ctime>
 
using namespace std;
 
struct point
{
    double data; //информационное поле
    point* next; //адресное поле
};
//создание однонаправленного списка
//добавление в конец
point* make_list(int n)
{
    point*beg;//указатель на первый элемент
    point*p, *r;//вспомогательные указатели
    beg = new(point);//выделяем память под первый элемент
    cout << "\nЗначение: ";
    cin >> beg->data;//вводим значение информационного поля
    beg->next = 0;//обнуляем адресное поле
    //ставим на этот элемент указатель p (последний элемент)
    p = beg;
    for (int i = 0; i < n - 1; i++)
    {
        r = new(point);//создаем новый элемент
        cout << "\nЗначение: ";
        cin >> r->data;
        r->next = 0;
        p->next = r;//связываем p и r
        //ставим на r указатель p (последний элемент)
        p = r;
    }
    return beg;//возвращаем beg как результат функции
}
 
void print_list(point* beg)
//печать списка
{
    point* p = beg;//начало списка
    while (p != 0)
    {
        cout << p->data << "\t";
        p = p->next;//переход к следующему элементу
    }
}
 
point* add_point(point* beg, int n)
{
    //функция для добавления элементов
}
 
int main()
{
    setlocale(LC_ALL, "russian");
    srand(time(NULL));
    int n = 0, k = 0;
    point *beg = nullptr;
    do
    {
        cout << "1. Создать однонаправленный массив\n";
        cout << "2. Показать однонаправленный массив\n";
        cout << "3. 0 после каждого отрицательного\n";
        cout << "4. Выход\n";
        cin >> k;
        switch (k)
        {
        case 1:
            cout << "Введите количество элементов" << endl;
            cin >> n;
            beg = make_list(n);
            cout << endl;
            break;
        case 2:
            print_list(beg);
            cout << endl;
            break;
        case 3:
            beg = add_point(beg, n);
            cout << "Готово" << endl;
        }
    } while (k != 4);
    system("pause");
    return 0;
};
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.01.2019, 12:42
Ответы с готовыми решениями:

Добавить элемент c значением 10 в одномерный массив после каждого отрицательного элемента
Знаю, что подобных вопросов уже было много, однако там то используются указатели, то вектора. Мне...

В массиве после каждого отрицательного элемента, вставить элемент, равный модулю отрицательного элемента
Нужен код С#

В массиве после каждого отрицательного элемента вставить элемент, равный его модулю
Не знаю как решить задачу. В массиве после каждого негативного элемента, вставить элемент, равный...

Добавить после каждого отрицательного элемента массива вычисляемый элемент
добавить после каждого отрицательного элемента массива элемент со значением m+1

4
447 / 333 / 172
Регистрация: 01.07.2015
Сообщений: 1,162
07.01.2019, 13:27 2
тык

insert_after или insert_after_pos соответственно
0
2 / 2 / 1
Регистрация: 18.04.2017
Сообщений: 48
07.01.2019, 17:36  [ТС] 3
Ничего не понимаю
Допустим, я посчитаю сколько у меня в списке есть отрицательных и сложу с изначальным количеством (например 5+3), т.к. после каждого отрицательного допишется 0. Мне нужно еще написать условие проверки если данное информационное поле содержит отрицательное значение, то мы запоминаем адрес дальнейшего и заменяем его на 0 (делаем обход и потом указывает уже на существующий адрес другого). Пытался разобраться в том коде, особо не помогло :c
0
447 / 333 / 172
Регистрация: 01.07.2015
Сообщений: 1,162
07.01.2019, 17:49 4
Лучший ответ Сообщение было отмечено Edudin97 как решение

Решение

Вот все решение:

C++
1
2
3
4
5
6
7
8
9
  while (temp) {
    if (temp->inf < 0) {
      insert_after(head, temp, 0);
 
      temp = temp->next;
    }
 
    temp = temp->next;
  }
Полный код:


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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include <iostream>
#include <random>
#include <vector>
#include <iterator>
 
using namespace std;
 
struct List {
  int inf;
  List* next;
};
 
void push_back(List*& head, int what);
void insert_after(List*& head, List*& after, int what);
void print(List*& head);
void clear(List*& head);
 
void push_back(List*& head, int what) {
  if (head == nullptr) {
    List* new_node = new List();
 
    new_node->inf = what;
    new_node->next = nullptr;
 
    head = new_node;
  } else {
    List *tmp = head;
 
    while (tmp->next)
      tmp = tmp->next;
 
    List* new_node = new List();
 
    new_node->inf = what;
    new_node->next = nullptr;
 
    tmp->next = new_node;
  }
}
 
void insert_after(List*& head, List*& after, int what) {
  List* new_node = new List();
 
  new_node->inf = what;
  new_node->next = after->next;
 
  after->next = new_node;
}
 
void print(List*& head) {
  List* tmp = head;
 
  while (head) {
    cout << head->inf << ' ';
 
    head = head->next;
  }
 
  cout << '\n';
 
  head = tmp;
}
 
void clear(List*& head) {
  List* tmp;
 
  while (head) {
    tmp = head;
 
    head = head->next;
 
    delete tmp;
  }
}
 
int main() {
  int n = 10;
 
  mt19937 rng;
  rng.seed(random_device()());
  uniform_int_distribution<int> dist(-10, 10);
 
  vector<int> data(n);
  for (int i = 0; i < n; ++i)
    data[i] = dist(rng);
 
  List* head = nullptr;
 
  for (const auto& i : data)
    push_back(head, i);
 
  List* temp = head;
 
  while (temp) {
    if (temp->inf < 0) {
      insert_after(head, temp, 0);
 
      temp = temp->next;
    }
 
    temp = temp->next;
  }
 
  print(head);
 
  clear(head);
}
1
2 / 2 / 1
Регистрация: 18.04.2017
Сообщений: 48
07.01.2019, 18:28  [ТС] 5
Спасибо. Взял кусочек решения и переписал под свою программу
0
07.01.2019, 18:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.01.2019, 18:28
Помогаю со студенческими работами здесь

Вставить в список L новый элемент F после каждого элемента E
Составить программу, которая вставляет в список L новый элемент F за каждым вхождением элемента E.

Вставить элемент, равный номеру вашего компьютера, после первого отрицательного элемента
Заполнить массив из 10 элементов случайными числами в интервале . Вывести массив на экран. Вставить...

Создать список из целых чисел. После каждого элемента, равного "х" вставить элемент, равный "у"
Задача со стеком. Создать список из целых чисел. После каждого элемента,равного х вставить...

Добавить после каждого отрицательного элемента его модуль
С помощью векторов.

Массив: Добавить после каждого отрицательного элемента его модуль...
1. Сформировать динамический одномерный массив, заполнить его случайными числами и вывести на...

Вставить элемент 100 до и после каждого отрицательного элемента
Вставить элемент 100 до и после каждого отрицательного элемента. Прошу, свое решение не писать,...


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

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

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