Программа для создания двусвязных кольцевых списков
Курсовой проект - Компьютеры, программирование
Другие курсовые по предмету Компьютеры, программирование
p;
В ходе курсовой работы мною было разработано приложение для создания двусвязных кольцевых списков.
Как оказалось, связанные списки - это наиболее подходящая структура для динамических данных, т.к. они могут иметь переменное количество элементов. Затраты производительности при работе со списками незначительны по сравнению с той экономией памяти и гибкостью, которые они предоставляют.
Пользовательский интерфейс программы максимально прост и удобен. Тестирование программы показало, что она полностью работоспособна и отвечает поставленным требованиям.
ПРИЛОЖЕНИЕ
// UnitFourthPlex.pas //UnitFourthPlex;
interfac
uses Grids;
TMember = record: string[32];: string[32];: string[32];: string[32];;
TNodePtr = ^TNode;
TNode = record: TMember;
NextFirst: TNodePtr;: TNodePtr;: TNodePtr;: TNodePtr;;
TPlex = class: TNodePtr;: TNodePtr;: TNodePtr;: TNodePtr;
fCount: integer;
fNumberPointer: integer;
procedure SwapLinks(left, right: integer);AddToSecondList(newNode: TNodePtr);AddToThirdList(newNode: TNodePtr);AddToFourthList(newNode: TNodePtr);RemoveFromSecondList(node: TNodePtr);RemoveFromThirdList(node: TNodePtr);RemoveFromFourthList(node: TNodePtr);
public
function Get_pointer(Node: TNodePtr): TNodePtr;Get_head: TNodePtr;Set_return_pointer(attribute: integer);
procedure Print_to_Grid(Grid: TStringGrid);GetI(index: integer): TNodePtr;
procedure Add(value: TMember);AddToIndex(Value: TMember; Index: integer);Del(index: integer);Sort(attribute: integer);Clear;
property Count: integer read fCount;;
implementation
uses SysUtils;
function TPlex.Get_pointer(node: TNodePtr): TNodePtr;
case fNumberPointer of
: result := Node.NextFirst;
: result := Node.NextSecond;
: result := Node.NextThird;
: result := Node.NextFourth;;
end;
function TPlex.Get_head: TNodePtr;
case fNumberPointer of
: result := fFirstHead;
: result := fSecondHead;
: result := fThirdHead;
: result := fFourthHead;;
end;
procedure TPlex.Set_return_pointer(attribute: integer);:= attribute;;
procedure TPlex.Print_to_Grid(Grid: TStringGrid);curNode: TNodePtr;
if fCount = 0 then.FixedRows := 0;.RowCount := 1;;;
Grid.RowCount := 2;.FixedRows := 1;
curNode := Get_head;
with Grid do
nildocurNode.Valuedo[0,RowCount-1]:=Surname;[1,RowCount-1]:=XDCode;[2,RowCount-1]:=SignXD;[3,RowCount-1]:=City;">while curNode <> nil docurNode.Value do[0,RowCount - 1] := Surname;[1,RowCount - 1] := XDCode;[2,RowCount - 1] := SignXD;[3,RowCount - 1] := City;
RowCount := RowCount + 1;;
curNode := Get_pointer(curNode);;
RowCount := RowCount - 1;
end;;
procedure TPlex.Add(value: TMember);newNode: TNodePtr;: TNodePtr;
fCount := fCount + 1;
new(newNode);.Value := value;
newNode.NextFirst := nil;.NextSecond := nil;.NextThird := nil;.NextFourth := nil;
if fFirstHead = nil then:= newNode;:= newNode;:= newNode;:= newNode;;;
curNode := fFirstHead;
nildo:=curNode.NextFirst;;">while curNode.NextFirst <> nil do:= curNode.NextFirst;;
curNode.NextFirst := newNode;
AddToSecondList(newNode);(newNode);(newNode);;
procedure TPlex.AddToSecondList(newNode: TNodePtr);: TNodePtr;
newNode.Value.XDCode)then.NextSecond:=fSecondHead;:=newNode;;;">if(fSecondHead.Value.XDCode > newNode.Value.XDCode) then.NextSecond := fSecondHead;:= newNode;;;
curNode := fSecondHead;
nil)and">while (curNode.NextSecond <> nil) and
(curNode.NextSecond.Value.XDCode < newNode.Value.XDCode) do:= curNode.NextSecond;;
newNode.NextSecond := curNode.NextSecond;.NextSecond := newNode;
end;
procedure TPlex.AddToThirdList(newNode: TNodePtr);: TNodePtr;
newNode.Value.SignXD)then.NextThird:=fThirdHead;:=newNode;;;">if(fThirdHead.Value.SignXD > newNode.Value.SignXD) then.NextThird := fThirdHead;:= newNode;;;
curNode := fThirdHead;
nil)and">while (curNode.NextThird <> nil) and
(curNode.NextThird.Value.SignXD < newNode.Value.SignXD) do:= curNode.NextThird;;
newNode.NextThird := curNode.NextThird;.NextThird := newNode;
end;
procedure TPlex.AddToFourthList(newNode: TNodePtr);: TNodePtr;
newNode.Value.City)then.NextFourth:=fFourthHead;:=newNode;;;">if(fFourthHead.Value.City > newNode.Value.City) then.NextFourth := fFourthHead;:= newNode;;;
curNode := fFourthHead;
nil)and">while (curNode.NextFourth <> nil) and
(curNode.NextFourth.Value.City < newNode.Value.City) do:= curNode.NextFourth;;
newNode.NextFourth := curNode.NextFourth;.NextFourth := newNode;
end;
procedure TPlex.Del(index: integer);i: integer;: TNodePtr;
if(index >= fCount) then;
if index = 0 then
RemoveFromSecondList(fFirstHead);:= fFirstHead.NextFirst;;
curNode := fFirstHead;
for i := index - 2 downto 0 do:= curNode.NextFirst;
RemoveFromSecondList(curNode.NextFirst);(curNode.NextFirst);(curNode.NextFirst);
curNode.NextFirst := curNode.NextFirst.NextFirst;;
end;
procedure TPlex.RemoveFromSecondList(node: TNodePtr);: TNodePtr;
if fSecondHead = node then:= fSecondHead.NextSecond;;;
curNode := fSecondHead;
nodedo:=curNode.NextSecond;">while curNode.NextSecond <> node do:= curNode.NextSecond;
curNode.NextSecond := curNode.NextSecond.NextSecond;
end;
procedure TPlex.RemoveFromThirdList(node: TNodePtr);: TNodePtr;
if fThirdHead = node then:= fThirdHead.NextThird;;;
curNode := fThirdHead;
nodedo:=curNode.NextThird;">while curNode.NextThird <> node do:= curNode.NextThird;
curNode.NextThird := curNode.NextThird.NextThird;;
procedure TPlex.RemoveFromFourthList(node: TNodePtr);: TNodePtr;
if fFourthHead = node then:= fFourthHead.NextFourth;;;
curNode := fFourthHead;
nodedo:=curNode.NextFourth;">while curNode.NextFourth <> node do:= curNode.NextFourth;
curNode.NextFourth := curNode.NextFourth.NextFourth;;
procedure TPlex.Sort(attribute: integer );i: integer;: boolean;
if Count < 2 then;
swap := true;swap do
swap := false;
GetI(i+1).Value.Surnamethen:=true;(i,i+1);;">for i := 0 to Count - 2 doGetI(i).Value.Surname > GetI(i + 1).Value.Surname then:= true;(i, i + 1);;
for i := Count - 1 to 1 doGetI(i).Value.Surname < GetI(i - 1).Value.Surname then:= true;(i - 1, i);;;;
=Count)or(index= Count) or (index < 0) then;
curNode := fFirsthead;
for I := 0 to index - 1 do:= curNode.NextFirst;;
result := curNode;;
TPlex.SwapLinks(left, right: integer);leftNode, rightNode : TNodePtr;:= GetI(left);:= GetI(right);
if (left = 0) then.NextFirst := rightNode.NextFirst;.NextFirst := leftNode;
fFirstHead := rightNode;.NextFirst := rightNode.NextFirst;.NextFirst := leftNode;
GetI(left - 1).NextFirst := rightNode;;
end;
procedure TPlex.Clear;
fCount := 0;
fFirstHead := nil;:= nil;:= nil;:= nil;
end;
TPlex.AddToIndex(Value: TMember; Index: integer);current, NewNode: TNodePtr;
if (index > fCount) then;
current := fFirstHead;(NewNode);.Value := Value;
if (index = 1) then.NextFirst := fFirstHead;:= NewNode;(NewNode);;;
2)do:=current.NextFirst;(index);;">while (index > 2) do:= current.NextFirst;(index);;
NewNode.NextFirst := current.NextFirst;.NextFirst := NewNode;
AddToSecondList(NewNode);(NewNode);(NewNode);;
end.
1.