19 / 16 / 10
Регистрация: 07.11.2015
Сообщений: 136
|
||||||
1 | ||||||
Удалить из списка все элементы, большие среднего арифметического04.02.2016, 20:03. Показов 4412. Ответов 10
Метки нет (Все метки)
Здравствуйте.
Задача такая:Написать программу по созданию, просмотру, добавлению и решению поставленной задачи для двунаправленного линейного списка. Создать список из случайных целых чисел. Удалить из списка все элементы, большие среднего арифметического. Как работать со структурой такого типа я похоже понял, написал алгоритм, функции по созданию, удалению. Теперь суть проблемы: при построении решения ошибок не выдает. В процессе выполнения пункта меню 4 (Удалить из списка все элементы, большие среднего арифметического.) выбрасывает и выдает ошибку: Unhandled exception at 0x01321c54 in Alexey.exe: 0xC0000005: Access violation reading location 0x00000008. Я написал цикл вайлом (те while(t!=NULL)). Как я понимаю как только мой указатель выйдет за список, он укажет в NULL. Соответственно это будет последняя итерация и больше в вайл не войдет. При пошаговой отладке видно, что он проходит 11 раз (я сделал 11 псевдорандомных элементов). Удаляет все элементы, которые больше среднего арифметического и на 11 итерации естественно t уже смотрит в NULL (t=t->Next). Это видно и в окне переменных. Но на 12 итерацию происходит попадание в вайл, уже удалять нечего, т.к. все уже удалено, и по тексту следует t=t->Next;. Которое уже итак смотрит в никуда и тут компилятор выдает ошибку. Надеюсь, моя проблема ясна. Прошу помощи у знающих - что я делаю не так. Так же может быть по остальному тексту что-то режет глаз, тк я новичок. MS VS2010. Код ниже. Спасибо. Кликните здесь для просмотра всего текста
0
|
04.02.2016, 20:03 | |
Ответы с готовыми решениями:
10
Функция обнуляющая все элементы массива большие среднего арифметического Все элементы таблицы, меньшие среднего арифметического ее значений, заменить на -1, большие - на 1 Все элементы, большие среднего арифметического положительных чисел, заменить на первое положительное значение массива Удалить из массива все элементы, меньшие по значению среднего арифметического |
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
|
||||||
05.02.2016, 10:24 | 2 | |||||
Сообщение было отмечено Памирыч как решение
Решение
оформляйте нормально - так читать легче
0
|
zer0mail
|
05.02.2016, 10:27
#3
|
Не по теме: Я считаю так: если некто просит помощи и при этом не способен нормально отформатировать код, то этому некту помогать не стоит. :(
0
|
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
|
|
05.02.2016, 10:28 | 4 |
в какой строке?
сумбурно как-то все написано, имхо трудночитабельно (есть же стандартные приемы работы с памятью, файлами, списками и глаз уже такие конструкции сразу видит, а у вас сложнее), поэтому даже с отладчиком сами понять не можете что у вас происходит
0
|
19 / 16 / 10
Регистрация: 07.11.2015
Сообщений: 136
|
|
05.02.2016, 10:43 [ТС] | 5 |
SergioO, функция по решению задачи начинается со строки 139.
while(t!=NULL) который выполняет 12-тую операцию вместо существующих 11 начинается со строки 154. 190 строка - самая последняя в цикле - передвигает указатель на следующий Next Off: код вставил именно так, т.к. это мое первое сообщение на форуме. Исправлюсь. Применил стандартный прием работы со списком из учебника, и даже с отладчиком не понимаю что у меня происходит, по этому и обратился на форум за помощью.
0
|
05.02.2016, 10:44 | 6 |
Вот что вам следует сделать:
1) отказаться от вложенных циклов, а сделать один 2) если при итерировании списка, вы нашли элемент, который нужно удалить, вы его удаляете, НО итератор списка должен после этого получить значение элемента, который оказался на месте УДАЛЕННОГО элемента. А если элемент удалять не надо, то итератор отправляйте в следующий. Если аккуратно все сделаете, то должно работать, если других косяков нет.
1
|
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
|
||||||
05.02.2016, 16:17 | 7 | |||||
Logovas, из книги пример говорите?
сначала я не мог main найти, потом его, мэйна конец. читайте по Си Кэрниган, Ритчи "Язык программирования Си" 3-е издание вы ж в Visual Studio работаете? сделайте так
0
|
05.02.2016, 16:19 | 8 |
SergioO, в си нет исключений
0
|
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
|
|
05.02.2016, 16:26 | 9 |
есть лекция в на ютубе типа основы С++ 1 семестр, лекция то ли 10 или 11, там списки делают. лекции так себе, но на раз пойдет.
Р.Сэджвик "Фундаментальные алгоритмы на Си" том 1-4, стр 92 -109 тоже доступно про списки (базовые понятия) в С++ есть в STL <list> или list.cpp для работы со списками можете туда заглянуть, но, если вы вообще понимаете о чем я. Добавлено через 2 минуты HighPredator, лоб не расшибите, пожалуйста, хоть он у вас и защищен
0
|
05.02.2016, 16:32 | 10 |
Человек в простом списке засыпался, а вы предлагаете ему исключения пообрабатывать? Омг.
1
|
19 / 16 / 10
Регистрация: 07.11.2015
Сообщений: 136
|
||||||
06.02.2016, 20:38 [ТС] | 11 | |||||
HighPredator, удалил вложенный цикл, немножко подправил. Все заработало. Спасибо помощь.
Кликните здесь для просмотра всего текста
0
|
06.02.2016, 20:38 | |
06.02.2016, 20:38 | |
Помогаю со студенческими работами здесь
11
Удалить из нее все элементы, значение которых больше среднего арифметического Удалить элементы, большие среднего арифметического в массиве Найти элементы большие среднего арифметического и удалить их из множества Из файла вещественных чисел удалить элементы, большие среднего арифметического Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |