Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
-12 / 6 / 4
Регистрация: 19.01.2017
Сообщений: 584

Удалить из списка элемент перед первым элементом со значением 55

07.09.2019, 17:11. Показов 4245. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
1. Создать линейный однонаправленный список из действительных чисел. Удалить из списка элемент перед первым элементом со значением 55.

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
#include <iostream>
#include <cmath>
 
    using namespace std;
 
struct node {
    double data;
    node* next;
};
 
node* head = NULL;
 
void add(double data) {
    node* temp = new node;
    temp->data = data;
    temp->next = NULL;
    if (head == NULL) {
        head = temp;
    } else {
        node* tnew = head;
        while (tnew->next != NULL) {
            tnew = tnew->next;
        }
        tnew->next = temp;
    }
}
 
void del(int index) {
    node* temp = head;
    if (index == 1) {
        head = head->next;
        delete temp;
    } else {
        node* del;
        int count = 1;
        while (head != NULL && count < index - 1) {
            temp = temp->next;
            count++;
        }
        del = temp->next;
        temp->next = del->next;
        delete del;
    }
}
 
void delByIndex() {
    node* temp = head;
    int k = 0;
    while (temp != NULL) {
        k++;
        if (fabs(temp->data - 55) < 0.00000001) {
            if (k > 1) {
                del(k-1);
                k--;
            }
        }
        temp = temp->next;
    }
}
 
void print() {
    node* temp = head;
    while (temp != NULL) {
        cout << temp->data << " ";
        temp = temp->next;
    }
}
 
int main() {
    int n;
    double val;
    cout << "Enter a number of elements:\n";
    cout << "n = ";
    cin >> n;
    cout << "Enter some elements:\n";
    for (int i = 1; i <= n; i++) {
        cin >> val;
        add(val);
    }
    delByIndex();
    cout << "Output of the program:\n";
    print();
    system("pause");
    return 0;
}

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
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
#include <iostream>
#include <cmath>
#include <math>
 
using namespace std;
 
class DLlist {
 
private:
 
    struct list//список
    {
        int value;
        list* prev = NULL;//предыдущий элемент списка
        list* next = NULL;//следующий
    } root;
 
    void Delete(list*X);//удаляет список (не файл!)
 
public:
    short listSize = 0;//счетчик количества элементов динамического списка в объекте (размер)
    list* listBegin = &root;//указатель на начало списка
    list* listEnd = &root;//указатель на конец
 
    ~DLlist()//деструктор
    {
        Delete(listBegin);
    }
    void AddEnd();//добавление в конец
    void AddEnd(int x);
    void AddBegin();//добавление в начало
    void AddBegin(int x);
    void Show();//вывести на экран
    void Show(list* X);
    void Duplicate();//дублировать 1й положительный
    void Duplicate(list* X);
    void DeleteNegative();//удалить 1й отрицательный
    void DeleteNegative(list* X);
};
 
void DLlist::AddEnd() {//для ручного ввода
    int x;
    cin >> x;
    AddEnd(x);
}
 
void DLlist::AddEnd(int x) {
    if (!listSize) {//заполняем первый элемент списка
        listEnd->value = x;
        listSize++;
    }
    else {
        listEnd->next = new list;//создаем новый элемент
        listEnd->next->prev = listEnd;//передаем в него указатель на предыдущий
        listEnd = listEnd->next;//"переходим" в только что созданный элемент
        listEnd->value = x;//вдим его значение
        listSize++;
    }
}
 
void DLlist::AddBegin() {
    int x;
    cin >> x;
    AddBegin(x);
}
 
void DLlist::AddBegin(int x) {
    if (!listSize) {//заполняем первый элемент списка
        listBegin->value = x;
        listSize++;
    }
    else {
        listBegin->prev = new list;//создаем новый элемент
        listBegin->prev->next = listBegin;//передаем в него указатель на предыдущий
        listBegin = listBegin->prev;//"переходим" в только что созданный элемент
        listBegin->value = x;//выводим его значение
        listSize++;
    }
}
 
void DLlist::Show() {
    if (listSize) Show(listBegin);
};
 
