0 / 0 / 0
Регистрация: 07.04.2020
Сообщений: 4
1

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

07.04.2020, 18:36. Показов 2476. Ответов 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
#include <conio.h>
#include <locale>
#include <stdio.h>
 
typedef struct node
{
    char data;
    struct node* next;
} node;
 
node* add(node* first, int number);
node* deleten(node* first, node* root);
void print(node* first);
 
node* first = new node;
 
 
void main()
{
    setlocale(LC_ALL, "ru");
    char sym; //символ, вводимый с клавиатуры
    printf("Bведите строку символов и точку:\n");
    first->next = NULL;//инициализация списка
 
    do                     /*  заполнение стека    */
    {
        sym = _getche();
        add(first, sym);
    } while (sym != '.');
    if (first->data == first->next->data) deleten(first, first->next);
    printf("\n");
    print(first);
    _getch();
}
 
/*----добавление узла----*/
 
node* add(node* first, int number)
{
    node* temp, * p;
    temp = new node;
    p = first->next;
    first->next = temp;
    temp->data = number;
    temp->next = p;
    return(temp);
}
 
/*----удаление узла----*/
 
node* deleten(node* first, node* root)
{
    node* temp;
    temp = root;
    while (temp->next != first)
    {
        temp = temp->next;
    }
    temp->next = first->next;
    delete first;
    return(temp);
}
 
/*----вывод элементов списка----*/
 
void print(node* first)
{
    node* p;
    p = first;
    do {
        printf("%c", p->data);
        p = p->next;
    } while (p != NULL);
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.04.2020, 18:36
Ответы с готовыми решениями:

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

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

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

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

2
1505 / 968 / 812
Регистрация: 30.04.2016
Сообщений: 3,334
08.04.2020, 16:31 2
Лучший ответ Сообщение было отмечено AlexSemenov как решение

Решение

AlexSemenov, здравствуйте! Вот решение:

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
#include <iostream>
#include <cmath>
 
    using namespace std;
 
struct List {
    double key;
    List* next;
};
 
List* head = NULL;
 
void add(double key) {
    List* temp = new List;
    temp->key = key;
    temp->next = NULL;
    if (head == NULL) {
        head = temp;
    } else {
        List* ptr = head;
        while (ptr->next != NULL) {
            ptr = ptr->next;
        }
        ptr->next = temp;
    }
}
 
void del_repeats(List* head) {
    List* curr = head;
    List* tmp;
    while (1) {
        if (curr->next == NULL) {
            break;
        }
        if (fabs(curr->next->key - curr->key) < 0.0001) {
            tmp = curr->next->next;
            delete curr->next;
            curr->next = tmp;
        } else {
            curr = curr->next;
        }
    }
}
 
void print(List* head) {
    List* curr = head;
    while (curr != NULL) {
        cout << curr->key << " ";
        curr = curr->next;
    }
}
 
int main() {
    int n;
    double val;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> val;
        add(val);
    }
    del_repeats(head);
    print(head);
    return 0;
}
P.S. Обратите, пожалуйста, внимание. Я сравниваю вещественные числа с заданной точностью. То есть, например, числа 1.123 и 1.124 не будут равны, а числа 1.12335 1.12337 будут.
1
0 / 0 / 0
Регистрация: 07.04.2020
Сообщений: 4
10.04.2020, 15:21  [ТС] 3
Спасибо большое, выручили!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.04.2020, 15:21
Помогаю со студенческими работами здесь

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

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

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

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

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

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


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

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

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