Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 25.03.2016
Сообщений: 48
1

Удаление элемента из односвязного списка

09.03.2018, 18:43. Показов 2211. Ответов 4
Метки нет (Все метки)

Здравствуйте. Делаю односвязный список. Добавил методы Add и Print, но вот метод Delete вылетает.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
struct element                                  
{
    int index;
    int value;
    element *prev=NULL;
};
 
struct MyList
{
    int count = 0;
    element *last=NULL;                                                     
    MyList()
    {
        std::cout << "List LIFO.\n";
    }
    void Add(int a)
    {
        element *temp = new element;                        //create new element with link to it.
        temp->value = a;                                    //write value to this element.
        temp->index = count;                                //this element have index count-1.
        if (count == 0)
        {
            temp->prev = NULL;                              //if it's first element then there is no prev element.
        }
        else
        {
            temp->prev = last;                              //if it's not first element then prev element from this is take link to last.
        }
        last = temp;                                        //last element is temp (now added element).
        count += 1;
    }
    void Print()
    {
        element *temp = last;                               //we create *temp to not lose our massive.
        int *massive = new int[count];
        int k = 0;
        while (temp != NULL)
        {
            massive[k] = temp->value;
            temp = temp->prev;
            k += 1;
        }
        std::cout << "| ";
        for (int i = count-1; i >= 0; i--)
        {
            std::cout << massive[i] << " | ";
        }
        delete temp;
        delete[] massive;
        std::cout << std::endl;
    }
    void Delete(int pos)
    {
        if (pos == count - 1)                                       //we want to delete last element.
        {
            element *temp = last;
            last = last->prev;
            delete temp;
            count -= 1;
        }
        else if (pos == 0)                                          //we want to delete first element.
        {
            element *temp = last;
            element *del = last;
            while (temp->index != 1)
            {
                temp = temp->prev;
            }
            del = temp->prev;
            temp->prev = NULL;
            delete del;
            count -= 1;
            temp = last;
            for (int i = count-1; i >=0; i--)                           //rewrite all indexes.
            {
                temp->index = i;
                temp = temp->prev;
            }
        }
        else
        {
            element *after_del = last;                                  //value on one node to the right from node that we want to delete.
            element *before_del = NULL;                                 //value on one node to the left from node that we want to delete.
            while (after_del->index != pos + 1)
            {
                after_del = after_del->prev;
            }
            before_del = after_del->prev;                               //now we are on node that we want to delete.
            before_del = before_del->prev;
            after_del->prev = before_del;
            after_del = after_del->prev;                                //now we are on node that we want to delete.
            //delete after_del;                                     //pass this node back to OS, we don't need it anymore.
            count -= 1;
            element *temp = last;
            for (int i = count - 1; i >= 0; i--)                            //rewrite all indexes.
            {
                temp->index = i;
                temp = temp->prev;
            }
        }
    }
    ~MyList()
    {
        element *temp = NULL;
        while (last != NULL)
        {
            temp = last->prev;
            delete last;
            last = temp;
        }
    }
};
Код выше - это заголовочный файл, который я подключаю в основной файл кода.
Вот основной код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "stdafx.h"
#include <iostream>
#include "MyList.h"
 
int main()
{
    MyList massive;
    massive.Add(1);
    massive.Add(2);
    massive.Add(3);
    massive.Print();
    massive.Delete(1);
    massive.Print();
    system("pause");
    return 0;
}
Так вот. Если я удаляю первый или последний элемент в массиве, то все хорошо работает, но если я удаляю элемент не первый или не последний, то может произойти вылет. Почему может? Сейчас объясню. Весь код выше (абсолютно весь) работает хорошо. Но, как вы могли заметить я закоментировал строку //delete after_del; ибо если включить эту строку то вылетает ошибка. Если не включать - то все работает хорошо. Эта строка (по моему мышлению) возвращает место в памяти, которое занято удаляемым объектом, в ОС потому, что эта память нам больше не нужна, но судя по всему я что-то недопонимаю. Что не так? Прошу, помогите.

P.S. Только познакомился с односвязным списком и то, как начать писать такой список подсмотрел в интернете, а в основном все написал сам. Комментарии, кстати, я всегда пишу на английском.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.03.2018, 18:43
Ответы с готовыми решениями:

Удаление элемента из односвязного списка
Здравствуйте, мне надо, чтобы элементы у которых средний балл был ниже были удалены в односвязном...

Удаление элемента из односвязного списка
Ребят, что я не так делаю? Элемент не удаляется, а заменяется на число 26. Вот код: #include...

Удаление элемента односвязного списка
Здравствуйте. Написал вот такой код. В программе происходит создание списка, вывод его на экран, а...

Удаление первого элемента односвязного списка
Здравствуйте!Написана программа для работы с односвязным списком,все хорошо,но нет удаление первого...

4
2228 / 1731 / 865
Регистрация: 21.12.2010
Сообщений: 3,074
Записей в блоге: 11
10.03.2018, 10:55 2
Лучший ответ Сообщение было отмечено Flone как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
else
        {
            element *after_del = last;                                  //value on one node to the right from node that we want to delete.
            element *del = NULL;                                 //value on one node to the left from node that we want to delete.
            while (after_del->index != pos + 1)
            {
                after_del = after_del->prev;
            }
            del = after_del->prev;                               //now we are on node that we want to delete.
            after_del->prev = del->prev;
            delete del;         
            del = NULL;
            --count;
            element *temp = last;
            for (int i = count - 1; i >= 0; i--)                            //rewrite all indexes.
            {
                temp->index = i;
                temp = temp->prev;
            }
        }
Добавлено через 4 минуты
проблема здесь, ты удаляешь узел before_del. Нашел отладчиком VS.
C++
1
2
3
after_del->prev = before_del;
after_del = after_del->prev;                                
delete after_del;
0
0 / 0 / 0
Регистрация: 25.03.2016
Сообщений: 48
10.03.2018, 11:03  [ТС] 3
Цитата Сообщение от igorrr37 Посмотреть сообщение
проблема здесь, ты удаляешь узел before_del. Нашел отладчиком VS.
Да, да, уже сам увидел, хех. Но все же спасибо.
А как вы отладчиком так нашли? Я вручную искал на пальцах.
0
2228 / 1731 / 865
Регистрация: 21.12.2010
Сообщений: 3,074
Записей в блоге: 11
10.03.2018, 11:29 4
Ставишь брейкпоинт на строку delete after_del; и когда брейкпоинт сработает наводишь курсор и смотришь что у after_del value равно 1 а должно быть 2
Миниатюры
Удаление элемента из односвязного списка  
1
0 / 0 / 0
Регистрация: 25.03.2016
Сообщений: 48
10.03.2018, 12:35  [ТС] 5
Цитата Сообщение от igorrr37 Посмотреть сообщение
Ставишь брейкпоинт
спасибо!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.03.2018, 12:35

Удаление последнего элемента односвязного списка
как сделать в списке pop_back и полное очищение? struct Node { int value; Node* next;...

Удаление первого элемента односвязного списка
не могу понять как удалить первый элемент в односвязном списке. #include &lt;iostream&gt; using...

Удаление из односвязного списка заданного элемента
Структура содержит название, цену, количество товара. Удалить из списка заданный товар.

Удаление элемента односвязного списка бинарного файла
Добрый вечер! Я имею двоичный файл с односвязным списком. У меня реализованf функция добавления...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.