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

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

07.09.2019, 17:11. Показов 2334. Ответов 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.09.2019, 17:11
Ответы с готовыми решениями:

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

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

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

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

11
522 / 757 / 133
Регистрация: 10.08.2015
Сообщений: 3,603
07.09.2019, 17:26 2
а каким ухом 55 к действительным относится?
0
-14 / 4 / 4
Регистрация: 19.01.2017
Сообщений: 560
07.09.2019, 19:15  [ТС] 3
vlisp, сам в недоумении, возможно ошибка в задании, вещественное число значит.

Добавлено через 1 час 42 минуты
vlisp, up!
0
522 / 757 / 133
Регистрация: 10.08.2015
Сообщений: 3,603
07.09.2019, 19:26 4
Цитата Сообщение от Like_society Посмотреть сообщение
линейный однонаправленный
Цитата Сообщение от Like_society Посмотреть сообщение
void AddEnd();//добавление в конец
* * void AddEnd(int x);
Цитата Сообщение от Like_society Посмотреть сообщение
в недоумении
вопрос в том, где ошибка
0
-14 / 4 / 4
Регистрация: 19.01.2017
Сообщений: 560
07.09.2019, 20:13  [ТС] 5
vlisp, ошибок здесь нет, какой лучше вариант, и что мне добавить?
0
522 / 757 / 133
Регистрация: 10.08.2015
Сообщений: 3,603
07.09.2019, 22:27 6
Цитата Сообщение от Like_society Посмотреть сообщение
ошибок здесь нет
берешь книжки и читаешь, иначе бесполезно что-то тебе объяснять
0
6500 / 4422 / 2531
Регистрация: 18.12.2017
Сообщений: 13,827
08.09.2019, 00:22 7
Цитата Сообщение от vlisp Посмотреть сообщение
55 к действительным относится?
действительные числа - это рациональные и иррациональные числа. рациональные - это целые и дробные числа. следовательно относится (как и любое другое целое)
0
522 / 757 / 133
Регистрация: 10.08.2015
Сообщений: 3,603
08.09.2019, 09:59 8
Цитата Сообщение от Yetty Посмотреть сообщение
действительные числа - это рациональные и иррациональные числа.
все так. но мы тут немного в другой лодке. Просто сравнить целые и рациональные дроби по определению. Иррациональные не сравниваются вообще никак. Но к счастью или к сожалению в информатике иррациональные числа не используются. А используются числа с плавающей точкой. В паскале такой тип называется Real, что переводится как действительное. в С++ этот тип называется float, что правильно. Но проблема со сравнением таки есть. Итак, целые и числа с плавающей точкой - разные сущности и могут возникнуть проблемы при их сравнении. Особенно, если контейнер построен для интов, а добавляются числа двойной точности. это чисто математические проблемы.
Вторая часть проблем - концептуальные.
Во-первых, ТС не понимает, что он делает. от чего у него ничего не получилось. Что такое однонаправленный список он не знает и пишет чушь. Более того, скорей всего слямзил кот, да не тот...
Во-вторых, ТС преисполнен глупыми заблуждениям, от чего это еще и смешно выглядит. Например, метод принт. Казалось бы, что тут такого. А вот ничего хорошего. Просто это калька для школьников-консольщиков. Правильный метод - to_string. ничего никуда не выводит, зато дает вывести там, где требуется. привязывать себя к консоли да и вообще к чему либо - мазохизму подобно.
0
-14 / 4 / 4
Регистрация: 19.01.2017
Сообщений: 560
08.09.2019, 19:02  [ТС] 9
vlisp, ладно плевать на те задание, что исправить? Как вы видите эту программу ? Можете написать пожалуйста.
0
522 / 757 / 133
Регистрация: 10.08.2015
Сообщений: 3,603
08.09.2019, 19:34 10
Цитата Сообщение от Like_society Посмотреть сообщение
Как вы видите эту программу ?
Код
функция удаления:
   если список пуст, 
         возвращаем nil,
   иначе, если список равен 55,
        возвращаем список без первого элемента.
   иначе возвращаем список, где к хвосту рекурсивно применена функция удаления
0
-14 / 4 / 4
Регистрация: 19.01.2017
Сообщений: 560
08.09.2019, 19:36  [ТС] 11
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
522 / 757 / 133
Регистрация: 10.08.2015
Сообщений: 3,603
08.09.2019, 19:49 12
для начала ответь на вопросы
Цитата Сообщение от 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.09.2019, 19:49

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

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.