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

Двусвязный список объектов

01.06.2018, 22:26. Показов 3201. Ответов 4
Метки нет (Все метки)

Всем привет, уважаемые програмисты!

Нужна ваша помощь в следующем задании:
"Создать двунаправленный нециклический список.
Создать функции, которые будут добавлять и уничтожать элементы списка.
Создать функцию, которая будет искать в списке объект в котором на счету средств больше указанного через аргумент функции значение.
Создать функцию, которая будет искать в списке объект в котором на счету средств больше указанного через аргумент функции значение.
Использовать меню для демонстрации работы всех функций членов объекта, найденного функцией поиска.
Создать список из объектов класса-потомке разработанного в предыдущей лабораторной работе. "

Я создавал шаблонный класс для реализации списка, прописал основные функции и мои знания закончились на создании однонаправленого списка:
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
template<typename T>
class List
{
public:
    List();
    ~List();
    void pop_front();
    void push_back(T data);
    void clear();
    int GetSize() { return Size; }
    T& operator[](const int index);
    void push_front(T data);
    void insert(T data, int index);
    void removeAt(int index);
    void pop_back();
    void get_inform() {
        getName();
    };
private:
 
 
    template<typename T>
    class Node
    {
    public:
        Node * pNext;
        Node * pPrev;
        T data;
 
        Node(T data = T(), Node *pNext = nullptr, Node *pPrev = nullptr)
        {
            this->data = data;
            this->pNext = pNext;
            this->pPrev = pPrev;
        }
    };
    int Size;
    Node<T> *head;
};
 
 
template<typename T>
List<T>::List()
{
    Size = 0;
    head = nullptr;
}
 
 
template<typename T>
List<T>::~List()
{
    clear();
}
 
 
template<typename T>
void List<T>::pop_front()
{
    Node<T> *temp = head;
 
    head = head->pNext;
 
    delete temp;
 
    Size--;
 
}
 
template<typename T>
void List<T>::push_back(T data)
{
    if (head == nullptr)
    {
        head = new Node<T>(data);
    }
    else
    {
        Node<T> *current = this->head;
 
        while (current->pNext != nullptr)
        {
            current = current->pNext;
        }
        current->pNext = new Node<T>(data);
 
    }
 
    Size++;
}
 
template<typename T>
void List<T>::clear()
{
    while (Size)
    {
        pop_front();
    }
}
 
 
template<typename T>
T & List<T>::operator[](const int index)
{
    int counter = 0;
 
    Node<T> *current = this->head;
 
    while (current != nullptr)
    {
        if (counter == index)
        {
            return current->data;
        }
        current = current->pNext;
        counter++;
    }
}
 
template<typename T>
void List<T>::push_front(T data)
{
    head = new Node<T>(data, head);
    Size++;
}
 
template<typename T>
void List<T>::insert(T data, int index)
{
 
    if (index == 0)
    {
        push_front(data);
    }
    else
    {
        Node<T> *previous = this->head;
 
        for (int i = 0; i < index - 1; i++)
        {
            previous = previous->pNext;
        }
 
        Node<T> *newNode = new Node<T>(data, previous->pNext);
 
        previous->pNext = newNode;
 
        Size++;
    }
 
 
 
 
 
}
 
template<typename T>
void List<T>::removeAt(int index)
{
    if (index == 0)
    {
        pop_front();
    }
    else
    {
        Node<T> *previous = this->head;
        for (int i = 0; i < index - 1; i++)
        {
            previous = previous->pNext;
        }
 
 
        Node<T> *toDelete = previous->pNext;
 
        previous->pNext = toDelete->pNext;
 
        delete toDelete;
 
        Size--;
    }
 
}
 
template<typename T>
void List<T>::pop_back()
{
    removeAt(Size - 1);
}
(Класс для абонентов)
Вот тот класс, с объектов которого нужно создать список и меню которое нужно будет переделать, при необходимости можно передалать и функции-члены класса:
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
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
#include <math.h>
 
using namespace std;
 
#define N 50
 
struct Tariff {
    float SMSCost;
    float inCost;
    float outCost;
};
class ChangeTariff;
 
class Consumer {
private:
    Tariff tariff;
    float balance;
    static char number[N];
    static char tName[N];
    friend void Alter(ChangeTariff &, Consumer &, const char *);
    friend void InformationTariff(ChangeTariff &, Consumer &);
    friend const Consumer operator-(Consumer&, const float &);
public:
    Consumer(const char *fName_1, const char *fName_2) {
        ifstream fin1(fName_1);
        char line[N];
        fin1.getline(line, N);
        strcpy_s(number, line);
        fin1.getline(line, N);
        strcpy_s(tName, line);
        fin1.getline(line, N);
        balance = atof(line);
        fin1.close();
        ifstream fin2(fName_2);
        fin2.getline(line, N);
        tariff.SMSCost = atof(line);
        fin2.getline(line, N);
        tariff.inCost = atof(line);
        fin2.getline(line, N);
        tariff.outCost = atof(line);
        fin2.close();
    }
    Consumer() {};
    Consumer(int i) : balance(i) {};
    void getAccountInfo();
    void Replenish();
    void Replenish(const int &);
    void getNumber();
    virtual void getName();
    ~Consumer() {};
};
 
class ChangeTariff : public Consumer {
public : ChangeTariff() :
    Consumer() {};
         void getName() {
             cout << "You use an imitation class!!!" << endl;
             _gettch();
         };
         friend void InformationTariff(ChangeTariff &obj1,Consumer &obj2) {
             cout << "You can talk " << round(obj2.balance / obj2.tariff.inCost) << " minutes with subscribers of your operator" << endl;
             cout << "You can talk " << round(obj2.balance / obj2.tariff.outCost) << " minutes whits subscriber of other operators" << endl;
             cout << "You can send " << round(obj2.balance / obj2.tariff.SMSCost) << " SMS" << endl;
             _gettch();
         }
         friend void Alter(ChangeTariff &obj2, Consumer &obj1, const char *fName_3) {
             obj1.balance -= 10;
             cout << "Enter a file name with the tariff:";
             ifstream fin3(fName_3);
             char line[N];
             fin3.getline(line, N);
             strcpy_s(obj1.tName, line);
             fin3.getline(line, N);
             obj1.tariff.SMSCost = atof(line);
             fin3.getline(line, N);
             obj1.tariff.inCost = atof(line);
             fin3.getline(line, N);
             obj1.tariff.outCost = atof(line);
             fin3.close();
         }
         friend const Consumer operator-(Consumer&left, const float &money) {
             return left.balance -= money;
         };
};
 
char Consumer::tName[N] = "Tariff";
char Consumer::number[N] = "Number";
 
void Consumer::getName() {
    cout << "Your tarrif name: " << tName << endl;
    cout << tariff.inCost<< " , " << tariff.outCost << " , " << tariff.SMSCost << endl ;
    _gettch();
}
 
void Consumer::getNumber() {
    cout << "Your number: " << number << endl;
    _gettch();
}
 
void Consumer::getAccountInfo() {
    cout << "Balance: " << balance << endl;
    _gettch();
}
 
void Consumer::Replenish() {
    balance += 20;
    cout << "The account is replenished";
    _gettch();
}
 
void Consumer::Replenish(const int &money) {
    
    try
    {
        if (money % 25 != 0)
            throw 25;
        balance += money;
    }
    catch (int i)
    {
        cout << "An exclusion worked "<< i <<" and the account was not replenished";
    }
    cout << "The account is replenished";
    _gettch();
}
 
void menu() {
    int money;
    float take;
    char fName_1[N];
    char fName_2[N];
    char fName_3[N];
    cout << "Enter file name of consumer: ";
    cin >> fName_1;
    cout << "Enter file name of tariff: ";
    cin >> fName_2;
    Consumer Account(fName_1, fName_2);
    ChangeTariff NewTar;
    while (1) {
        system("cls");
        char answer;
        cout << "Press 1 to replenish balance" << endl;
        cout << "Press 2 to replenish balance on 20$" << endl;
        cout << "Press 3 to show balance" << endl;
        cout << "Press 4 to show your phone number" << endl;
        cout << "Press 5 to show your tariff name" << endl;
        cout << "Press 6 to change your tariff" << endl;
        cout << "Press 7 to show information about the number of available services" << endl;
        cout << "Press 8 to use your money" << endl;
        cout << "Press 9 to exit" << endl << endl;
        answer = _gettch();
 
        switch (answer) {
        case '1':
            cout << "Enter amount of money: ";
            cin >> money;
            Account.Replenish(money);
            break;
        case '2':
            Account.Replenish();
            break;
        case '3':
            Account.getAccountInfo();
            break;
        case'4':
            Account.getNumber();
            break;
        case'5':
            Account.getName();
            NewTar.getName();
            break;
        case '6':
            cout << "Enter file name change tariff: ";
            cin >> fName_3;
            Alter(NewTar, Account, fName_3);
            break;
        case '7':
            InformationTariff(NewTar, Account);
            break;
        case '8':
            cout << "How much money to use?" << endl;
            cin >> take;
            Account - take;
            break;
        case '9':
            cout << "bye!";
            _gettch();
            return;
        
        }
    }
}
 
