📄 link.~pas
字号:
unit Link;interfaceuses Qt, SysUtils, Types, Classes, Variants, QGraphics, QControls, QForms, QDialogs, QStdCtrls;type TMyData = record X: Integer; Y: Integer; case Boolean of true: ( I: Integer; ); false: ( P: PInteger ); end; PMyNode = ^TMyNode; TMyNode = record Data: TMyData; Next: PMyNode; end; TMyList = record Count: Integer; Node: PMyNode; end; TFrmMain = class(TForm) Memo: TMemo; BtnAdd: TButton; BtnDelete: TButton; BtnInsert: TButton; BtnSearch: TButton; procedure FormCreate(Sender: TObject); procedure BtnAddClick(Sender: TObject); procedure BtnInsertClick(Sender: TObject); procedure BtnDeleteClick(Sender: TObject); procedure BtnSearchClick(Sender: TObject); private { Private declarations } MyList: TMyList; public { Public declarations } procedure DoAdd( Data: TMyData ); procedure DoInsert( Data: TMyData; Index: Integer ); procedure DoDelete( Index: Integer ); function DoSearch( Data: TMyData ): Integer; procedure DoDisplay(); end;var FrmMain: TFrmMain;implementationuses Add, Insert, Delete, Search;{$R *.xfm}procedure TFrmMain.FormCreate(Sender: TObject);begin MyList.Count := 0; MyList.Node := nil;end;procedure TFrmMain.BtnAddClick(Sender: TObject);var FrmAdd: TFrmAdd; Data: TMyData;begin FrmAdd := TFrmAdd.Create( Self ); try if FrmAdd.ShowModal() = mrOK then begin // Create a new Data record Data.X := StrToIntDef( FrmAdd.EdtX.Text, 0 ); Data.Y := StrToIntDef( FrmAdd.EdtY.Text, 0 ); // Add it DoAdd( Data ); DoDisplay(); end; finally FrmAdd.Free(); FrmAdd := nil; end;end;procedure TFrmMain.BtnInsertClick(Sender: TObject);var FrmInsert: TFrmInsert; Data: TMyData;begin FrmInsert := TFrmInsert.Create( Self ); try if FrmInsert.ShowModal() = mrOK then begin // Create a new Data record Data.X := StrToIntDef( FrmInsert.EdtX.Text, 0 ); Data.Y := StrToIntDef( FrmInsert.EdtY.Text, 0 ); // Insert it DoInsert( Data, StrToIntDef( FrmInsert.EdtPosition.Text, -1 ) ); DoDisplay(); end; finally FrmInsert.Free(); FrmInsert := nil; end;end;procedure TFrmMain.BtnDeleteClick(Sender: TObject);var FrmDelete: TFrmDelete;begin FrmDelete := TFrmDelete.Create( Self ); try if FrmDelete.ShowModal() = mrOK then begin // Delete it DoDelete( StrToIntDef( FrmDelete.EdtPosition.Text, -1 ) ); DoDisplay(); end; finally FrmDelete.Free(); FrmDelete := nil; end;end;procedure TFrmMain.BtnSearchClick(Sender: TObject);var FrmSearch: TFrmSearch; Data: TMyData; PosReturn: Integer; Msg: string;begin FrmSearch := TFrmSearch.Create( Self ); try if FrmSearch.ShowModal() = mrOK then begin // Create a new Data record Data.X := StrToIntDef( FrmSearch.EdtX.Text, 0 ); Data.Y := StrToIntDef( FrmSearch.EdtY.Text, 0 ); // Search it PosReturn := DoSearch( Data ); if PosReturn = -1 then begin Msg := Format( '[ %d, %d ] not Found.', [ Data.X, Data.Y ] ); Application.MessageBox( Msg, 'Search Result', [ smbOK ], smsInformation ); if Memo.HasSelection then Memo.UnSelect(); end else begin// Msg := Format( '[ %d, %d ] at Node %d.', [ Data.X, Data.Y, PosReturn ] );// Application.MessageBox( Msg, 'Search Result', [ smbOK ], smsInformation ); if Memo.HasSelection then Memo.UnSelect(); Memo.SetFocus(); QMultiLineEdit_setCursorPosition( Memo.Handle, 2*PosReturn+2, 0, false ); // false means whether extends old selection. Memo.SelLength := Length( Memo.Lines[ 2*PosReturn+2 ] ) + Length( Memo.Lines[ 2*PosReturn+3 ] ) + 2; end; end; finally FrmSearch.Free(); FrmSearch := nil; end;end;procedure TFrmMain.DoAdd(Data: TMyData);var NewNode: PMyNode; CurrNode: PMyNode;begin // Create a new node New( NewNode ); NewNode^.Next := nil; NewNode^.Data := Data; // Find the last node of the list if MyList.Node = nil then begin // Add the new node MyList.Node := NewNode; Inc( MyList.Count ); end else begin CurrNode := MyList.Node; while CurrNode^.Next <> nil do begin CurrNode := CurrNode^.Next; end; // Add the new node CurrNode^.Next := NewNode; Inc( MyList.Count ); end;end;procedure TFrmMain.DoDelete(Index: Integer);var CurrNode, DeletedNode: PMyNode; i: Integer;begin if Index = -1 then // Delete all begin while MyList.Node <> nil do begin DeletedNode := MyList.Node; MyList.Node := MyList.Node^.Next; Dispose( DeletedNode ); DeletedNode := nil; end; MyList.Count := 0; end else if Index = 0 then // Delete the first position begin if MyList.Count > 0 then begin // Delete the first node DeletedNode := MyList.Node; MyList.Node := MyList.Node^.Next; Dispose( DeletedNode ); DeletedNode := nil; Dec( MyList.Count ); end; end else // Delete it at the specific position begin if MyList.Count <= Index then // If the position doen not exist begin exit; end else // Find the specific position given by Index and delete it begin CurrNode := MyList.Node; for i := 0 to Index - 2 do begin CurrNode := CurrNode^.Next; end; // Delete it DeletedNode := CurrNode^.Next; CurrNode^.Next := DeletedNode^.Next; Dispose( DeletedNode ); DeletedNode := nil; Dec( MyList.Count ); end; end;end;procedure TFrmMain.DoInsert(Data: TMyData; Index: Integer);var NewNode: PMyNode; CurrNode: PMyNode; i: Integer;begin if Index = -1 then // Add it at the end of the list begin DoAdd( Data ); end else if Index = 0 then // Insert it at the first position begin // Create a new node New( NewNode ); NewNode^.Next := MyList.Node; NewNode^.Data := Data; // Insert the new node MyList.Node := NewNode; Inc( MyList.Count ); end else // Insert it at the specific position begin if MyList.Count <= Index then // If the position doen not exist begin DoAdd( Data ); exit; end else // Find the specific position given by Index begin CurrNode := MyList.Node; for i := 0 to Index - 2 do begin CurrNode := CurrNode^.Next; end; // Create a new node New( NewNode ); NewNode^.Next := CurrNode^.Next; NewNode^.Data := Data; // Insert the new node CurrNode^.Next := NewNode; Inc( MyList.Count ); end; end;end;function TFrmMain.DoSearch(Data: TMyData): Integer;var CurrNode: PMyNode;begin Result := 0; // Find the specific data CurrNode := MyList.Node; while CurrNode <> nil do begin// No permitted// if CurrNode^.Data = Data then if ( CurrNode^.Data.X = Data.X ) and ( CurrNode^.Data.Y = Data.Y ) then // Success begin // break; exit; end else begin CurrNode := CurrNode^.Next; Inc( Result ); end; end; Result := -1;end;procedure TFrmMain.DoDisplay;var CurrNode: PMyNode; NewLine: string; i: Integer;begin Memo.Lines.Clear(); case MyList.Count of 0: NewLine := 'No Nodes.'; 1: NewLine := 'Total 1 Node.'; else NewLine := Format( 'Total %d Nodes.', [ MyList.Count ] ); end; Memo.Lines.Add( NewLine ); Memo.Lines.Add( '======================================' ); // Show the last node of the list CurrNode := MyList.Node; i := 0; while CurrNode <> nil do begin NewLine := Format( 'Node %d:', [ i ] ); Memo.Lines.Add( NewLine ); NewLine := Format( ' X = %d; Y = %d.', [ CurrNode^.Data.X, CurrNode^.Data.Y ] ); Memo.Lines.Add( NewLine ); CurrNode := CurrNode^.Next; Inc( i ); end;end;end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -