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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.05.2023, 14:38   #1
lenaiv
Пользователь
 
Регистрация: 16.03.2023
Сообщений: 67
По умолчанию С++ Списки

У меня есть программа, она работает, но сказали, что нужно разделить списки, а как это сделать я ума не приложу. Я так понимаю, у меня двунаправленность добавление списков, а мне нужно однонаправленные списки. Кто-то сможет мне показать, как это сделать у меня в программе:
Код:
#include <iostream>
#include <string>
#include <Windows.h> 
 
using namespace std;
 
struct node 
{
    double inf;
    node* next, * prev;
};
 
struct list 
{
    node* head = nullptr, * tail = nullptr;
    int kol_n = 0;
    list() {}
 
    void clear() // очистка
    {
        node* ptr1 = head, * ptr2 = head->next;
        while (ptr2)
        {
            ptr1 = ptr2;
            ptr2 = ptr2->next;
            delete ptr1;
        }
        delete head;
        head = nullptr;
        tail = nullptr;
        kol_n = 0;
     }
 
    ~list()
    {
        (*this).clear();
    }
 
    void add(double n) // добавление
    {
        kol_n++;
        if (tail) {
            tail->next = new node;
            tail->next->prev = tail;
            tail = tail->next;
        }
        else {
            head = tail = new node;
            tail->prev = nullptr;
        }
        tail->next = nullptr;
        tail->inf = n;
    }
 
    void print() // печать
    {
        node* ptr = head;
        if (ptr)
        {
            while (ptr)
            {
                cout << ptr->inf << ' ';
                ptr = ptr->next;
            }
            cout << '\n';
        }
        else cout << "Нет элементов\n";
    }
 
    void summ_proizv() 
    {
        if (kol_n >= 2)
        {
            double S = 1;
            node* x1 = head;
            node* x2 = head->next;
            node* xn = tail;
            while (x2)
            {
                S *= (x1->inf + x2->inf + 2 * xn->inf);
                x1 = x1->next;
                x2 = x2->next;
                xn = xn->prev;
            }
            cout << "S = " << S << endl;
        }
        else
            cout << "Мало элементов в списке" << endl;
    }
};
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    list lst;
    double n;
    char ogranichitel = ' ';
    cout << "Введите элементы пробел, заканчивая ввод Enter: ";
     while (ogranichitel != '\n')
    {
        cin >> n;
        lst.add(n);
        while (true)
        {
            ogranichitel = cin.peek();
            if (ogranichitel != ' ') 
                break;
            cin.get();
        }
    } 
    printf("\nСозданая последовательность: ");
    lst.print();
    lst.summ_proizv();
    printf("\n");
    system("pause");
    return 0;
}
lenaiv вне форума Ответить с цитированием
Старый 03.05.2023, 18:48   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Надо убрать из структуры *prev и все строчки с ней связанные. Но тогда придётся каждый раз искать предыдущий элемент для вычисления формулы. Т.е. вместо xn = xn->prev; придётся сделать цикл, который начинает с head и заканчивает, когда item = nullptr или item->next == xn
macomics вне форума Ответить с цитированием
Старый 04.05.2023, 05:22   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Но тогда придётся каждый раз искать предыдущий элемент для вычисления формулы.
Или можно добавить метод добавления элемента в начало списка и при считывании очередного элемента класть его в конец одного списка и в начало другого списка, а потом считать произведение сумм, проходя по двум спискам.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 04.05.2023, 15:16   #4
lenaiv
Пользователь
 
Регистрация: 16.03.2023
Сообщений: 67
По умолчанию

Мне нужно разделить на файлы добавление списка.
lenaiv вне форума Ответить с цитированием
Старый 04.05.2023, 17:32   #5
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Что значит разделить на файлы?

Код:
./main < list.txt
macomics вне форума Ответить с цитированием
Старый 04.05.2023, 19:04   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Вынести определение класса в отдельные h/cpp.
p51x вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
динамические структуры(списки). односвязные списки c++ Асдин Помощь студентам 2 16.07.2020 14:18
Списки Anastasia2012 Помощь студентам 1 09.12.2012 12:25
Списки AnnNet Microsoft Office Excel 5 23.11.2009 20:29
Списки ANG3 Microsoft Office Word 4 22.11.2009 21:00