Вопрос задан 21.07.2023 в 02:37. Предмет Информатика. Спрашивает Ходоренко София.

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

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

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

Внимание! Ответы на вопросы дают живые люди. Они могут содержать ошибочную информацию, заблуждения, а также ответы могут быть сгенерированы нейросетями. Будьте внимательны. Если вы уверены, что ответ неверный, нажмите кнопку "Пожаловаться" под ответом.
Отвечает Бражкин Женя.

Я так полагаю имеется ввиду базовое понятие списка?

Если так - тогда я сделал классический список с узлами с указателями на следующий элемент.

Простите за за малое кол-во комментариев, у меня не так уж и много времени, поэтому я комментировал самое основное.

Мой вариант решения:

#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();

}

0 0
Отвечает нейросеть ChatGpt. Будьте внимательны, ответы нейросети могут содержать ошибочные или выдуманные данные.

Конечно, помогу! Вот пример реализации базового класса "список" и класса "упорядоченный список" на языке 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, чтобы элементы добавлялись в упорядоченном порядке.

0 0

Похожие вопросы

Топ вопросов за вчера в категории Информатика

Последние заданные вопросы в категории Информатика

Задать вопрос