
Помогите пожалуйста! На языке С++ Создать базовый класс «список», определив в нем функции
добавления в начало списка, удаления N-го элемента списка, вывода элементов списка на экран. Породить от него класс «упорядоченный список», переопределив функцию добавления элемента списка.

Ответы на вопрос

Я так полагаю имеется ввиду базовое понятие списка?
Если так - тогда я сделал классический список с узлами с указателями на следующий элемент.
Простите за за малое кол-во комментариев, у меня не так уж и много времени, поэтому я комментировал самое основное.
Мой вариант решения:
#include <iostream>
using namespace std;
//узел со значением и ссылкой на следующий элемент
struct node
{
int value;
node* nextElement;
};
class list
{
protected:
//указатель на первый элемент в списке
node* first;
//кол-во элементов в списке
int count;
public:
list()
{
count = 0;
first = NULL;
}
//чистим после себя память
~list()
{
node* temp;
while (first != NULL)
{
temp = first;
first = first->nextElement;
delete temp;
}
}
virtual void addElement(int value)
{
if (count == 0)
{
node* parent = new node;
parent->value = value;
parent->nextElement = NULL;
first = parent;
count++;
}
else
{
node* newNode = new node;
newNode->value = value;
newNode->nextElement = first;
first = newNode;
count++;
}
}
int del(int N)
{
if (N < 1 || N > count)
{
cout << "\nError.";
return NULL;
}
else
{
//этот указатель будет ссылаться на узел, который нам нужно удалить
node* target;
int returnValue;
if (N == 1)
{
target = first;
returnValue = target->value;
first = first->nextElement;
delete target;
}
else
{
target = first;
//указатель предыдущего узла, чтобы при удалении связать список заново
node* prev = first;
for (int i = 1; i < N; ++i)
{
prev = target;
target = target->nextElement;
}
prev->nextElement = target->nextElement;
returnValue = target->value;
delete target;
}
return returnValue;
}
}
void print()
{
node *temp = first;
while (temp != NULL)
{
cout << temp->value << " ";
temp = temp->nextElement;
}
cout << endl;
}
};
class OrderList : public list
{
private:
//указатель на последний элемент в списке
node* last;
public:
OrderList() : list()
{
last = NULL;
}
//чистим после себя память
~OrderList()
{
node* temp;
while (first != NULL)
{
temp = first;
first = first->nextElement;
delete temp;
}
}
virtual void addElement(int value)
{
if (count == 0)
{
node* parent = new node;
parent->value = value;
parent->nextElement = NULL;
first = parent;
last = parent;
count++;
}
else
{
node* newNode = new node;
newNode->value = value;
last->nextElement = newNode;
newNode->nextElement = NULL;
last = newNode;
count++;
}
}
};
int main()
{
//тестируем класс упорядоченного списка
OrderList a;
a.addElement(12);
a.addElement(228);
a.addElement(1337);
a.print();
a.del(2);
a.print();
//тестируем класс списка
list b;
b.addElement(12);
b.addElement(228);
b.addElement(1337);
b.print();
b.del(1);
b.print();
cin.get();
cin.get();
}



Конечно, помогу! Вот пример реализации базового класса "список" и класса "упорядоченный список" на языке C++:
cpp#include <iostream>
// Базовый класс "список"
class List {
protected:
struct Node {
int data;
Node* next;
Node(int value) : data(value), next(nullptr) {}
};
Node* head;
public:
List() : head(nullptr) {}
virtual ~List() {
while (head != nullptr) {
Node* temp = head;
head = head->next;
delete temp;
}
}
void addElement(int value) {
Node* newNode = new Node(value);
newNode->next = head;
head = newNode;
}
bool deleteElement(int n) {
if (n <= 0 || head == nullptr) {
return false;
}
if (n == 1) {
Node* temp = head;
head = head->next;
delete temp;
return true;
}
Node* prev = head;
Node* curr = head->next;
int count = 2;
while (curr != nullptr) {
if (count == n) {
prev->next = curr->next;
delete curr;
return true;
}
prev = curr;
curr = curr->next;
count++;
}
return false;
}
void display() const {
Node* temp = head;
while (temp != nullptr) {
std::cout << temp->data << " ";
temp = temp->next;
}
std::cout << std::endl;
}
};
// Класс "упорядоченный список"
class OrderedLIst : public List {
public:
void addElement(int value) override {
Node* newNode = new Node(value);
if (head == nullptr || value <= head->data) {
newNode->next = head;
head = newNode;
return;
}
Node* temp = head;
while (temp->next != nullptr && temp->next->data < value) {
temp = temp->next;
}
newNode->next = temp->next;
temp->next = newNode;
}
};
int main() {
// Пример использования
List list;
list.addElement(3);
list.addElement(5);
list.addElement(1);
list.display(); // Ожидаемый вывод: 1 5 3
list.deleteElement(2);
list.display(); // Ожидаемый вывод: 1 3
OrderedLIst orderedList;
orderedList.addElement(3);
orderedList.addElement(5);
orderedList.addElement(1);
orderedList.display(); // Ожидаемый вывод: 1 3 5
return 0;
}
В этом примере базовый класс "список" содержит функции добавления в начало списка (addElement
), удаления N-го элемента списка (deleteElement
) и вывода элементов списка на экран (display
). Класс "упорядоченный список" наследуется от базового класса и переопределяет функцию addElement
, чтобы элементы добавлялись в упорядоченном порядке.


Похожие вопросы
Топ вопросов за вчера в категории Информатика
Последние заданные вопросы в категории Информатика
-
Математика
-
Литература
-
Алгебра
-
Русский язык
-
Геометрия
-
Английский язык
-
Химия
-
Физика
-
Биология
-
Другие предметы
-
История
-
Обществознание
-
Окружающий мир
-
География
-
Українська мова
-
Информатика
-
Українська література
-
Қазақ тiлi
-
Экономика
-
Музыка
-
Право
-
Беларуская мова
-
Французский язык
-
Немецкий язык
-
МХК
-
ОБЖ
-
Психология
-
Физкультура и спорт
-
Астрономия
-
Кыргыз тили
-
Оʻzbek tili