Здравствуйте!
Вот создал я односвязный список
Теперь его нужно отсортировать, я написал код сортировки, но у меня программа зависает при запуске сразу же
посмотрите пожалуйста, что тут не так?
Вроде код минимизированн и вроде как правильный
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;
Врошу ответ в виде кода
Другие языки программирования и технологии
delphi, динамические списки
А с каких это пор сортировка выполняется одним циклом?
Вот пример сортировки списка, пример которого я приводил в прошлом ответе/ Типы переменных: 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;
Еще раз советую: отработайте алгоритм на простом списке, а потом добавляйте свои поля.
Вот пример сортировки списка, пример которого я приводил в прошлом ответе/ Типы переменных: 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;
Еще раз советую: отработайте алгоритм на простом списке, а потом добавляйте свои поля.
Списки — это не массивы!
Для них можно сразу менять положение всей записи.
(К стати, в 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;
Для них можно сразу менять положение всей записи.
(К стати, в 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;
Еще раз предлагаю сделать твою задачу полностью как надо
Тебе правильный код все равно писать ни кто не будет, то что ты видишь это банальные примеры алгоритма сортировки.
В конечном итоге ты запутаешься в своем говнокоде и и за ночь до сдачи начнешь вопить "караул, спасите, помогите, напишите прогу". Но тогда, скорее всего, желающих тебя спасать рядом не окажется
Тебе правильный код все равно писать ни кто не будет, то что ты видишь это банальные примеры алгоритма сортировки.
В конечном итоге ты запутаешься в своем говнокоде и и за ночь до сдачи начнешь вопить "караул, спасите, помогите, напишите прогу". Но тогда, скорее всего, желающих тебя спасать рядом не окажется
Похожие вопросы
- delphi, динамические списки
- delphi, динамические списки
- Работа с динамическими списками в Делфи!
- Delphi. Динамическое создание формы
- Delphi:Прочитал, что если при динамическом создании компонента если указать Name объекта, то в последующем можно ->
- C++ :Разработать пользовательскую библиотеку для работы с односвязным списком (использовать динамическую память).
- delphi, списки
- Согласны с этим - Глубинные причины ненависти к Delphi/Pascal ?
- вопрос о динамических массивах в fortran
- динамический массив в Visual C++