Думаю, что эти предложения не позволят сортировать список. А кучу, конечно, надо освобождать, но это может подождать (к тому же это не бросается в глаза
)
Цитата:
А я еще Паскаль не до конца изучила, пытаюсь освоить школьный курс
и тоже в этих алгоритмах ничего не понимаю.
Ладно, не надо ложной скромности!
Цитата:
Автор программы очень умный, ...
Автор программы мож и умный, но при написании данного текста куда-то
очень торопился.
Давай потихоньку разберемся. Я Паскаль забросил лет 7 назад, а потому
знаю немногим больше твоего (если не меньше). Насколько я понял, с
массивами ты понимаешь как обрашатся, но тебя смущают списки (и, возможно
еще эти несчастные record и указатели
). record - это то же, что stuct
в Си. Это вроде коробки. Если Вам необходимо хранить несколько разнотипных
величин в одном месте (к примеру, координаты точки на плоскости и ее
цвет), удобно все это сложить в один ящик и обращаться с ним, как с единым
целым:
Код:
Type
point = record
x: double;
y: double;
color: integer;
end;
Естественно, как и все переменные, такая коробка сидит в памяти и имеет
адрес (точнее, адрес ее начала). Переменная-указатель на этот тип может
хранить значения начальные адресов энтих коробок.
У вас Node - это такая коробка, а List - это переменная-указатель,
которая может хранить адреса таких коробок.
У вас запись (или коробка
) объявлена след. образом:
Код:
Type
List= ^Node;
Node = record
info: Integer;
next: List
end;
В Вашем случае каждая "коробка" содержит указатель на такую же "коробку"
(это переменная next). Список - это цепочка таких вот "коробок", каждая
последующая связана с предыдущей указателем next. Пусть у нас список -
переменная L (это указатель на нашу "коробку", а что бы получить доступ к
самой коробке - к указателю надо применить т.н. оператор разыменования,
если я правильно понял, то вот таким образом: L^ ). Доступ к первому эл-ту:
L^
Ко второму:
L^.next^
к третьему:
L^.next^.next^
и т.д. В последней "коробке" next должен быть равен nil (если указатель
имеет значение nil, то он никуда не указывает) - это служит окончанием
списка.
Нельзя пролучить доступ непосредственно к i-тому элементу списка. Что бы
получить к нему доступ, надо сначала получить доступ к предыдущим i-1
элементам:
Код:
p = LL;
for k := 1 to i do
p = p^.next;
что бы получить доступ полю info нашей "коробки" по имени p (которая имеет тип List) надо написать:
p^.info
Если Вы заметили - такую штуку, как список лучше сортировать таким алгоритмом, в котором требуется доступ только к двум соседним элементам (каковым и является описанный Вами способ сортировки обменом)
Извиняюсь за длинное вступление. Я просто хотел, что бы было понятны термины, которые использовались в формулировке Вашей задачи. Теперь посмотрите на этот код, выдранный из процедуры сортировки и почитайте мои комментарии:
Код:
l:= LL;{Присваеваем переменной l указатель на 1-ый эл-т списка}
p:= l^.next;{Присваеваем переменной p указатель на 2-ой эл-т списка}
isExchanged:= False;{Если подумать, это нафиг не нужно}
while p <> nil do {если p=nil-это конец списка, и надо выходить из цикла.}
begin
if p^.info > l^.info then {Если первый эл-т больше второго}
begin {То: }
isExchanged:= True; {Это тоже нафиг не нужно}
k:= p^.info; {В этих трех строчках }
p^.info:= l^.info; { }
l^.info:= k; {меняем эл-ты местами }
l:= l^.next; {Перемещаемся к }
p:= p^.next; {следующему элементу списка }
end;
{!!!! А ЕСЛИ УСЛОВИЕ if p^.info > l^.info НЕ ВЫПОЛНЯЕТСЯ, }
{ТО НЕ ДЕЛАЕМ НИЧЕГО И ОПЯТЬ СРАВНИВАЕМ ТЕ ЖЕ ЗНАЧЕНИЯ!!!!!}
end;
Увидели самую главную ошибку? Слово end надо в одном месте просто поднять вверх
На сколько строк?