1 Востаннє редагувалося pika1989 (24.12.2015 23:21:57)

Тема: Видалення останнього елемента з одногозв'язного списку

Задача: Створити клас Список. Клас повинен містити поля:
●    інформаційне поле – ( 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;
}

Все працює нормально, окрім видалення: після будь-якого видалення список стає пустим.
Що не так? В чому може бути проблема?

2

Re: Видалення останнього елемента з одногозв'язного списку

мені здається. проблема в цьому

delete temp;

в цьому

~List()
    {
        DeleteAll();
    }

3 Востаннє редагувалося FakiNyan (24.12.2015 23:58:50)

Re: Видалення останнього елемента з одногозв'язного списку

і в цьому

void DeleteAll()
    {
        List *p;
        p = first;
        while (p != NULL)
        {
            first = first->next;
            delete p;
            p = first;
        }
    }

p.s. ви аніме? :3

4

Re: Видалення останнього елемента з одногозв'язного списку

FakiNyan написав:

p.s. ви аніме? :3

Я не аніме - я людина)))

Логічно, що проблема з видаленням там, де є слово delete, але Ваша відповідь абсолютно не допомагає.

5

Re: Видалення останнього елемента з одногозв'язного списку

pika1989 написав:
FakiNyan написав:

p.s. ви аніме? :3

Я не аніме - я людина)))

Логічно, що проблема з видаленням там, де є слово delete, але Ваша відповідь абсолютно не допомагає.

чому не допомагає? ви не розумієте зв'язку між delete temp, і отими методами?

6

Re: Видалення останнього елемента з одногозв'язного списку

FakiNyan написав:

чому не допомагає? ви не розумієте зв'язку між delete temp, і отими методами?

Ви маєте на увазі, що delete очищує пам'ять,а потім спрацьовує деструктор? Чи про що Ви?

Подякували: FakiNyan1

7

Re: Видалення останнього елемента з одногозв'язного списку

pika1989 написав:
FakiNyan написав:

чому не допомагає? ви не розумієте зв'язку між delete temp, і отими методами?

Ви маєте на увазі, що delete очищує пам'ять,а потім спрацьовує деструктор? Чи про що Ви?

ага, а деструктор викликає DeleteAll(), котрий і видаляє всі об'єкти.

Подякували: pika19891

8

Re: Видалення останнього елемента з одногозв'язного списку

FakiNyan написав:
pika1989 написав:
FakiNyan написав:

чому не допомагає? ви не розумієте зв'язку між delete temp, і отими методами?

Ви маєте на увазі, що delete очищує пам'ять,а потім спрацьовує деструктор? Чи про що Ви?

ага, а деструктор викликає DeleteAll(), котрий і видаляє всі об'єкти.

Дякую, щось я про це не подумала. Але тоді є питання: як мені зробити правильно видалення?

9 Востаннє редагувалося pika1989 (25.12.2015 16:28:50)

Re: Видалення останнього елемента з одногозв'язного списку

Я вже зрозуміла і в мене все вийшло. Дуже Вам дякую

10

Re: Видалення останнього елемента з одногозв'язного списку

pika1989 написав:
FakiNyan написав:

p.s. ви аніме? :3

Я не аніме - я людина)))

Прихований текст

Анімешники - не люди )0)

Подякували: FakiNyan1