-
Notifications
You must be signed in to change notification settings - Fork 0
/
UList.pas
122 lines (105 loc) · 2.43 KB
/
UList.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
unit UList;
interface
{$I types.inc}
type
PPListStruct = ^PListStruct;
PListStruct = ^TListStruct;
TListStruct = record
pNext: PListStruct;
pData: pointer;
ItemCount: dword;
end;
function IsAdded(List: PListStruct; Data: pointer): boolean;
procedure DelItem(var List: PListStruct; Data: pointer);
procedure DelItemAndFree(var List: PListStruct; Data: pointer);
procedure FreeList(var List: PListStruct);
procedure FreeListWidthData(var List: PListStruct);
procedure AddItem(var List: PListStruct; Data: pointer);
function GetItemData(List: PListStruct; ItemNum: dword): pointer;
implementation
function IsAdded(List: PListStruct; Data: pointer): boolean;
begin
Result := true;
while List <> nil do
begin
if Data = List^.pData then Exit;
List := List^.pNext
end;
Result := false;
end;
procedure DelItem(var List: PListStruct; Data: pointer);
var
Item, Prev: PListStruct;
Count: dword;
begin
Item := List;
if Item = nil then Exit;
Count := List^.ItemCount;
Prev := nil;
while Item <> nil do
begin
if Data = Item^.pData then
begin
if Prev <> nil then Prev^.pNext := Item^.pNext else List := Item^.pNext;
Exit;
end;
Prev := Item;
Item := Item^.pNext;
end;
List^.ItemCount := Count - 1;
end;
procedure DelItemAndFree(var List: PListStruct; Data: pointer);
begin
DelItem(List, Data);
FreeMem(Data);
end;
procedure FreeList(var List: PListStruct);
var
Mem: pointer;
begin
while List <> nil do
begin
Mem := List;
List := List^.pNext;
FreeMem(Mem);
end;
List := nil;
end;
procedure FreeListWidthData(var List: PListStruct);
var
Mem: pointer;
begin
while List <> nil do
begin
Mem := List;
FreeMem(List^.pData);
List := List^.pNext;
FreeMem(Mem);
end;
List := nil;
end;
procedure AddItem(var List: PListStruct; Data: pointer);
var
wNewItem: PListStruct;
begin
GetMem(wNewItem, SizeOf(TListStruct));
wNewItem^.pNext := List;
if List = nil then wNewItem^.ItemCount := 0
else wNewItem^.ItemCount := List^.ItemCount + 1;
wNewItem^.pData := Data;
List := wNewItem;
end;
function GetItemData(List: PListStruct; ItemNum: dword): pointer;
begin
Result := nil;
while List <> nil do
begin
if List^.ItemCount = ItemNum then
begin
Result := List^.pData;
Exit;
end;
List := List^.pNext;
end;
end;
end.