Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
8 / 5 / 3
Регистрация: 17.02.2020
Сообщений: 38
1

Как сделать проверку на повторяющиеся значения в двусвязном кольцевом списке?

18.02.2020, 20:42. Показов 1562. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как можно сделать проверку на ввод одного и того же числа не используя STL в двусвязном кольцевом списке, помогите пожалуйста, идей вообще нет
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
177
178
179
180
181
182
183
184
185
186
#include "stdafx.h" 
#include <iostream.>
using namespace std;
 
 
struct Node
{
    int x;
    Node *Next;
    Node *Prev;
};
 
class List
{
    Node *Head;
    Node *Tail;
public:
    List() :Head(NULL), Tail(NULL) {};
    ~List();
    void Show();
    void Add(int x);
    void Quan();
    void Average();
    void MinBeforMin();
    void Max();
    void Fourth();
};
 
List::~List()
{
    if (Head)
    {
        Node* temp = Head;
        do
        {
            Tail = Head->Next;
            delete Head;
            Head = Tail;
        } while (Head != temp);
    }
}
 
void List::Add(int x)
{
    Node *temp = new Node;
    temp->x = x;
 
    if (!Head)
        Head = temp->Prev = temp->Next = temp;
    else
    {
        temp->Prev = Head->Prev;
        temp->Next = Head;
        Head->Prev->Next = temp;
        Head->Prev = temp;
    }
}
 
void List::Show()
{
    if (Head == NULL) cout << "\nСписок порожній\n\n";
    else
    {
        Node* temp = Head;
        do
        {
            cout << temp->x << " ";
            temp = temp->Next;
        } while (temp != Head);
        cout << "\n";
    }
}
 
void List::Quan()
{
    Node* temp = Head;
    int count = 0;
    do
    {
        count++;
        temp = temp->Next;
    } while (temp != Head);
    cout << count << "\n";
}
 
void List::Average()
{
    Node* temp = Head;
    double av = 0;
    int count = 0;
    do
    {
        av += temp->x;
        temp = temp->Next;
        count++;
    } while (temp != Head);
    cout << av / count << "\n";
 
}
void List::MinBeforMin()
{
    Node* temp = Head;
    int min = temp->x;
    do
    {
        if (temp->x < min)
            min = temp->x;
        temp = temp->Next;
    } while (temp != Head);
    cout << min << "\n";
 
    temp = Head;
    int befMin = 0;
    do
    {
        if (temp->x == min)
        {
            temp = temp->Prev;
            befMin = temp->x;
            break;
        }
        temp = temp->Next;
    } while (temp != Head);
    cout << "Елемент, що розташований перед найменшим:\n" << befMin << "\n";
 
}
 
void List::Max()
{
    Node* temp = Head;
    int max = temp->x;
    do
    {
        if (temp->x > max)
            max = temp->x;
        temp = temp->Next;
    } while (temp != Head);
    cout << max << "\n";
 
}
 
void List::Fourth()
{
    Node *temp = Head;
    int fourElt = 0, count = 0;
    do
    {
        count++;
        if (count == 4)
            fourElt = temp->x;
        temp = temp->Next;
    } while (temp != Head);
    if (count < 4)
        cout << "Структура не має четвертого елемента!\n";
    else
        cout << fourElt << "\n";
}
 
int main()
{
    setlocale(LC_ALL, "Ukr");
    system("CLS");
    List lst;
    int x, n;
    cout << "Скiльки елементiв ви бажаєте додати в список > ";
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cout << "Значення > ";
        cin >> x;
        lst.Add(x);
    }
    lst.Show();
    cout << "Кiлькiсть елементiв:" << endl;
    lst.Quan();
    cout << "Середне арифметичне елементiв:" << endl;
    lst.Average();
    cout << "Найменший елемент:" << endl;
    lst.MinBeforMin();
    cout << "Найбiльший елемент:" << endl;
    lst.Max();
    cout << "Четвертий елемент:" << endl;
    lst.Fourth();
    system("pause");
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.02.2020, 20:42
Ответы с готовыми решениями:

Как сделать проверку на отсутствие элементов в двусвязном кольцевом списке - C++
Необходимо сделать проверку на отсутствие элементов, т.е. если элементы отсутствуют вывести...

Удаление элемента в двусвязном кольцевом списке
Добрый вечер! Сразу к телу: список двусвязный кольцевой. С помощью поиска нахожу нужный мне...

Нахождение числа в двусвязном кольцевом списке
Hallo! Следовало бы в работе настроить поиск цифрки. void search(){ int b; int *n; char s;...

Как в двусвязном списке сделать перегрузку оператора присваивание
Добрый день. Мне нужно перегрузить оператор =, так чтобы один объект класса &quot;Двусвязный список&quot;...

10
поисковый робот
30 / 23 / 9
Регистрация: 04.02.2020
Сообщений: 96
18.02.2020, 21:14 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
void List::Add(int x)
{
    
 
    if (!Head)
    {
        Node* temp = new Node;
        temp->x = x;
        Head = temp->Prev = temp->Next = temp;
       
    }
    else
    {
        if (x == Head->x)
        {
            cout << "Элемент с таким значением уже есть в списке\n";
            return;
        }
           
        Node* temp = new Node;
        temp->x = x;
 
        temp->Prev = Head->Prev;
        temp->Next = Head;
        Head->Prev->Next = temp;
        Head->Prev = temp;
    }
}
0
693 / 303 / 99
Регистрация: 04.07.2014
Сообщений: 846
18.02.2020, 21:22 3
Если добавить требование к тому что уже есть в коде, то стоит держать список изначально отсортированным.
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
18.02.2020, 21:22 4
Цитата Сообщение от Vic_ks Посмотреть сообщение
Как можно сделать проверку на ввод одного и того же числа не используя STL в двусвязном кольцевом списке, помогите пожалуйста, идей вообще нет
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
bool List::Find(int x)
{
    if (!Head)
        return false;
 
    Node* p = Head;
    do
    {
        if (p->x == x)
            return true;
 
        p = p->Next;
    } while (p != Head);
    return false;
}
....................
if (!lst.Find(x))
    lst.Add(x);
1
поисковый робот
30 / 23 / 9
Регистрация: 04.02.2020
Сообщений: 96
18.02.2020, 21:30 5
фу блин . фигню написал .
Цитата Сообщение от AlexVRud Посмотреть сообщение
не проверяешь все значения буфера
AlexVRud, а на форуме это нельзя было написать ?
0
8 / 5 / 3
Регистрация: 17.02.2020
Сообщений: 38
18.02.2020, 21:35  [ТС] 6
Не работает((
Миниатюры
Как сделать проверку на повторяющиеся значения в двусвязном кольцевом списке?  
0
поисковый робот
30 / 23 / 9
Регистрация: 04.02.2020
Сообщений: 96
18.02.2020, 21:36 7
Vic_ks, смотри ответ oleg-m1973

а у меня там фигня написана.
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
18.02.2020, 21:42 8
Цитата Сообщение от Vic_ks Посмотреть сообщение
Не работает((
Покажи, как сделал
0
8 / 5 / 3
Регистрация: 17.02.2020
Сообщений: 38
18.02.2020, 21:52  [ТС] 9
А как сделать так, чтобы пользователю выводилось предупреждение о том, что было введено два одинаковых значения, и чтоб он мог ввести заново это значение?

Вот так было реализовано, работает, но хотелось бы сделать то, что указано выше))
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
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
#include "stdafx.h" 
#include <iostream.>
using namespace std;
 
 
struct Node
{
    int x;
    Node *Next;
    Node *Prev;
};
 
class List
{
    Node *Head;
    Node *Tail;
public:
    List() :Head(NULL), Tail(NULL) {};
    ~List();
    void Show();
    void Add(int x);
    void Quan();
    void Average();
    void MinBeforMin();
    void Max();
    void Fourth();
    bool Find(int x);
};
 
List::~List()
{
    if (Head)
    {
        Node* temp = Head;
        do
        {
            Tail = Head->Next;
            delete Head;
            Head = Tail;
        } while (Head != temp);
    }
}
 
void List::Add(int x)
{
    Node *temp = new Node;
    temp->x = x;
 
    if (!Head)
        Head = temp->Prev = temp->Next = temp;
    else
    {
        temp->Prev = Head->Prev;
        temp->Next = Head;
        Head->Prev->Next = temp;
        Head->Prev = temp;
    }
}
 
void List::Show()
{
    if (Head == NULL) cout << "\nСписок порожній\n\n";
    else
    {
        Node* temp = Head;
        do
        {
            cout << temp->x << " ";
            temp = temp->Next;
        } while (temp != Head);
        cout << "\n";
    }
}
 
void List::Quan()
{
    Node* temp = Head;
    int count = 0;
    do
    {
        count++;
        temp = temp->Next;
    } while (temp != Head);
    cout << count << "\n";
}
 
void List::Average()
{
    Node* temp = Head;
    double av = 0;
    int count = 0;
    do
    {
        av += temp->x;
        temp = temp->Next;
        count++;
    } while (temp != Head);
    cout << av / count << "\n";
 
}
void List::MinBeforMin()
{
    Node* temp = Head;
    int min = temp->x;
    do
    {
        if (temp->x < min)
            min = temp->x;
        temp = temp->Next;
    } while (temp != Head);
    cout << min << "\n";
 
    temp = Head;
    int befMin = 0;
    do
    {
        if (temp->x == min)
        {
            temp = temp->Prev;
            befMin = temp->x;
            break;
        }
        temp = temp->Next;
    } while (temp != Head);
    cout << "Елемент, що розташований перед найменшим:\n" << befMin << "\n";
 
}
 
void List::Max()
{
    Node* temp = Head;
    int max = temp->x;
    do
    {
        if (temp->x > max)
            max = temp->x;
        temp = temp->Next;
    } while (temp != Head);
    cout << max << "\n";
 
}
 
void List::Fourth()
{
    Node *temp = Head;
    int fourElt = 0, count = 0;
    do
    {
        count++;
        if (count == 4)
            fourElt = temp->x;
        temp = temp->Next;
    } while (temp != Head);
    if (count < 4)
        cout << "Структура не має четвертого елемента!\n";
    else
        cout << fourElt << "\n";
}
 
bool List::Find(int x)
{
    if (!Head)
        return false;
 
    Node* p = Head;
    do
    {
        if (p->x == x)
            return true;
 
        p = p->Next;
    } while (p != Head);
    return false;
}
 
int main()
{
    setlocale(LC_ALL, "Ukr");
    system("CLS");
    List lst;
    int x, n;
    cout << "Скiльки елементiв ви бажаєте додати в список > ";
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cout << "Значення > ";
        cin >> x;
        if (!lst.Find(x))
            lst.Add(x);
    }
    lst.Show();
    cout << "Кiлькiсть елементiв:" << endl;
    lst.Quan();
    cout << "Середне арифметичне елементiв:" << endl;
    lst.Average();
    cout << "Найменший елемент:" << endl;
    lst.MinBeforMin();
    cout << "Найбiльший елемент:" << endl;
    lst.Max();
    cout << "Четвертий елемент:" << endl;
    lst.Fourth();
    system("pause");
    return 0;
}
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
18.02.2020, 21:55 10
Лучший ответ Сообщение было отмечено Vic_ks как решение

Решение

Цитата Сообщение от Vic_ks Посмотреть сообщение
А как сделать так, чтобы пользователю выводилось предупреждение о том, что было введено два одинаковых значения, и чтоб он мог ввести заново это значение?
C++
1
2
3
4
5
6
7
8
9
10
11
12
for (int i = 0; i < n; )
{
    cout << "Значення > ";
    cin >> x;
    if (lst.Find(x))
        std::cout << "duplicate!!!" << std::endl;
    else
    {
        lst.Add(x);
        ++i;
    }
}
0
8 / 5 / 3
Регистрация: 17.02.2020
Сообщений: 38
18.02.2020, 22:08  [ТС] 11
Огромное спасибо!!Работает идеально))
0
18.02.2020, 22:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.02.2020, 22:08
Помогаю со студенческими работами здесь

Дописать функцию которая удваивает вхождение значения в кольцевом списке
помогите дописать функцию которая удваивает вхождение значения в кольцевом списке Program xa;...

Как удалить элемент перед заданным в кольцевом однонаправленном списке?
есть метод, который описывает, как удалить элемент после заданного надо переделать, чтобы он...

Как организовать поиск в двусвязном списке?
Есть класс двусвязный список где каждый элемент имеет большое количество полей (Имя, Фамилия,...

Как работает вставка в двусвязном списке?
Привет всем! я не понимаю как работает вставка в двусвязном списке, а точне не понимаю зачем писать...


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

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