Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 08.09.2019
Сообщений: 7
1

Составить односвязный список на основе класса

28.09.2019, 14:35. Показов 1098. Ответов 1

Author24 — интернет-сервис помощи студентам
Составить односвязный список на основе класса, объекты которого будут формировать этот список. В описание класса должны входить данные для хранения фамилии студента, номера группы, оценок по трем предметам; функции для доступа к отдельным компонентам списка используя указатель "this (thist указывающий на список)".


Программа выполняет это задание, но указатель this используется в качестве очистки памяти, как изменить эту программу?
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
#include <iostream>
#include <cstring>
#define _CRT_SECURE_NO_WARNINGS
 
template<class T>
struct snode {
    T      val;
    snode* next;
};
 
template<class T>
class slist {
    typedef snode<T> node;
private:
    node* head;
    node* tail;
    size_t cnt;
public:
    slist(void) :head(NULL), tail(NULL), cnt(0) {}
    slist(const slist&);
    ~slist() {
 
        this->clear();
    }
 
    slist& operator = (const slist&);
    
public:
    //вставка в начало списка
    bool add_front(const T& val) {
        node* p;
        try {
            p = new node();
        }
        catch (...) { return false; }
 
        p->val = val;
        p->next = NULL;
        if (head == NULL)
            head = tail = p;
        else {
            p->next = head;
            head = p;
        }
        ++cnt;
        return true;
    }
 
    //вставка в конец списка
    bool add_back(const T& val) {
        node* p;
        try {
            p = new node();
        }
        catch (...) { return false; }
 
        p->val = val;
        p->next = NULL;
        if (head == NULL)
            head = tail = p;
        else {
            tail->next = p;
            tail = p;
        }
        ++cnt;
        return true;
    }
 
    //удаление элемента
    node* erase(node* pos) {
        node* prev = head;
        if (pos == NULL)
            return NULL;
        else if (pos == head) {
            prev = head = head->next;
            if (head == NULL)
                tail = NULL;
        }
        else {
            for (node* p = head; p != pos; p = p->next)
                prev = p;
 
            prev->next = pos->next;
            if (pos == tail)
                tail = prev;
            prev = prev->next;
        }
        delete pos;
        --cnt;
        return prev;
    }
 
    //удаление всех
    void clear(void) {
        node* tmp;
        while (head != NULL) {
            tmp = head;
            head = head->next;
            delete tmp;
        }
        tail = NULL;
        cnt = 0;
    }
      
    //кол-во
    size_t size(void) const { return cnt; }
    node* begin(void) const { return head; }
    node* begin(void) { return head; }
};
 
 
//студент
struct student {
    char lname[32];
    int  group;
    //...
    student(void) {}
    student(const char* s, int g) {
        strcpy_s(lname, s);
        group = g;
    }
};
 
 
int main(void) {
    setlocale(LC_ALL, "Russian");
    slist<student> lst;
    //зполняе
    lst.add_front(student("Атаджанов", 10));
    lst.add_front(student("Андреев", 30));
    lst.add_front(student("Бычков.", 20));
    lst.add_front(student("Володин", 40));
    lst.add_front(student("Минский", 20));
 
    //удалить все 20-группу
    snode<student>* p = lst.begin();
    while (p != NULL) {
        if (p->val.group == 0) {
            p = lst.erase(p);
            continue;
        }
        p = p->next;
    }
 
    //вывести
    for (snode<student>* i = lst.begin(); i != NULL; i = i->next) {
        std::cout << "фамилия: " << i->val.lname << '\t'
            << "группа № " << i->val.group << std::endl;
    }
    lst.clear();
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.09.2019, 14:35
Ответы с готовыми решениями:

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

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

На основе заданных прототипов реализовать функции-члены для пользовательского класса "Односвязный список"
Извиняюсь,забыла принт опреедлить Преподаватель дал прототипы функций ,которые надо определить для...

Односвязный список на основе массива
Нужно создать односвязный список на основе массива. Понятия не имею, как это реализовать... Как...

1
136 / 76 / 60
Регистрация: 14.09.2019
Сообщений: 218
28.09.2019, 14:55 2
Цитата Сообщение от rikovich Посмотреть сообщение
как изменить эту программу?
что нужно изменить? Убрать указатель this?
C++
1
2
3
    ~slist() {
        clear();
    }
Поведение программы не изменится
0
28.09.2019, 14:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.09.2019, 14:55
Помогаю со студенческими работами здесь

Создать односвязный список на основе вектора для работы с целыми числами
Подскажите пожалуйста как создать односвязный список на основе вектора для работы с целыми...

Придумать реализацию класса односвязный список
Помогите с заданием пожалуйста: Придумать реализацию класса односвязный список.Предусмотреть...

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

Линейный список на основе класса
Можете привести пример? Перелазил интернет, но понятного объяснения не нашёл


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru