Тема: Видалення останнього елемента з одногозв'язного списку
Задача: Створити клас Список. Клас повинен містити поля:
● інформаційне поле – ( int data );
● Вказівник на наступний елемент списку;
● Вказівник на перший елемент списку – static
І методи:
● додавання елемента(вкінець, на певну позицію, перед певним елементом та після певного елемента);
● видалення(останній, по-значенню, за позицією)
Та реалізувати ще деякі методи(пошук, перевірка чи порожній список)
Ось те, що я зробила:
▼Прихований текст
#include <iostream>
#include <conio.h>
using namespace std;
class List
{
int data;
List *next;
static List *first;
public:
List(int number_elements = 0)
{
if (number_elements > 0)
{
first = new List;
cout << "Enter value: ";
cin >> first->data;
first->next = NULL;
number_elements--;
if (number_elements > 0)
{
List *element = new List;
cout << "Enter value: ";
cin >> element->data;
element->next = NULL;
first->next = element;
number_elements--;
List *p = first->next;
while (number_elements > 0)
{
List *element = new List;
cout << "Enter value: ";
cin >> element->data;
element->next = NULL;
p->next = element;
p = p->next;
number_elements--;
}
}
}
else
{
data = 0;
next = NULL;
}
}
void Show()
{
List *p = first;
cout << "\n\nList: ";
while (p != NULL)
{
cout << p->data << " ";
p = p->next;
}
cout << "\n";
}
void Add(int add_elem)
{
if (first == NULL)
{
first = new List;
first->next = NULL;
first->data = add_elem;
}
else
{
List *p = first;
while (p->next != NULL)
p = p->next;
List *element = new List;
element->data = add_elem;
element->next = NULL;
p->next = element;
}
}
void AddAfter(int add_elem, int value)
{
List *p = first;
while (p != NULL && p->data != value)
p = p->next;
if (p != NULL)
{
List *element = new List;
element->next = p->next;
element->data = add_elem;
p->next = element;
}
}
void AddBefore(int add_elem, int value)
{
if (first != NULL)
{
if (first->data == value)
{
List *element = new List;
element->data = add_elem;
element->next = first;
first = element;
}
else
{
List *p = first;
while (p->next != NULL && p->next->data != value)
p = p->next;
if (p->next != NULL)
{
List *element = new List;
element->data = add_elem;
element->next = p->next;
p->next = element;
}
}
}
}
void AddByPos(int add_elem, int pos)
{
if (pos >= 0)
{
if (pos == 0)
{
List *element = new List;
element->data = add_elem;
element->next = first;
first = element;
}
else
{
int counter = 0;
List *p = first;
while (counter < pos - 1 && p != NULL)
{
p = p->next;
counter++;
}
if (p != NULL)
{
List *element = new List;
element->data = add_elem;
element->next = p->next;
p->next = element;
}
}
}
}
void DeleteElement()
{
List *p = first;
while (p->next->next != NULL)
p = p->next;
if (p->next->next == NULL)
{
List *temp = p->next;
p->next = NULL;
delete temp;
}
}
void DeleteByValue(int value)
{
if (first != NULL)
{
if (first->data == value)
{
List *el = first;
first = first->next;
delete el;
}
else
{
List *p = first;
while (p->next != NULL && p->next->data != value)
p = p->next;
if (p->next != NULL)
{
List *element = p->next;
p->next = p->next->next;
delete element;
}
}
}
}
void DeleteByPos(int pos)
{
if (first != NULL)
{
if (pos == 0)
{
List *element = first;
first = first->next;
delete element;
}
else if (pos > 0)
{
int count = 0;
List *p = first;
while (count < (pos - 1) && p->next != NULL)
{
p = p->next;
count++;
}
if (p->next != NULL)
{
List *element = p->next;
p->next = p->next->next;
delete element;
}
}
}
}
int FindEl(int find_elem)
{
List *p = first;
int count = 1;
while (p != NULL&&p->data != find_elem)
{
p = p->next;
count++;
}
if (p != NULL)
{
return count;
}
else
{
return -1;
}
}
int FindPos(int pos)
{
List *p = first;
int counter = 1;
if (p != NULL && pos == 1)
{
return first->data;
}
else
{
while (p != NULL && counter != pos)
{
p = p->next;
counter++;
}
if (counter == pos)
{
return p->data;
}
}
return -1;
}
void DeleteAll()
{
List *p;
p = first;
while (p != NULL)
{
first = first->next;
delete p;
p = first;
}
}
bool EmptyList()
{
if (first != NULL)
return false;
else
return true;
}
~List()
{
DeleteAll();
}
};
List *List::first = NULL;
int main()
{
int number_elements;
cout << "Enter the number of elements in the list: ";
cin >> number_elements;
List list(number_elements);
system("cls");
list.Show();
cout << "\n\tAdd element:\n";
list.Add(100);
list.Show();
cout << "\nAdd by position:\n";
list.AddByPos(200, 3);
list.Show();
cout << "\nAdd after:\n";
list.AddAfter(50, 2);
list.Show();
cout << "\nAdd befor:\n";
list.AddBefore(30, 1);
list.Show();
_getch();
system("cls");
list.Show();
cout << "\n\tFind\n";
cout << "\n\nPos of " << 3 << " is " << list.FindEl(3) << "\n";
cout << "\n\nIn pos " << 3 << " is " << list.FindPos(3) << "\n";
_getch();
system("cls");
list.Show();
cout << "\n\tDelete\n";
cout << "\nDelete last item:\n";
list.DeleteElement();
cout << "List is empty: "<< boolalpha << list.EmptyList() << "\n";
list.Show();
cout << "\nDelete by position:\n";
list.DeleteByPos(1);
cout << "List is empty: " << boolalpha << list.EmptyList() << "\n";
list.Show();
cout << "\nDelete by value:\n";
list.DeleteByValue(3);
cout << "List is empty: " << boolalpha << list.EmptyList() << "\n";
list.Show();
return 0;
}
Все працює нормально, окрім видалення: після будь-якого видалення список стає пустим.
Що не так? В чому може бути проблема?