void DLlist::Show(list* X) {
    cout << X->value << ' ';
    if (X->next) Show(X->next);
};
 
void DLlist::Duplicate() {
    if (listSize) Duplicate(listBegin);
};
 
void DLlist::Duplicate(list* X) {
    if (X->value > 0) {//нашли положительный элемент
        if (!X->next) {//если это последний в цепочке элемент
            AddEnd(X->value);
        }
        else {
            list *dup = new list;//создаем независимый элемент
            dup->prev = X;//помещаем в него ссылки согласно новому расположению (следующий от X)
            dup->next = X->next;
            dup->value = X->value;//копируем значение
            listSize++;
            dup->prev->next = dup;//"вставляем" элемент в список
            dup->next->prev = dup;//подменяя ссылки в соседних элементах
        }
    }
    else {
        if (X->next) Duplicate(X->next);//если не конец списка - продолжаем искать
    }
};
 
void DLlist::DeleteNegative() {
    if (listSize) DeleteNegative(listBegin);
}
 
void DLlist::DeleteNegative(list* X) {
    if (X->value < 0) {//ищем отрицательный элемент
        (X->prev) ? X->prev->next = X->next : listBegin = X->next;//если это первый элемент в списке
        (X->next) ? X->next->prev = X->prev : listEnd = X->prev;//если последний
        listSize--;
        delete X;//вот только теперь можно удалить
    }
    else
    {
        if (X->next) DeleteNegative(X->next);//если не конец списка - продолжаем искать
    }
}
 
void DLlist::Delete(list* X) {//функция для деструктора (высвобождаем память)
    if (X->next) Delete(X->next);
    delete X->next;
};
 
void main() {
    setlocale(0, "");
    DLlist mylist;
    while (true) {
        system("cls");
        cout << "Выберите действие\n";
        cout << "1. Добавить в начало\n";
        cout << "2. Добавить в конец\n";
        cout << "3. Показать все записи\n";
        cout << "4. Продублировать первое положительное\n";
        cout << "5. Удалить первое отрицательное\n";
        cout << "0. Выход\n";
        cout << "Ваш выбор: ";
        int vybor;
        cin >> vybor;
        system("cls");
        switch (vybor)
        {
        case 1:
            mylist.AddBegin();
            break;
        case 2:
            mylist.AddEnd();
            break;
        case 3:
            mylist.Show();
            break;
        case 4:
            mylist.Duplicate();
            break;
        case 5:
            mylist.DeleteNegative();
            break;
        case 0:
            exit(0);
            break;
        }
        system("pause");
    }
    system("pause");
}
Добавлено через 3 часа 3 минуты
Что исправить, что добавить?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.09.2019, 17:11
Ответы с готовыми решениями:

Удалить из списка элемент перед каждым элементом со значением 3
Удалить из списка элемент перед каждым элементом со значением 3. Добавлено через 8 часов 12 минут Создать циклический...

Удалить из однонаправленного списка элемент перед каждым элементом со значением 55 (не могу найти ошибку)
Создать линейный однонаправленный список из вещественных чисел. Удалить из списка элемент перед каждым элементом со значением 55. ...

Вставить в массив элемент перед первым элементом с максимальным значением и после первого элемента минимальным значением
Кто разбирается в С#? Можете написать код Вставить в массив элемент с заданным значением перед первым элементом с максимальным значением...

11
 Аватар для vlisp
1064 / 985 / 153
Регистрация: 10.08.2015
Сообщений: 5,368
07.09.2019, 17:26
а каким ухом 55 к действительным относится?
0
-12 / 6 / 4
Регистрация: 19.01.2017
Сообщений: 584
07.09.2019, 19:15  [ТС]
vlisp, сам в недоумении, возможно ошибка в задании, вещественное число значит.

Добавлено через 1 час 42 минуты
vlisp, up!
0
 Аватар для vlisp
1064 / 985 / 153
Регистрация: 10.08.2015
Сообщений: 5,368
07.09.2019, 19:26
Цитата Сообщение от Like_society Посмотреть сообщение
линейный однонаправленный
Цитата Сообщение от Like_society Посмотреть сообщение
void AddEnd();//добавление в конец
* * void AddEnd(int x);
Цитата Сообщение от Like_society Посмотреть сообщение
в недоумении
вопрос в том, где ошибка
0
-12 / 6 / 4
Регистрация: 19.01.2017
Сообщений: 584
07.09.2019, 20:13  [ТС]
vlisp, ошибок здесь нет, какой лучше вариант, и что мне добавить?
0
 Аватар для vlisp
1064 / 985 / 153
Регистрация: 10.08.2015
Сообщений: 5,368
07.09.2019, 22:27
Цитата Сообщение от Like_society Посмотреть сообщение
ошибок здесь нет
берешь книжки и читаешь, иначе бесполезно что-то тебе объяснять
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
08.09.2019, 00:22
Цитата Сообщение от vlisp Посмотреть сообщение
55 к действительным относится?
действительные числа - это рациональные и иррациональные числа. рациональные - это целые и дробные числа. следовательно относится (как и любое другое целое)
0
 Аватар для vlisp
1064 / 985 / 153
Регистрация: 10.08.2015
Сообщений: 5,368
08.09.2019, 09:59
Цитата Сообщение от Yetty Посмотреть сообщение
действительные числа - это рациональные и иррациональные числа.
все так. но мы тут немного в другой лодке. Просто сравнить целые и рациональные дроби по определению. Иррациональные не сравниваются вообще никак. Но к счастью или к сожалению в информатике иррациональные числа не используются. А используются числа с плавающей точкой. В паскале такой тип называется Real, что переводится как действительное. в С++ этот тип называется float, что правильно. Но проблема со сравнением таки есть. Итак, целые и числа с плавающей точкой - разные сущности и могут возникнуть проблемы при их сравнении. Особенно, если контейнер построен для интов, а добавляются числа двойной точности. это чисто математические проблемы.
Вторая часть проблем - концептуальные.
Во-первых, ТС не понимает, что он делает. от чего у него ничего не получилось. Что такое однонаправленный список он не знает и пишет чушь. Более того, скорей всего слямзил кот, да не тот...
Во-вторых, ТС преисполнен глупыми заблуждениям, от чего это еще и смешно выглядит. Например, метод принт. Казалось бы, что тут такого. А вот ничего хорошего. Просто это калька для школьников-консольщиков. Правильный метод - to_string. ничего никуда не выводит, зато дает вывести там, где требуется. привязывать себя к консоли да и вообще к чему либо - мазохизму подобно.
0
-12 / 6 / 4
Регистрация: 19.01.2017
Сообщений: 584
08.09.2019, 19:02  [ТС]
vlisp, ладно плевать на те задание, что исправить? Как вы видите эту программу ? Можете написать пожалуйста.
0
 Аватар для vlisp
1064 / 985 / 153
Регистрация: 10.08.2015
Сообщений: 5,368
08.09.2019, 19:34
Цитата Сообщение от Like_society Посмотреть сообщение
Как вы видите эту программу ?
Code
1
2
3
4
5
6
функция удаления:
   если список пуст, 
         возвращаем nil,
   иначе, если список равен 55,
        возвращаем список без первого элемента.
   иначе возвращаем список, где к хвосту рекурсивно применена функция удаления
0
-12 / 6 / 4
Регистрация: 19.01.2017
Сообщений: 584
08.09.2019, 19:36  [ТС]
vlisp, Можете помочь исправить код к возможно моему заданию.
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
#include <iostream>
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include <iomanip>
#define kilkist 10
#define r 55
using namespace std;
 
struct v7{
    int a;
    v7 *next;
};
v7 *first,*pt;
 
void create(){
    if(first == NULL){
            first = new v7;
            pt = first;
            pt->a = rand()%r;
        for(int i=0;i<kilkist-1;i++){
           pt->next = new v7;
           pt = pt->next;
           pt->a = rand()%r;
        }
        pt->next = NULL;
       cout<<"\n\tSpusok yspishno stvoreno!\n";
    }
    else cout<<"\n\tSpusok vshe stvorenij!\n";
}
void print(){
    if(first!=NULL){
        pt = first;
        cout<<"\tElementu spusky(int)\n\t_____________________\n";
        while(pt!=NULL){
            cout<<"\t\t"<<pt->a<<endl;
            pt = pt->next;
        }
    }
    else cout<<"\n\tSpusok ne stvoreno!\n";
}
void del(){
    bool yes = false;
    if(first!=NULL){
        cout<<"Vvedit chislove znachennya, yake potribno vudalutu = "; int n; cin>>n;
        pt = first;
        while(pt!=NULL){
            if(pt->a == n){
                if(pt == first){
                   if(pt->next!=NULL) {first = pt->next;
                    delete pt;}
                    else first = NULL;
                }
                else if(pt->next == NULL){
                        v7 *buf = first;
                    while(buf != pt){
                        if(buf->next == pt) {buf->next = NULL; buf = pt;}
                        else  buf = buf->next;
                    }
                    delete pt;
                }
                else{
                    v7 *buf = first;
                    while(buf!=pt){
                            if(buf->next == pt){
                                buf->next = pt->next;
                                delete pt;
                                buf = pt;
                            }
                     else  buf = buf->next;
                    }
                }
                yes = true;
                break;
            }
          else pt = pt->next;
        }
        if(yes) cout<<"\n\tPershe znaidene znachennya vudaleno!\n";
        else cout<<"\n\tElement ne naideno!\n";
    }
    else cout<<"\n\tSpusok ne stvoreno!\n";
}
int main()
{
    srand(time(NULL));
    while(true){
            cout<<"___________________________________";
cout<<"\n1. Stvorutu spusok\n";
cout<<"2. Vuvestu spusok\n";
cout<<"3. Vudalutu element spusky\n";
cout<<"4. Ochisit consol\n";
cout<<"0. EXIT\n___________________________________\nVash vubir = ";
int key; cin>>key;cout<<"===================================\n";
    switch(key){
        case 0: exit(true); break;
        case 1: create(); break;
        case 2: print(); break;
        case 3: del(); break;
        case 4: system("cls"); break;
       // default: cout<<"___________________________________\n";
    }
}    cout<<endl;system("pause");}
0
 Аватар для vlisp
1064 / 985 / 153
Регистрация: 10.08.2015
Сообщений: 5,368
08.09.2019, 19:49
для начала ответь на вопросы
Цитата Сообщение от Like_society Посмотреть сообщение
void print()
что ты собрался печатать?
Цитата Сообщение от Like_society Посмотреть сообщение
void del()
что и откуда ты собрался удалять?
Цитата Сообщение от Like_society Посмотреть сообщение
void create(){
что ты собрался создавать?

подсказка: есть данные а есть функции которые их обрабатывают. данные нужно передать в функцию, чтобы она знала с чем работать. данные можно передать глобально и локально в виде аргументов. первый способ категорически не рекомендуется.
вот тебе сигнатуры, дальше сам
C++
1
2
3
v7* create_v7();
int delete_if_55 (v7* &w); // int , чтоб возвращать код ошибки, если что
void print (v7* &w);
если я ошибся, поправьте, все таки воскресенье... день тяжелый
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.09.2019, 19:49
Помогаю со студенческими работами здесь

Организовать такие рекурсивные методы: вставить элемент перед элементом со значением n; удалить элемент со значением n
Нужно организовать такие рекурсивные методы: вставить элемент перед элементом со значением n; удалить элемент со значением n; распечатать...

Вставить элемент с данным значением k после перед первым положительным элементом массива
Вставить элемент с данным значением k после перед первым положительным элементом массива

Вставить перед данным элементом списка новый элемент со значением D и вывести "указатель" на добавленный элемент списка
Дано число D и &quot;указатель&quot; PO на один из элементов непустого двусвязного списка. Вставить перед данным элементом списка новый элемент со...

Удалить первый положительный элемент массива; вставить новый элемент перед первым максимальным элементом
Дан целочисленный массив размера N. Как удалить первый положительный элемент ? Как вставить новый элемент перед первым максимальным...

Из массива удалить элемент, стоящий перед первым нулевым элементом
составить программу с модулем для обработки одномерного массива. Из массива удалить элемент, стоящий перед первым нулевым элементом, а...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru