Другие языки программирования и технологии

delphi, динамические списки

Здравствуйте!
Вот создал я односвязный список
Теперь его нужно отсортировать, я написал код сортировки, но у меня программа зависает при запуске сразу же
посмотрите пожалуйста, что тут не так?
Вроде код минимизированн и вроде как правильный

procedure TForm1.Button3Click(Sender: TObject);
var
Dobav: PDan;
solo: PDan;
a,c,d: integer;
b: string[20];
begin
dobav:= head;
while dobav^.next <> endq do
begin
dobav^.next:= solo;
if dobav^.shifr < solo^.shifr then
begin
a:= dobav^.shifr;
b:= dobav^.name;
c:= dobav^.price;
d:= dobav^.mass;

dobav^.shifr:= solo^.shifr;
dobav^.name:= solo^.name;
dobav^.price:= solo^.price;
dobav^.mass:= solo^.mass;

solo^.shifr:= a;
solo^.name:= b;
solo^.price:= c;
solo^.mass:= d;

Label1.Caption:= Label1.Caption + #13#10 + IntToStr(dobav^.shifr) + '___' + dobav^.name + '___' + IntToStr(dobav^.price) + '___' + IntToStr(dobav^.mass);
dobav:= dobav^.next;

end;

Врошу ответ в виде кода
А с каких это пор сортировка выполняется одним циклом?

Вот пример сортировки списка, пример которого я приводил в прошлом ответе/ Типы переменных: Last, Cur : PList; T : Integer;

Last := Nil;
while Fst <> Last do begin
Cur := Fst;
while Cur^.Next <> Last do begin
if Cur^.Num > Cur^.Next^.Num then begin
T := Cur^.Num;
Cur^.Num := Cur^.Next^.Num;
Cur^.Next^.Num := T;
end;
Cur := Cur^.Next;
end;
Last := Cur;
end;

Еще раз советую: отработайте алгоритм на простом списке, а потом добавляйте свои поля.
Григорий Гашев
Григорий Гашев
59 614
Лучший ответ
Списки — это не массивы!
Для них можно сразу менять положение всей записи.
(К стати, в Delphi знак ^ можно не ставить ;-)

var Cur, Tmp, Pred : PDan;
begin
Pred := nil; // Предыдущий
Cur := Head; // Текущий

while Cur <> EndQ do // Не знаю почему у тебя такое условие. Меня бы устроило Cur.Next <> nil;
begin
if Cur.shifr < Cur.Next.shifr then { Ага! Нужно обменять! }
begin
Tmp := Cut.Next; // "Следующий" за "текущим"
Cur.Next := Tmp.Next; // "Текущий" теперь ссылается на следующий за "следующим"
Tmp.Next := Cur; // "Следующий" теперь ссылается на "Текущий"
if Pred <> nil then Pred.Next := Tmp; // Тот, что перед "текущим" должет ссылаться на "следующий"
// Всё! Все ссылки поменяли.. .
Cur := Tmp; // Теперь "текущим" становится тот, что раньше был "следующим"
end;
Pred := Cur; // Новый "Предыдущий"
Cur := Cur.Next; // Новый "Текущий"
end;
end;
Еще раз предлагаю сделать твою задачу полностью как надо
Тебе правильный код все равно писать ни кто не будет, то что ты видишь это банальные примеры алгоритма сортировки.

В конечном итоге ты запутаешься в своем говнокоде и и за ночь до сдачи начнешь вопить "караул, спасите, помогите, напишите прогу". Но тогда, скорее всего, желающих тебя спасать рядом не окажется