?? singlelinklist.~pas
字號:
//單鏈表單元文件
unit SingleLinkList;
interface
uses
Windows, Messages, SysUtils, Classes, Forms, Dialogs;
type
int = integer;
//單鏈表數據類。
TSDLinkListRec = class
public
Next: TSDLinkListRec;
constructor Create;
end;
//單鏈表管理類。
TSDLinkListMGR = class
private
FCount: integer;
public
Head: TSDLinkListRec;
constructor Create;
destructor Destroy;override;
function IndexOf(Index: integer): TSDLinkListRec;
function GetIndex(SL: TSDLinkListRec): int;
procedure Clear;virtual;
procedure Append(SL: TSDLinkListRec);virtual;
procedure Insert(Index, SL: TSDLinkListRec);virtual;
procedure Delete(SL: TSDLinkListRec);virtual;
procedure MovePrev(SL: TSDLinkListRec);
procedure MoveNext(SL: TSDLinkListRec);
property Count: int read FCount;
end;
TDBArray = array of Double;
TFitDataRec = class(TSDLinkListRec)
private
FItemName: String;
FPower: BYTE;
FCoef: TDBArray;
FError: Double;
FFitTime: TDateTime;
FMemo: TStrings;
FDataNums: WORD;
FTestIn: TDBArray;
FTestOut: TDBArray;
FFitOut: TDBArray;
FRelError: TDBArray;
procedure SetItemName(Value: String);
procedure SetCoef(Index: Integer; Value: Double);
procedure SetPower(Value: BYTE);
procedure SetDataNams(Value: WORD);
procedure SetTestIn(Index: Integer; Value: Double);
procedure SetTestOut(Index: Integer; Value: Double);
procedure SetFitOut(Index: Integer; Value: Double);
procedure SetRelError(Index: Integer; Value: Double);
function GetCoef(Index: Integer): Double;
function GetTestIn(Index: Integer): Double;
function GetTestOut(Index: Integer): Double;
function GetFitOut(Index: Integer): Double;
function GetRelError(Index: Integer): Double;
published
property ItemName: String read FItemName write SetItemName;
property Power: BYTE read FPower write FPower;
property Error: Double read FError write FError;
property FitTime: TDateTime read FFitTime write FFitTime;
property Memo: TStrings read FMemo write FMemo;
property DataNums: WORD read FDataNums write FDataNums;
public
property Coef[Index: Integer]: Double read GetCoef write SetCoef;
property TestIn[Index: Integer]: Double read GetTestIn write SetTestIn;
property TestOut[Index: Integer]: Double read GetTestOut write SetTestOut;
property FitOut[Index: Integer]: Double read GetFitOut write SetFitOut;
property RelError[Index: Integer]: Double read GetRelError write SetRelError;
procedure ReadFromFile(var F: Text);
procedure WriteToFile(var F: Text);
constructor Create;
end;
TFitDataMGR = class(TSDLinkListMGR)
DefaultFitInfo: TFitDataRec;
Modifyed: Boolean;
function FindItemByName(ItemName: String): TFitDataRec;
procedure ReadFromFile(FileName: string);
procedure WriteToFile(FileName: string);
constructor Create;
destructor Destroy;override;
end;
implementation
{
以下是一個單鏈表的完整實現。包括兩個類:之一是單鏈表中的存儲數據的類。之二是對此單鏈表進行管理的類。
在管理類中實現了以下操作:
1、APPEND操作:向鏈表中添加節點。
2、INSERT操作:向鏈表中插入節點。(插入的節點在INDEX節點后面。)
(注意:以上操作支持多節點。)
3、DELETE操作:刪除鏈表中的一個節點。
4、MOVEPREV操作:將一個節點移動到其前一個節點前。
5、MOVENEXT操作:將一個節點移動到其后一個節點后。
6、INDEX操作:通過索引方式查找節點。
}
//--TSDLinkListRec單鏈表記錄類
constructor TSDLinkListRec.Create;
begin
inherited;
Next := nil;
end;
//--TSDLinkListMGR單鏈表管理類
constructor TSDLinkListMGR.Create;
begin
inherited;
Clear;
end;
destructor TSDLinkListMGR.Destroy;
begin
Clear;
inherited;
end;
function TSDLinkListMGR.IndexOf(Index: integer): TSDLinkListRec;
var
T: TSDLinkListRec;
i: integer;
begin
i := 1;
Result := nil;
T := Head;
while T <> nil do
begin
if i = Index then
begin
Result := T;
Break;
end;
T := T.Next;
Inc(i);
end;
end;
function TSDLinkListMGR.GetIndex(SL: TSDLinkListRec): int;
var
P: TSDLinkListRec;
begin
Result := 0;
P := Head;
while P <> nil do
begin
Inc(Result);
if P = SL then
Exit;
P := P.Next;
end;
Result := 0;
end;
procedure TSDLinkListMGR.Clear;
var
T: TSDLinkListRec;
begin
T := Head;
while T <> nil do
begin
Head := T.Next;
T.Destroy;
T := Head;
end;
Head := nil;
FCount := 0;
end;
procedure TSDLinkListMGR.Append(SL: TSDLinkListRec);
var
T: TSDLinkListRec;
C: integer;
begin
T := SL;
C := 0;
while T <> nil do
begin
inc(C);
T := T.Next;
end;
if C = 0 then
Exit;
if Head = nil then
Head := SL
else
begin
T := Head;
while T.Next <> nil do
T := T.Next;
T.Next := SL;
end;
inc(FCount, C);
end;
procedure TSDLinkListMGR.Insert(Index, SL: TSDLinkListRec);
var
T, T1, T2: TSDLinkListRec;
C: integer;
begin
C := 0;
T := SL;
while T <> nil do
begin
inc(C);
T := T.Next;
end;
if C = 0 then
Exit;
if Head = nil then
Head := SL
else
begin
T := Head;
while T <> nil do
begin
if T = Index then
begin
T1 := T;
T.Next := SL;
T2 := SL;
while T2.Next <> nil do
T2 := T2.Next;
T2.Next := T1;
Break;
end;
T := T.Next;
end;
end;
inc(FCount, C);
end;
procedure TSDLinkListMGR.Delete(SL: TSDLinkListRec);
var
T: TSDLinkListRec;
begin
if SL = nil then
Exit;
if Head = SL then
begin
Head := SL.Next;
SL.Destroy;
end
else
begin
T := Head;
while T <> nil do
begin
if T.Next = SL then
begin
T.Next := SL.Next;
SL.Destroy;
Break;
end;
T := T.Next;
end;
end;
dec(FCount);
end;
procedure TSDLinkListMGR.MovePrev(SL: TSDLinkListRec);
var
P, C: TSDLinkListRec;
begin
if (SL = nil) or (SL = Head) then
Exit;
if Head.Next = SL then
begin
C := SL.Next;
SL.Next := Head;
Head.Next := C;
Head := SL;
end;
P := Head;
C := P.Next;
while (C.Next <> SL) and (C.Next <> nil) do
begin
P := C;
C := C.Next;
end;
if C.Next = nil then
Exit;
P.Next := SL;
C.Next := SL.Next;
SL.Next := C;
end;
procedure TSDLinkListMGR.MoveNext(SL: TSDLinkListRec);
var
P, C: TSDLinkListRec;
begin
if SL = nil then
Exit;
if Head = nil then
Exit;
P := Head;
C := P.Next;
while C <> SL do
begin
P := C;
C := C.Next;
end;
if C.Next = nil then
Exit;
C := SL.Next;
P.Next := C;
SL.Next := C.Next;
C.Next := SL;
end;
// TFitDataRec
procedure TFitDataRec.SetItemName(Value: String);
begin
if Value <> '' then
FItemName := Value;
end;
procedure TFitDataRec.SetPower(Value: BYTE);
begin
if Value >= 1 then
SetLength(FCoef,Value+1)
else
Application.MessageBox('擬合方程的次數必須大于或等于1!','警告',MB_OK+MB_ICONWARNING);
end;
procedure TFitDataRec.SetDataNams(Value: WORD);
begin
if Value >= 2 then
begin
SetLength(FTestIn,Value);
SetLength(FTestOut,Value);
SetLength(FFitOut,Value);
SetLength(FRelError,Value);
end else
Application.MessageBox('用于擬合的測量數據對個數必須大于或等于2!','警告',MB_OK+MB_ICONWARNING);
end;
procedure TFitDataRec.SetCoef(Index: Integer; Value: Double);
begin
if (Index > -1) and (Index < (FPower+1)) then
FCoef[Index] := Value
else
Application.MessageBox('索引越界!','錯誤',MB_OK+MB_ICONERROR);
end;
procedure TFitDataRec.SetTestIn(Index: Integer; Value: Double);
begin
if (Index > -1) and (Index < FDataNums) then
FTestIn[Index] := Value
else
Application.MessageBox('索引越界!','錯誤',MB_OK+MB_ICONERROR);
end;
procedure TFitDataRec.SetTestOut(Index: Integer; Value: Double);
begin
if (Index > -1) and (Index < FDataNums) then
FTestOut[Index] := Value
else
Application.MessageBox('索引越界!','錯誤',MB_OK+MB_ICONERROR);
end;
procedure TFitDataRec.SetFitOut(Index: Integer; Value: Double);
begin
if (Index > -1) and (Index < FDataNums) then
FFitOut[Index] := Value
else
Application.MessageBox('索引越界!','錯誤',MB_OK+MB_ICONERROR);
end;
procedure TFitDataRec.SetRelError(Index: Integer; Value: Double);
begin
if (Index > -1) and (Index < FDataNums) then
FRelError[Index] := Value
else
Application.MessageBox('索引越界!','錯誤',MB_OK+MB_ICONERROR);
end;
function TFitDataRec.GetCoef(Index: Integer): Double;
begin
if (Index > -1) and (Index < (FPower+1)) then
Result := FCoef[Index]
else
Application.MessageBox('索引越界!','錯誤',MB_OK+MB_ICONERROR);
end;
function TFitDataRec.GetTestIn(Index: Integer): Double;
begin
if (Index > -1) and (Index < FDataNums) then
Result := FTestIn[Index]
else
Application.MessageBox('索引越界!','錯誤',MB_OK+MB_ICONERROR);
end;
function TFitDataRec.GetTestOut(Index: Integer): Double;
begin
if (Index > -1) and (Index < FDataNums) then
Result := FTestOut[Index]
else
Application.MessageBox('索引越界!','錯誤',MB_OK+MB_ICONERROR);
end;
function TFitDataRec.GetFitOut(Index: Integer): Double;
begin
if (Index > -1) and (Index < FDataNums) then
Result := FFitOut[Index]
else
Application.MessageBox('索引越界!','錯誤',MB_OK+MB_ICONERROR);
end;
function TFitDataRec.GetRelError(Index: Integer): Double;
begin
if (Index > -1) and (Index < FDataNums) then
Result := FRelError[Index]
else
Application.MessageBox('索引越界!','錯誤',MB_OK+MB_ICONERROR);
end;
constructor TFitDataRec.Create;
begin
inherited;
Next := nil;
FPower := 1;
FDataNums := 0;
SetLength(FCoef,2);
SetLength(FTestIn,2);
SetLength(FTestOut,2);
SetLength(FFitOut,2);
SetLength(FRelError,2);
end;
procedure TFitDataRec.ReadFromFile(var F: Text);
begin
end;
procedure TFitDataRec.WriteToFile(var F: Text);
begin
end;
//--TFitDataMGR
function TFitDataMGR.FindItemByName(ItemName: String): TFitDataRec;
var
T: TFitDataRec;
begin
Result := nil;
T := Head;
while T <> nil do
begin
if T.ItemName = ItemName then
begin
Result := T;
Break;
end;
T := T.Next;
end;
end;
procedure TFitDataMGR.ReadFromFile(FileName: string);
begin
end;
procedure TFitDataMGR.WriteToFile(FileName: string);
begin
end;
constructor TFitDataMGR.Create;
begin
end;
destructor TFitDataMGR.Destroy;
begin
inherited;
end;
{
// 在加入用戶時,可以這樣做:
var
User: TUserRec;
begin
User := TUserRec.Create;
User.UserName := '1234';
User.FullName := 'abcd';
......
Users.Append(User);
end;
// 在刪除用戶時,可以這樣做:
var
User: TUserRec;
begin
User := TUserRec(Users.IndexOf('1234'));
Users.Delete(User);
end;
// 在遍歷用戶時,可以這樣做:
var
User: TUserRec;
begin
User := TUserRec(Users.Head);
while User <> nil do
begin
......
User := TUserRec(User.Next);
end;
end;
}
end.
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -