Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.04.2023, 12:29   #1
lenaiv
Пользователь
 
Регистрация: 16.03.2023
Сообщений: 67
По умолчанию с++ Списки. Динамические структуры. В списке из каждой группы (состоящем из букв, цифр, символов) оставляет только один

У меня задача: Написать программу и описать подпрограмму, которая в списке К (состоящем из букв, цифр, символов, чисел положительных и отрицательных) из каждой группы идущих подряд равных элементов оставляет только один. Мы только начали проходить Списки и Динамические структуры данных. Это моя в этой теме первая задача. Прочитала литературу, рассмотрела примеры. Пытаюсь написать, но что-то не получается. Помогите, пожалуйста!!!
Код:
#include <iostream>
#include <string>
#include <algorithm>
#include <numeric>
#include <Windows.h> 
 
using namespace std;
 
struct node // узел
{
    int inf;
    node* next;
};
 
struct list // список
{
    node* head = nullptr;
 
    list(int n) 
    {
        head = new node;
        head->inf = n;
        head->next = nullptr;
    }
 
    void clear() // очистка
    {
        node* ptr1 = head, * ptr2 = head->next;
        while (ptr2) 
        {
            ptr1 = ptr2;
            ptr2 = ptr2->next;
            delete ptr1;
        }
        delete head;
        head = nullptr;
    }
 
    ~list() 
    {
        (*this).clear();
    }
 
    void add(int n) // добавление
    {
        node* ptr = head;
        if (ptr) 
        {
            while (ptr->next)
                ptr = ptr->next;
            ptr->next = new node;
            ptr->next->inf = n;
            ptr->next->next = nullptr;
        }
        else
        {
            head->inf = n;
            head->next = nullptr;
        }
    }
 
    void print() // печать
    {
        node* ptr = head;
        if (ptr)
        {
            while (ptr) 
            {
                cout << ptr->inf << ' ';
                ptr = ptr->next;
            }
            cout << '\n';
        }
        else cout << "Нет элементов\n";
    }
};
 
void UdalPovtor(list* head) // удаление повторяющегося
{
    struct Node* n = head->next;
 
    while (n != NULL)
    {
        if (head->value != n->value)
        {
            head = n;
            n = n->next;
        }
        else
        {
            head->next = n->next;
            free(n);
            n = head->next;
        }
    }
}
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    int n; 
    printf("\nВведите количество элементов: ");
    cin >> n;
    list lst(n);
    lst.add();
    lst.clear(); 
    lst.print();
    lst.UdalPovtor();
    printf("\nНовый список: ");
    system("pause");
    return 0;
}
lenaiv вне форума Ответить с цитированием
Старый 24.04.2023, 15:22   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Тут все немного проще.
Код:
#include <iostream>
#include <string>

struct TItem {
    TItem *next;
    int data;
};

void RemoveEquals(TItem *head) {
    if (head != nullptr)
        for (TItem *prev = head, *item = head->next; item != nullptr; item = item->next) {
            while (prev->data == item->data) {
                prev->next = item->next;
                delete item;
                item = prev->next;
                if (item == nullptr) break;
            }
            if (item == nullptr) break;
            prev = item;
        }
}

int main(int argc, char *argv[]) {
    std::string choose = "1";
    TItem *head = nullptr, *tail = nullptr, *item = nullptr, *temp;
    do {
        std::cout << "Выберите один из пунктов:\n 1) ввести элемент списка;\n 2) вывести элементы в списке;\n 3) удалить повторы;\n 0) выход";
        std::cin >> choose;
        if (choose == "1") {
            item = new TItem;
            item->next = nullptr;
            std::cout << "\nВведите число: ";
            std::cin >> item->data;
            std::cout << "\n";
            if (tail == nullptr) {
                head = tail = item;
            } else {
                tail->next = item;
                tail = item;
            }
        } else if (choose == "2") {
            std::cout << "Вот содержимое списка: \n";
            for (item = head; item != nullptr; item = item->next)
                std::cout << item->data << (item->next == nullptr ? "\n" : ", ");
        } else if (choose == "3") {
            RemoveEquals(head);
        } else if (choose != "0") {
            std::cout << "Попробуйте еще раз!\n";
        }
        std::cout << "\n";
    } while (choose != "0");
    for (item = head; item != nullptr; temp = item->next, delete item, item = temp);
    std::cout << "Возвращайтесь позже и попробуйте задать другие значения в списке!\n";
    return 0;
}
Вот так она работает.
macomics вне форума Ответить с цитированием
Старый 24.04.2023, 16:57   #3
lenaiv
Пользователь
 
