Вот сел написал сам, но не могу разобраться с сортировкой, не хочет работать. Помогите пожалуйста!!!!
| Код | // описание структуры кольцевого односвязного списка /////////////////////////// type TList = ^List;
List = record Str: integer; Next: TList; // следующий элемент списка end;
var head: TList; // начало списка curr: TList; i: integer;
Procedure InsertRecord( Var head: TList; pItem: TList ); Var curr, pre, temp: TList; Begin If head = Nil Then Begin head := pItem; head^.next := Nil End Else Begin curr := head; pre := Nil; end; While curr^.Str < pItem^.Str Do If curr^.next = Nil Then Begin curr^.next := pItem; pItem^.next := Nil; Exit; End Else Begin pre:= curr; If pre = Nil Then Begin pItem^.next := head; head := pItem; End Else Begin pItem^.next := pre; pre^.next := pItem; End; End; End;
// процедура скрытия картинок и label ////////////////////////////////////////// procedure TForm1.ImLabFal ; begin Image1.Visible:=false; Image2.Visible:=false; Image3.Visible:=false; Image4.Visible:=false; Image5.Visible:=false; Image6.Visible:=false; Image7.Visible:=false; Image8.Visible:=false; Image9.Visible:=false; Image10.Visible:=false; Label1.Visible:=false; Label2.Visible:=false; Label3.Visible:=false; Label4.Visible:=false; Label5.Visible:=false; Label6.Visible:=false; Label7.Visible:=false; Label8.Visible:=false; Label9.Visible:=false; Label10.Visible:=false; i:=0; curr:=head; while curr<>NIL do begin i:=i+1; case i of 1: Label1.Caption:=IntToStr(curr^.Str); 2: Label2.Caption:=IntToStr(curr^.Str); 3: Label3.Caption:=IntToStr(curr^.Str); 4: Label4.Caption:=IntToStr(curr^.Str); 5: Label5.Caption:=IntToStr(curr^.Str); 6: Label6.Caption:=IntToStr(curr^.Str); 7: Label7.Caption:=IntToStr(curr^.Str); 8: Label8.Caption:=IntToStr(curr^.Str); 9: Label9.Caption:=IntToStr(curr^.Str); 10:Label10.Caption:=IntToStr(curr^.Str); end; curr:=curr^.Next; end; end;
// функция создания элементов списка///////////////////////////////////////// procedure TForm1.RecNSpisok; var n:integer; // кол-во вставляемых элементов в список tr:bool; // для проверки введены ли данные begin randomize; try n:= StrToInt(Form2.Edit1.Text); tr:=true; except tr:=false; end; if (tr) then begin i:=0; while i<n do begin new(curr); curr^.Next:=head; head:=curr; curr.Str:=Random(99)+1; i:=i+1; case i of 1: Label1.Caption:=IntToStr(curr.Str); 2: Label2.Caption:=IntToStr(curr.Str); 3: Label3.Caption:=IntToStr(curr.Str); 4: Label4.Caption:=IntToStr(curr.Str); 5: Label5.Caption:=IntToStr(curr.Str); 6: Label6.Caption:=IntToStr(curr.Str); 7: Label7.Caption:=IntToStr(curr.Str); 8: Label8.Caption:=IntToStr(curr.Str); 9: Label9.Caption:=IntToStr(curr.Str); 10:Label10.Caption:=IntToStr(curr.Str); end; end; end; end;
// функция добавления элемента в список///////////////////////////////////////// procedure TForm1.RecSpisok; begin ImLabFal; new(curr); // создание нового элемента списка curr^.Str:= StrToInt(Form3.Edit1.Text); curr^.Next:= head; head:= curr; end;
// функция удаления элемента из списка////////////////////////////////////////// procedure TForm1.DelSpisok; var pre:TList; // предыдущий относительно curr n:integer; // элемент который необходимо удалить begin if head = NIL then begin MessageDlg('Список пустой!', mtError, [mbOk],0); Exit; end; n:=StrToInt(Form4.Edit1.Text); curr:=head; i:=1; while i<n do begin pre:=curr; curr:=curr^.Next; i:=i+1; end; pre^.Next:=curr.Next; Dispose (curr); ImLabFal; end;
// функция сортировки элементов списка////////////////////////////////////////// procedure TForm1.SortSpisok; var pre: TList; // предыдущий относительно curr temp: TList; // временный элемент списка begin if head=NIL then exit; curr:=head; while (curr<>NIL) do begin temp:=curr; curr:=curr^.Next; InsertRecord( pre, temp ); end; head:=pre; ImLabFal; end;
// процедура для формирования списка//////////////////////////////////////////// procedure TForm1.BitBtn3Click(Sender: TObject); begin Form2.ShowModal; end;
// процедура для вставки нового элемента//////////////////////////////////////// procedure TForm1.BitBtn4Click(Sender: TObject); begin Form3.ShowModal; end;
// процедура для удаления элемента из списка//////////////////////////////////// procedure TForm1.BitBtn5Click(Sender: TObject); begin Form4.ShowModal; end;
// процедура для вывода на экран элементов списка/////////////////////////////// procedure TForm1.BitBtn2Click(Sender: TObject); begin ImLabFal; i:=0; curr:=head; if head=NIL then curr.Next:=NIL; while curr<>NIL do begin i:=i+1; curr:=curr^.Next; case i of 1: Image1.Visible:=true; 2: Image2.Visible:=true; 3: Image3.Visible:=true; 4: Image4.Visible:=true; 5: Image5.Visible:=true; 6: Image6.Visible:=true; 7: Image7.Visible:=true; 8: Image8.Visible:=true; 9: Image9.Visible:=true; 10:Image10.Visible:=true; end; case i of 1: Label1.Visible:=true; 2: Label2.Visible:=true; 3: Label3.Visible:=true; 4: Label4.Visible:=true; 5: Label5.Visible:=true; 6: Label6.Visible:=true; 7: Label7.Visible:=true; 8: Label8.Visible:=true; 9: Label9.Visible:=true; 10:Label10.Visible:=true; end; end; end;
// кнопка сортировки списка //////////////////////////////////////////////// procedure TForm1.BitBtn6Click(Sender: TObject); begin SortSpisok; end;
end.
|
|