Последний раз редактировалось Circiter 21.05.2011, 02:49, всего редактировалось 5 раз(а).
2Natalya23 Вы какую-то глупость там написали. :) Для внесения ясности, рекомендую вам нарисовать ваш связанный список на бумаге. Поле Next должно содержать адрес следующего элемента списка.
Конкретно по вашему коду возникли следующие вопросы. Например, зачем вам нужны строки 125-132? Их следует удалить. Также непонятно, почему в 136 строке использовано ключевое слово downto вместо to. Надо бы исправить. Да и цикл тот стоит начинать с единицы, а не с двойки.
По существу, ошибка вот в чем. Допустим вы хотите добавить добавить новый элемент в начало списка. Для этого вам нужно создать этот элемент через new(r), заполнить поля и положить в поле Next адрес начала списка, уже построенного до этого момента. Я так понял, на начало списка у вас указывает q, поэтому надо в 144 строке писать не Next:=nil, а Next:=q. И уже после этого можно "направить" q на только что выделенный новый элемент, q:=r. А в 133 строке, перед построением списка, q должна быть инициализирована нулевым указателем, q:=nil.
Если же вы хотите добавить новый элемент в конец списка, то удобно будет завести ещё одну переменную-указатель, специально для хранения адреса конца. То есть, в результате у вас будет две переменные, q и, скажем, e; одна будет указывать на начало, а другая на конец, причем обе изначально равны nil. После того как вы создали новый элемент через new (положив в поле Next значение nil), вы должны проверить чему равно значение e, если там по-прежнему хранится нулевой указатель, т.е., если список ещё пуст, то вы должны всего-лишь запомнить только что созданный первый элемент: q=r; e=r. В противном случае, если элементы в списке уже есть, то вы должны связать последний до этого имевшийся элемент списка с новым, т.е., выполнить e^.Next=r; а потом "передвинуть" указатель конца списка, чтобы он указывал на новый настоящий конец списка: e=r.
Вот я вам предложил два способа пополнения списка; какой из них вы пытались применить я так и не понял, поэтому выбирайте сами. И ещё раз напоминаю о трюке с бумажкой.
P.S.: При работе с типизированными указателями на записи правильнее все-таки писать q^.Next, а не q.Next, хотя object pascal позволяет использовать оба варианта (это нужно для красивой работы с классами).
|