int main()
{
    menu();
    return 0;
}
Пример текстового файла, который считываятся при вызове конструктора с параметрами:
Файл a1.txt:
80982771223
Best
105.43

Файл a2.txt:
0.25
0.40
0.80


Кому не сложно, помогите, а то в этой теме не могу разобраться :-(
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.06.2018, 22:26
Ответы с готовыми решениями:

Двусвязный циклический список объектов
1. Создать двусвязный циклический список из объектов класса-наследника; 2. Создать функцию,...

Переделать двусвязный список в двусвязный кольцевой
Здравствуйте, у меня єсть двусвязный список однако он не кольцевой! как это запрограммировать? и...

Сформировать список из 10 работников, используя динамическую структуру данных двусвязный список
спасайте Сформировать список из 10 работников, используя динамическую структуру данных...

Двусвязный список (в конец двусвязного списка добавить другой список)
здравствуйте, подскажите пожалуйста, как в конец двусвязного списка добавить другой список?

4
471 / 423 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
02.06.2018, 02:44 2
1. Если список двунаправленный, почему бы не добавить указатель на конец списка?
2.
Цитата Сообщение от Poliakov Посмотреть сообщение
Я создавал шаблонный класс для реализации списка, прописал основные функции и мои знания закончились на создании однонаправленого списка:
По сути, работа будет точно такая же, за исключением упрощенного добавления/удаления элементов списка.
3. С чем конкретно нужно помочь?

Добавлено через 38 минут
Подкорректировал (должно быть верно, если что, утром гляну, сейчас голова уже не варит) функции списка:
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
205
206
207
208
template<typename T>
class List
{
public:
    List();
    ~List();
    void pop_front();
    void pop_back();
    void removeAt(int index);
 
    void push_back(T data);
    void push_front(T data);
    void insert(T data, int index);
 
    void clear();
    int GetSize() const { return Size; }
    T& operator[](const int index);
 
private:
 
    template<typename T>
    class Node
    {
    public:
        Node * pNext;
        Node * pPrev;
        T data;
 
        Node(T data = T(), Node *pNext = nullptr, Node *pPrev = nullptr)
        {
            this->data = data;
            this->pNext = pNext;
            this->pPrev = pPrev;
        }
    };
    int Size;
 
    Node<T> *head;
    Node<T> *tail;
};
 
 
template<typename T>
List<T>::List()
{
    Size = 0;
    head = nullptr;
    tail = nullptr;
}
 
 
template<typename T>
List<T>::~List()
{
    clear();
}
 
 
template<typename T>
void List<T>::pop_front()
{
    if (!head)
        cout << "Empty" << endl;
    else
    {
        Node<T> *temp = head;
        head = head->pNext;
        delete temp;
        if (head)
            head->pPrev = nullptr;
        Size--;
    }
}
 
template<typename T>
void List<T>::pop_back()
{
    if (!tail)
        cout << "Empty" << endl;
    else
    {
        Node<T> *temp = tail;
        tail = tail->pPrev;
        delete temp;
        if (tail)
            tail->pNext = nullptr;
        Size--;
    }
}
 
 
template<typename T>
void List<T>::removeAt(int index)
{
    if (!head || index > Size - 1)
        return;
    if (index == 0)
    {
        pop_front();
    }
    else if (index == Size - 1)
    {
        pop_back();
    }
    else
    {
        Node<T> *previous = this->head;
        for (int i = 0; i < index; i++)
        {
            previous = previous->pNext;
        }
 
        Node<T> *toDelete = previous->pNext;
        previous->pNext = toDelete->pNext;
        toDelete->pNext->pPrev = previous;
 
        delete toDelete;
        Size--;
    }
}
 
template<typename T>
void List<T>::push_back(T data)
{
    Node<T> *temp = new Node<T>(data);
    temp->pNext = nullptr;
    temp->pPrev = nullptr;
 
    if (tail == nullptr)
    {
        head = temp;
        tail = temp;
        head->pNext = tail;
        tail->pPrev = head;
    }
    else
    {
        temp->pPrev = tail;
        tail->pNext = temp;
        tail = temp;
    }
    Size++;
}
 
template<typename T>
void List<T>::push_front(T data)
{
    Node<T> *temp = new Node<T>(data);
    temp->pNext = nullptr;
    temp->pPrev = nullptr;
 
    if (head == nullptr)
    {
        head = temp;
        tail = temp;
        head->pNext = tail;
        tail->pPrev = head;
    }
    else
    {
        temp->pNext = head;
        head->pPrev = temp;
        head = temp;
    }
    Size++;
}
 
template<typename T>
void List<T>::insert(T data, int index)
{
    if (!head || Size + 1 < index)
        return;
    
    if (index == 0)
    {
        push_front(data);
    }
    else if (index == Size + 1)
    {
        push_back(data);
    }
    else
    {
        Node<T> *previous = this->head;
 
        for (int i = 0; i < index; i++)
        {
            previous = previous->pNext;
        }
 
        Node<T> *temp = new Node<T>(data);
 
        temp->pNext = previous->pNext;
        temp->pPrev = previous;
        previous->pNext = temp;
        Size++;
    }
}
 
 
template<typename T>
void List<T>::clear()
{
    while (Size)
    {
        pop_front();
    }
}
Исправлял исключительно имеющееся, объект списка не трогал, есть ли там какие ошибки - без понятия.
1
1 / 1 / 1
Регистрация: 19.02.2018
Сообщений: 33
02.06.2018, 16:48  [ТС] 3
Спасибо большое за вашу помощь!
Если не сложно, напишите еще функцию которая будет искать объект, на счету которого денег больше. чем указано через аргумент и добавте ее в меню, дальше думаю сам разберусь.
Если что, в классе Consumer в private есть поле balance в которое обозначает количество денег на счету.

Добавлено через 15 минут
и еще, как мне двигаться по списку, например и меня есть 5 объктов, я только что создал 5 и хочу посмотреть название тарифа для 2, а потом для 4, как мне это сделать?
0
471 / 423 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
02.06.2018, 16:57 4
Poliakov, Ты же писал что разобрался с однонаправленными списками? В чем просмотр однонаправленного отличается от двунаправленного? НИ В ЧЕМ. Кроме как двунаправленный просматривать с двух сторон можно.
Псевдокод:
C++
1
2
3
4
5
6
Node *temp = head;
while (temp)
{
cout << temp->value;
temp = temp->next;
}
Цитата Сообщение от Poliakov Посмотреть сообщение
только что создал 5 и хочу посмотреть название тарифа для 2, а потом для 4,
перемещаться 5/2/4 раз(а) от головы до объекта, потом его выводить.

Цитата Сообщение от Poliakov Посмотреть сообщение
Если не сложно, напишите еще функцию которая будет искать объект, на счету которого денег больше. чем указано через аргумент и добавте ее в меню,
Мне - не сложно. Но в чем проблема сделать это тебе? Добавить функцию, которая принимает в качестве аргумента "количество денег" и проверяет все узлы на (псевдокод):
C++
1
if (temp->value > "количество денег") cout << temp->value;
1
1 / 1 / 1
Регистрация: 19.02.2018
Сообщений: 33
02.06.2018, 18:36  [ТС] 5
Спасибо)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.06.2018, 18:36

Составить двусвязный список на основе класса, объекты которого будут формировать этот список
Составить двусвязный список на основе класса, объекты которого будут формировать этот список. В...

Заменить массив структур на односвязный список, и на двусвязный список
Взять текст задания и заменить массив структур на односвязный список, и на двусвязный список ...

Создать двусвязный список групп факультета, где каждая группа представляет собой односвязный список студентов
Задание: создайте двусвязный список групп факультета. Каждая группа представляет собой односвязный...

Преобразовать односвязный список в двусвязный список
Доброго времени суток! Помогите, пожалуйста, преобразовать программу из односвязного списка в...

Двусвязный список
Пытаюсь реализовать двусвязный список. При компиляции, ошибка &quot;data: не удается сопоставить...

Двусвязный список
Привет, народ. Помогите плиз найти ошибку. #include &quot;iostream&quot; #include &quot;cmath&quot; using...


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

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

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