Регистрация: 16.03.2023
Сообщений: 67
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Тут все немного проще.
Код:
#include <iostream>
#include <string>

struct TItem {
    TItem *next;
    int data;
};

void RemoveEquals(TItem *head) {
    if (head != nullptr)
        for (TItem *prev = head, *item = head->next; item != nullptr; item = item->next) {
            while (prev->data == item->data) {
                prev->next = item->next;
                delete item;
                item = prev->next;
                if (item == nullptr) break;
            }
            if (item == nullptr) break;
            prev = item;
        }
}

int main(int argc, char *argv[]) {
    std::string choose = "1";
    TItem *head = nullptr, *tail = nullptr, *item = nullptr, *temp;
    do {
        std::cout << "Выберите один из пунктов:\n 1) ввести элемент списка;\n 2) вывести элементы в списке;\n 3) удалить повторы;\n 0) выход";
        std::cin >> choose;
        if (choose == "1") {
            item = new TItem;
            item->next = nullptr;
            std::cout << "\nВведите число: ";
            std::cin >> item->data;
            std::cout << "\n";
            if (tail == nullptr) {
                head = tail = item;
            } else {
                tail->next = item;
                tail = item;
            }
        } else if (choose == "2") {
            std::cout << "Вот содержимое списка: \n";
            for (item = head; item != nullptr; item = item->next)
                std::cout << item->data << (item->next == nullptr ? "\n" : ", ");
        } else if (choose == "3") {
            RemoveEquals(head);
        } else if (choose != "0") {
            std::cout << "Попробуйте еще раз!\n";
        }
        std::cout << "\n";
    } while (choose != "0");
    for (item = head; item != nullptr; temp = item->next, delete item, item = temp);
    std::cout << "Возвращайтесь позже и попробуйте задать другие значения в списке!\n";
    return 0;
}
Вот так она работает.
как она должна работать, числа вводит по одному каждый раз и может выводить, но ничего не удаляет.
А мне нужно, я пытаюсь сделать:
Список К: 1 1 -2 -2 6,5 6,5 6,5 a a f f f to to ; ; ? ? ?
Новый список К: 1 -2 6,5 a f to ; ?
lenaiv вне форума Ответить с цитированием
Старый 24.04.2023, 18:10   #4
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Так измените тип элемента списка. В вашем примере он должен быть строкой, а не числом.

https://godbolt.org/z/xfqe5rv9n
macomics вне форума Ответить с цитированием
Старый 24.04.2023, 18:46   #5
lenaiv
Пользователь
 
Регистрация: 16.03.2023
Сообщений: 67
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Так измените тип элемента списка. В вашем примере он должен быть строкой, а не числом.

https://godbolt.org/z/xfqe5rv9n
А поняла, спасибо большое.
lenaiv вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дан стек символов. Преобразовать стек, оставив в нем из группы подряд идущих символов только один - Delphi FunnyNeo Общие вопросы Delphi 0 09.04.2017 11:50
Группы букв, знаков и цифр Паркер Помощь студентам 2 08.11.2011 22:18
Группы символов, состоящие только из латинских букв, если первая буква группы входит в нее еще только оди Ela Помощь студентам 0 29.04.2010 13:41