Думаю, что эти предложения не позволят сортировать список. А кучу, конечно, надо освобождать, но это может подождать (к тому же это не бросается в глаза 

 )
Цитата:
А я еще Паскаль не до конца изучила, пытаюсь освоить школьный курс
и тоже в этих алгоритмах ничего не понимаю.
Ладно, не надо ложной скромности!  
 
  Цитата:
Автор программы очень умный, ...
 
Автор программы мож и умный, но при написании данного текста куда-то
очень торопился.  
 
 
Давай потихоньку разберемся. Я Паскаль забросил лет 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 надо в одном месте просто поднять вверх  

  На сколько строк?