| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Центр помощи > [Delphi] Работа со сложными структурами данных |
| Автор: SniyLSD 28.5.2008, 17:54 |
| Всем привет! У меня есть небольшая просьба о помощи по теме динамические структуры данных, Есть задача : Элементы двунаправленного списка имеют следующую структуру: - Шифр детали - Наименование - Цена - Вес - Указатель предыдущего - Указатель последующего Удалить элемент с заданным номером от конца списка. Проблема вот в чем, я написал программу, Работает, но частично, она может добавлять данные в дин.список, может выводить их в таблицу, но не работает удаление нужного элемента списка, мало того, программа просто виснет во время нажатия на кнопку удаления эл. пожалуйста, помогите, посмотрите скрипт расскажите в чем проблема, и, если не трудно, поправьте скрипт чтоб он работал, плиз Скрипт прилагается(Делфи 7): |
| Автор: anwe 28.5.2008, 22:45 | ||
| Тебе надо все последующие номера сместить на 1 влево: на место 2-го пойдет 3, на место 3-го пойдет 4 и т. д. А потом у смещенных уменьшить номера на единицу. А в коде, не разбираясь с записями, видна сразу явная ошибка:
|
| Автор: SniyLSD 29.5.2008, 05:58 | ||||
Понятно вроде, но слишком замудрился я с ней
Так, вроде чуть поправил:
Теперь не виснет, но выдает ошибку типа "Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 0045F58E in module 'Project1.exe'. Read of address 00000054'. Process stopped. Use step or Run to continue." Ошибку обращения к памяти. [quote]Тебе надо все последующие номера сместить на 1 влево: на место 2-го пойдет 3, на место 3-го пойдет 4 и т. д. А потом у смещенных уменьшить номера на единицу.[quote] эммм... не понял, эти номера на счет чего? если честно, я этот код списал из программы аналогичной задачи, но там было другое условие - Удалить повторяющиеся элементы списка, если в них совпадает шифр и наименование. Сам в нем плохо разобрался. Можете мне помочь написать этот кусок кода правильно? Чтоб работал)) |
| Автор: SniyLSD 29.5.2008, 08:06 | ||
Понятно вроде, но слишком замудрился я с ней :crazy - тему "Дин. списки " я плохо понял :dash1
Так, вроде чуть поп |
| Автор: anwe 29.5.2008, 13:38 | ||
Это одно а незнание элементарных операторв - это другое. Почитай про while..do. Для выхода условие должно менятся внутри цикла. То что добавлено, ничего не дает. Для этого оператора при его работе с циклом из нескольких строк нужны операторные скобки. Да и добавил строку p:=p^.next, независящую от i. А проскакивает у тебя этот цикл, вероятно, потому что делаешь это в первый же раз. Другими словами и p и head=nil
Это индексы элементов в массиве. |
| Автор: SniyLSD 29.5.2008, 15:42 | ||
| Походу я намудрил с алгоритмом подсчитывания номера удаляемого элемента от головы. это все и усложнило процедуру удаления, а может этот способ даже неприемлен для данной ситуации, что вызывает различного рода ошибки. Можете мне помочь написать код который выбирает элемент с заданным номером от конца списка? то есть в списке 10 элементов, выбрали второй элемент от конца, а от головы он будет 9. а дальше мне будет понятнее, так как траблы у меня именно с этим((
Вот вроде с этим понятнее , можно ли как нибудь по другому реализовать выбор нужного нам элемента списка? |
| Автор: anwe 29.5.2008, 19:47 | ||||||
| Отвечая на первый вопрос привожу работоспособный код:
Добавлена кнопка Button3 (чтобы твой код не трогать)
Ниже сам проект. |
| Автор: SniyLSD 30.5.2008, 00:00 |
| Ого! Спасибо дружище! Блин, не додумался до такого простого варианта (, видно сказывается небольшой опыт практического программирования, да и с сессией замотался - мозги кипят Еще раз спасибо) |