Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
lion_wine
8 / 8 / 2
Регистрация: 08.03.2014
Сообщений: 101
#1

Удаление элемента в списке

04.10.2014, 18:53. Просмотров 434. Ответов 4
Метки нет (Все метки)

Привет, всем снова! Помогите, пожалуйста, разобраться теперь уже с удалением элемента из линейного односвязного списка с максимальным значением ключа intKey. Вот алгоритм по поиску максимального значения среди элементов списка и 2 случая при нахождении if{}else{}. If(){} - если первый элемент имеет ключ с максимальным значением. Else{} - если не первый. Оба варианта работают, но только 1 раз. При повторном вызове программа вылетает. С чем связано, не догадываюсь, но для else есть строка "current->setNext(current->getNext()->getNext());" а что если элементов нет?и еще вопрос: Как правильно очищать эту память? delete head?
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
  class MainClass{        //класс - элемент списка
    MainClass* next;
public:
    static MainClass* current;
    static MainClass* head;
//....................................................................................................................................................
 
              current = head;
            while (!current == NULL){
                if (maxIntKey < current->getIntKey())
                    maxIntKey = current->getIntKey();
                current = current->getNext();
            }
            if (head->getIntKey() == maxIntKey){
                current = head;
                head = NULL;
                //delete head;
                if (current->getNext()!=NULL)
                    head = current->getNext();
            }
            else{
                current = head;
                while (current)
                {
                    if (current->getNext()->getIntKey() == maxIntKey){
                        //current->getNext() = NULL;
                        current->setNext(current->getNext()->getNext());
                        break;
                    }
                    current = current->getNext();
                }
            }
Добавлено через 2 часа 20 минут
Немного переделал. Все срабатывает ровно 1 раз.
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
case '4':
 
            
            current = head;
            while (current){
                if (maxIntKey < current->getIntKey()){
                    maxIntKey = current->getIntKey();
                    temp = current;
                }
                current = current->getNext();
            }   //current в итоге здесь равен NULL
            for (current = head; current->getNext() != NULL; current = current->getNext()){}
            tail = current;         //current в итоге здесь равен последнему элементу
            if (temp == head){
                current = head;
                delete head;
                head = current->getNext();
            }
            else if(temp == tail){
                for (current = head; current->getNext()->getNext() != NULL; current = current->getNext()){}
                current->setNext(NULL);
            }
            else {
                for (current = head; current->getNext() != temp; current = current->getNext()){}
                current->setNext(temp->getNext());
            }
 
            _getch();
            break;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.10.2014, 18:53
Ответы с готовыми решениями:

Удаление элемента в списке
Описать функцию, которая удаляет из списка все вхождения элемента Е, значение...

Удаление элемента в списке
Необходимо реализовать метод удаления элемента из списка не после определённого...

Добавление и удаление элемента в списке
Ребят сделал код создания элементов списка, но не могу написать 1) код...

В программе не работает 1)удаление элемента, последнего в списке-зависает и
В программе не работает 1)удаление элемента, последнего в списке-зависает и...

Как можно сместить ID в односвязном списке после удаление элемента
народ можете подсказать как можно сместить айди в односвязном списке послу...

4
Paho
15 / 15 / 5
Регистрация: 04.10.2014
Сообщений: 124
04.10.2014, 19:47 #2
вылетает или зависает потому что в циклах нет ожидания (wait)
удалять переменные можно
C++
1
2
3
delete(); 
///или 
destroy();
0
lion_wine
8 / 8 / 2
Регистрация: 08.03.2014
Сообщений: 101
05.10.2014, 15:40  [ТС] #3
не совсем понял, что именно делать

Добавлено через 19 часов 28 минут
Хелп!
0
Paho
15 / 15 / 5
Регистрация: 04.10.2014
Сообщений: 124
05.10.2014, 21:58 #4
Попробуй убрать в конце case: break; (29 строчка) - это делается чтоб действие не ходило по кругу, убери соответственно
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
case '4':
current = head;
while (current)
{
if (maxIntKey < current->getIntKey())
{
maxIntKey = current->getIntKey();
temp = current;
}
current = current->getNext();
wait 0.1;
}   //current в итоге здесь равен NULL
for (current = head; current->getNext() != NULL; current = current->getNext())
{
wait 0.1;
}
tail = current;         //current в итоге здесь равен последнему элементу
if (temp == head)
{
current = head;
delete head;
head = current->getNext();
}
else if(temp == tail)
{
for (current = head; current->getNext()->getNext() != NULL; current = current->getNext())
{
wait 0.1;
}
current->setNext(NULL);
}
else 
{
for (current = head; current->getNext() != temp; current = current->getNext())
{
wait 0.1;
}
current->setNext(temp->getNext());
}
_getch();
0
lion_wine
8 / 8 / 2
Регистрация: 08.03.2014
Сообщений: 101
06.10.2014, 19:53  [ТС] #5
нет не помогло...delete вообще не работает. как правильно удалять неиспользуемые элементы списка

Добавлено через 48 минут
т.е. все работает в т.ч. delete но строго 1 раз

Добавлено через 2 минуты
в c++ нет wait
0
06.10.2014, 19:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.10.2014, 19:53

Вставка элемента в заданную позицию, удаление элемента по заданной позиции, поиск заданного элемента
Добавить в класс &quot;Односвязный список&quot; следующие функции: вставка элемента в...

Удаление в списке
Реализован метод удаления после какого-то элемента в спике: void remove(Node...

Описать класс «множество» (добавление и удаление элемента, пересечение, объединение и удаление множеств )
Описать класс «множество», позволяющий выполнять основные операции – добавление...


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

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

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