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

0 голосов
38 просмотров

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


Информатика (16 баллов) | 38 просмотров
Дан 1 ответ
0 голосов

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

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

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

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

#include

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

 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

}

};

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

}

(1.5k баллов)