0 / 0 / 0
Регистрация: 12.03.2020
Сообщений: 15
1

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

14.05.2020, 19:23. Показов 338. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
При удалении элемента по индексу(deleteindex), если элемент находится во второй половине списке, то есть поиск с конца, выводит мусор вместо последнего элемента и программа завершает свою работу

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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
using namespace std;
template <typename p>
class DoubleList:public List <p>
{
public:
    DoubleList ();
    ~DoubleList ();
    int getsize() { return size; }
 
    void clear();
    void enterelement(p data);
    void add();
    void OutList();
 
    void index(p data, int index);
    void deleteindex(int index);
 
    p& operator[] (const int index);
 
private:
    template <typename p>
    class Node
    {
    public:
        Node(p data = p(), Node* pNext = nullptr, Node* pPrev = nullptr)
        {
            this->data = data;
            this->pNext = pNext;
            this->pPrev = pPrev;
        }
        p data;
        Node* pNext;
        Node* pPrev;
    };
 
    Node <p>* head;
    Node <p>* tail;
    int size;
};
 
 
template<typename p>
inline DoubleList<p>::DoubleList()
{
    this->size = 0;
    head = nullptr;
    tail = nullptr;
}
 
template <typename p> DoubleList <p>::~DoubleList()
{
    clear();
}
 
 
template<typename p>
inline void DoubleList<p>::clear()
{
    while (size)
    {
        Node <p>* temp = head;
        head = head->pNext;
        delete temp;
        size--;
    }
}
 
template <typename p>
void DoubleList <p>::enterelement(p data)
{
 
    head = tail = new Node <p>(data, head, tail);
    size++;
}
 
template<typename p>
inline void DoubleList<p>::add()
{
    int n;
    cout << "number of items" << endl;
    cin >> n;
    cout << "*************" << endl;
    p a;
    for (int i = 0; i < n; i++)
    {
        cin >> a;
        cout << "-----------" << endl;
        this->enterelement(a);
    }
}
template<typename p>
inline void DoubleList<p>::OutList()
{
    Node <p>* print = head;
    while (print)
    {
        cout <<"   "<< print->data;
        print = print->pNext;
    }
    cout << endl;
}
 
template<typename p>
inline void DoubleList<p>::index(p data, int index)
{
    if (index == 0)
    {
        this->enterelement(data);
    }
    else if (index <= size / 2)                                                                                   
    {
    Node <p>* previous = this->head;
    for (int i = 0; i < index - 1; i++)
    {
        previous = previous->pNext;
    }
 
    Node<p>* newNode = new Node<p>(data, previous->pNext, previous);
 
    previous->pNext = newNode;
    Node<p>* next = newNode->pNext;
    next->pPrev = newNode;
    size++;
    }
 
    else if (index > size / 2)
    {
    Node<p>* next = this->tail;
    for (int i = size - 1; index < i; i--)
    {
        next = next->pPrev;
    }
    Node<p>* newNode = new Node<p>(data, next->pNext, next);
    next->pPrev = newNode;
    Node<p>* previous = newNode->pPrev;
    previous->pNext = newNode;
    size++;
    }
}
 
template<typename p>
inline void DoubleList<p>::deleteindex(int index)
{
    if (index <= this->size / 2)
    {
        Node<p>* next = this->tail;
        for (int i = size - 1; index < i; i--)
        {
            next = next->pPrev;
        }
 
        Node<p>* toDelete = next->pPrev;
        next->pPrev = toDelete->pPrev;
        Node<p>* previous = toDelete->pPrev;
        delete toDelete;
        previous->pNext = next;
 
        size--;
    }
 
    else if (index >this-> size / 2)
    {
        Node<p>* previous = this->head;
        for (int i = 0; i < index - 1; i++)
        {
            previous = previous->pNext;
        }
 
        Node<p>* toDelete = previous->pNext;
        previous->pNext = toDelete->pNext;
        Node<p>* next = toDelete->pNext;
        delete toDelete;
        next->pPrev = previous;
 
        size--;
    }
}
 
template<typename p>
inline p& DoubleList<p>::operator[](const int index)
{
    if (index <= size / 2)
    {
        int iter = 0;
        Node<p>* current = this->head;
 
        while (current != nullptr)
        {
            if (iter == index)
                return current->data;
            current = current->pNext;
            iter++;
        }
    }
    else
    {
        int iter = size - 1;
        Node<p>* current = this->tail;
 
        while (current != nullptr)
        {
            if (iter == index) return current->data;
            current = current->pPrev;
            iter--;
        }
    }
    }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.05.2020, 19:23
Ответы с готовыми решениями:

Удаление элемента из двусвязного списка
Надо удалить элемент из двусвязного списка, если выполняется условие (2013-(current-&gt;god)&lt;3). Я...

Удаление элемента из двусвязного списка
Доброго всем времени суток. Нужна помощь. Есть двусвязный список. Функции передаем какое то...

Удаление элемента из двусвязного списка
Помогите пожалуйста найти где я ошибся. Элементы в список добавляются, вывод на экран тоже...

Удаление элемента из двусвязного списка
Собственно, в коде все рабочее, кроме удаления. После ввода элемента выдает ошибку 0xC0000005....

3
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
14.05.2020, 19:53 2
Цитата Сообщение от MAKAR555 Посмотреть сообщение
При удалении элемента по индексу(deleteindex), если элемент находится во второй половине списке, то есть поиск с конца, выводит мусор вместо последнего элемента и программа завершает свою работу
В двусвязном списке можно удалять элемент по указателю на него, а не на следующий/предыдущий
Разбей свой метод на два
C++
1
2
Node *find_by_index(int idx);
void remove(Node *node);
Тогда
C++
1
2
3
4
5
6
7
template<typename p>
void DoubleList<p>::deleteindex(int index)
{
    Node *node = find_by_index(index);
    if (node)
        remove_node(node);
}
0
0 / 0 / 0
Регистрация: 12.03.2020
Сообщений: 15
14.05.2020, 20:16  [ТС] 3
oleg-m1973, а если удалять не по указателю на него, как можно исправить проблему, возникающую при удалении элемента с хвоста?
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
14.05.2020, 20:19 4
Цитата Сообщение от MAKAR555 Посмотреть сообщение
oleg-m1973, а если удалять не по указателю на него, как можно исправить проблему, возникающую при удалении элемента с хвоста?
Можно было её не создавать. Сделай как я сказал и проблема исправится сама-собой (и она у тебя там не единственная)
0
14.05.2020, 20:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.05.2020, 20:19
Помогаю со студенческими работами здесь

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

Удаление первого и последнего элемента двусвязного списка с++
Удаление первого и последнего элемента двусвязного списка с++ namespace vlados { ...

"Сортировка двусвязного списка путем исключения элемента с минимальным значением и включения его в начало нового списка
Здравствуйте! Возникла проблема с программой. Тема: &quot;Сортировка двусвязного списка путем исключения...

Удаление из двусвязного циклического списка
Начал реализовывать структуру данных - Фибоначчиевы кучи. Столкнулся с проблемой при написании...

Удаление структуры из двусвязного списка
Доброго времени суток! Пытаюсь создать функцию удаления из списка структуры, не выполняется цикл...

Добавление и удаление элементов из двусвязного списка
Разбираю списки. Посмотрите код правильно ли я все понимаю?))) путаюсь с указателями. может можно...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru