Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 28.12.2016
Сообщений: 23
1

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

16.01.2018, 21:39. Просмотров 1678. Ответов 12
Метки нет (Все метки)


Здравствуйте, уже несколько часов сижу над этой задачей, но просто не могу разобраться, возможно я просто идиот, люди добрые помогите исправить код именно в этом стиле, скорее всего ошибка только в функции Redact
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
#include <iostream> 
#include <iomanip> 
#include <stdlib.h> 
#include <locale.h> 
#include <ctime> 
#include <cstdio>
 
using namespace std;
 
struct list
{
    int info;
    list* pred, *next;
};
 
//создает пустой список 
void CreatNullList(list*&head, list*&tail)
{
    head = new list;
    tail = new list;
 
    head->next = tail;
    tail->pred = head;
}
 
//Функция формирует список из N целых элементов со сторожами head и tail 
void CreateRandomlist(list*&head, list*&tail)
{
    int n = 6;
    head = new list;
    tail = new list;
 
    head->next = tail;
    tail->pred = head;
    list* last = head;
    for (int i = 0; i < n; i++)
    {
        list* p = new list;
 
        p->pred = last;
        p->next = last->next;
        last->next = p;
        p->next->pred = p;
 
        last = p;
        cout << "Введите элемент " << i << ": ";
        cin >> p->info;
 
    }
    return;
}
 
 
//Функция выводит двусвязный список на экран 
void PrintList(list* head, list* tail)
{
    if (head && tail)
    {
        list* p = head->next;
        while (p != tail)
        {
            cout << setw(4) << p->info;
            p = p->next;
        }
    }
    cout << endl;
    return;
}
 
// Функция исключает элeмент p из списка
// возвращает указатель на следующий элемент после p
void RemoveElement(list *p)
{
    if (p)
    {
        list *p1 = p->pred;
        list *p2 = p->next;
 
        p1->next = p2;
        p2->pred = p1;
        p->pred = NULL;
        p->next = NULL;
    }
}
 
//функция редактирования списка 
void Redact(list*&head, list *&tail)
{
    list *p;
    p = head->next;
    while (p != NULL)
    {
        if ((p->next != nullptr) && (p->info == p->pred->info))
        {
            RemoveElement(p);
            p = p->next;
        }
        else
        {
            p = p->next;
        }
    }
    return;
}
 
void main()
{
    setlocale(LC_ALL, "Russian");
    list* head, *tail;
 
 
    //Создаем и выводим на экран список L 
    CreateRandomlist(head, tail);
    cout << "Список L: " << endl;
    PrintList(head, tail);
 
 
    Redact(head, tail);
    cout << "список после удаления:" << endl;
    PrintList(head, tail);
    cout << endl;
    system("pause");
    return;
}
Добавлено через 53 минуты
bump
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.01.2018, 21:39
Ответы с готовыми решениями:

В списке из подряд идущих одинаковых элементов оставить первый
Дан список из n целых чисел а1, а2, ... , аn. Из группы подряд идущих элементов с одинаковыми...

Из группы подряд идущих элементов с одинаковыми значениями оставить только первый
Почему не работает программа? не находит сторожа, хотя я их объявляю) //Дан список из n целых...

Из группы подряд идущих элементов массива с одинаковыми значениями оставить только первый
Доброй ночи.) Дан список из n целых чисел a1,a2,...,an. Из группы подряд идущих элементов с...

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

12
1742 / 1335 / 1407
Регистрация: 28.10.2016
Сообщений: 4,267
16.01.2018, 21:58 2
Ошибка возникает в случае, если list не содержит повторяющихся элементов. Вот так всё отработало корректно
Введите элемент 0: 1
Введите элемент 1: 2
Введите элемент 2: 2
Введите элемент 3: 3
Введите элемент 4: 4
Введите элемент 5: 5
Список L:
1 2 2 3 4 5
список после удаления:
1 2 3 4 5
1
0 / 0 / 0
Регистрация: 28.12.2016
Сообщений: 23
16.01.2018, 22:13  [ТС] 3
Если групп повторяющихся элементов 2 или >, а также при 3-ёх или > одинаковых элементах подряд происходит удаление только 1 элемента. И дальше почему-то цикл не идёт
0
1742 / 1335 / 1407
Регистрация: 28.10.2016
Сообщений: 4,267
16.01.2018, 22:37 4
А чем не нравится подобный подход?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include "stdafx.h"
#include <iostream> 
#include <list>
#include <iterator>
#include <algorithm>
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
    cout << "Вводите числа (q - признак конца ввода): ";
    list<int> l(istream_iterator<int>(cin), {});
    cout << "Исходный список: ";
    copy(l.begin(), l.end(), ostream_iterator<int>(cout, " "));
    l.unique();
    cout << "\nНовый список: ";
    copy(l.begin(), l.end(), ostream_iterator<int>(cout, " "));
    cout << "\n";
    system("pause");
}
1
0 / 0 / 0
Регистрация: 28.12.2016
Сообщений: 23
16.01.2018, 22:51  [ТС] 5
Мне он очень нравится, но просто во первых я так не умею, а во вторых препод Очень принципиальный. Но конечно всё равно спасибо) А моим способом вы можете сделать? Или хотя бы конкретизировать какое место именно неправильно

Добавлено через 7 минут
Кстати, вы сделали и правда очень лаконично и понятно, даже я разобрался, но к сожалению препод откажется её принимать(
0
Модератор
1618 / 1075 / 483
Регистрация: 17.07.2012
Сообщений: 5,303
16.01.2018, 23:20 6
Переделал функцию как-то так. Вроде работает. Надо еще потестировать хорошо.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void Redact(list*&head, list *&tail)
{
    list *p;
    p = head->next;
    while (p != NULL)
    {
        if ((p->next != nullptr) && (p->info == p->pred->info))
        {   p = p->next;
            RemoveElement(p->pred);
            
        }
        else
        {
            p = p->next;
        }
    }
    return;
}
Добавлено через 3 минуты
Цитата Сообщение от Новичок Посмотреть сообщение
return;
Кстати только сейчас заметил вот это. Нет смысла так писать, если все действия уже сделаны, мы и так из функции выйдем.
В main тоже самое. main вообще лучше делать типа int, иначе не везде скомпилится(я вот сейчас в своем g++ менял void на int чтоб скомпилилось и убирал этот ненужный return).
1
0 / 0 / 0
Регистрация: 28.12.2016
Сообщений: 23
16.01.2018, 23:29  [ТС] 7
Почему-то пишет после ввода данных вот это :

Вызвано исключение: нарушение доступа для чтения.

p было 0xCDCDCDCD.

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

Добавлено через 1 минуту
Спасибо, return'ы уберу и на инт поменяю)
0
Модератор
1618 / 1075 / 483
Регистрация: 17.07.2012
Сообщений: 5,303
16.01.2018, 23:36 8
glupec, а что вводите?
1
0 / 0 / 0
Регистрация: 28.12.2016
Сообщений: 23
16.01.2018, 23:38  [ТС] 9
1 1 1 2 2 3
0
Модератор
1618 / 1075 / 483
Регистрация: 17.07.2012
Сообщений: 5,303
16.01.2018, 23:47 10
Лучший ответ Сообщение было отмечено glupec как решение

Решение

Попробовал в онлайн-компиляторе(компилятор как в студии), работает
http://rextester.com/SGLR22290

Добавлено через 1 минуту
С другим компилятором тоже самое.
http://rextester.com/XBLR96052

Добавлено через 3 минуты
Вообще функции написаны жутко криво.
Цитата Сообщение от glupec Посмотреть сообщение
p->next->pred = p;
Вот это бред какой-то, по идее надо просто убрать.
1
0 / 0 / 0
Регистрация: 28.12.2016
Сообщений: 23
16.01.2018, 23:49  [ТС] 11
У меня просто весь день эта ошибка почти что + еще и не только в этой программе, частенько она появляется в последнее время в общем(( Может знаете как пофиксить? Потому что я как вы делал уже вроде и получал на выходе эту ошибку, всё портит она(
0
Модератор
1618 / 1075 / 483
Регистрация: 17.07.2012
Сообщений: 5,303
16.01.2018, 23:51 12
Цитата Сообщение от glupec Посмотреть сообщение
Может знаете как пофиксить
Нормально разобраться со списками и написать заново код.
1
0 / 0 / 0
Регистрация: 28.12.2016
Сообщений: 23
16.01.2018, 23:52  [ТС] 13
Хорошо, спасибо вам большое, помогли, чесслово
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.01.2018, 23:52

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

В целочисленном массиве вывести все группы идущих подряд одинаковых элементов
Задан целочисленный массив Х из 20 элементов. Вывести на экран все группы идущих подряд одинаковых...

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

Оставить в каждом слове текста с каждой последовательности идущих подряд одинаковых букв только одну букву
Здравствуйте! Задание:Оставить в каждом слове текста с каждой последовательности идущих подряд...

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


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

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

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