求助:编写一个程序实现顺序队列的各种基本运算,并在此基础上设计一个主程序,完成如下功能:

编写一个程序实现顺序队列的各种基本运算,并在此基础上设计一个主程序,完成如下功能:
1. 建立一个空顺序队列
2. 入队
3. 出队
4. 判断队列是否为空
5. 取队列头元素
6. 遍历队列

第1个回答  2007-11-14
unit Unit4;

interface

uses
Windows,Sysutils,Classes;

type
PTTreeData = ^TTreeData;
TTreeData = packed record
NodeValue:Integer;
AHead : THandle;
StockID:string[10];
StockName:string[20];
NextPtr:PTTreeData ;
PrevPtr:PTTreeData ;
end;

TTreeClass = class(TObject)
private
Findex,FCount:Integer ;
HeaderNode:BOOL;
function newData:PTTreeData;
procedure IsBlankHeadLast(list:TTreeData);
function GetCount: Integer;
public
constructor Create;
function ADDData(s,str:string): PTTreeData;
procedure DelData(Cindnal:THandle);
procedure PreverFindData;
procedure BackFindData;
function GetFirst:cardinal;
function GetLast:cardinal;
function FindData(S:string):cardinal;
property FindexData: integer read Findex write Findex;
property Count:Integer read GetCount;
end;

var
AHandle,OleHandle,NewHandle:THandle;
First,Last,Header,BlanK :PTTreeData;
implementation

{ TTreeClass }

function TTreeClass.ADDData(s,str:string): PTTreeData;
begin
try
begin
Result := newData;
Result.AHead := LongInt(Result);
AHandle := Result.AHead ;
if not HeaderNode then
begin
IsBlankHeadLast(Result^);
Result.NextPtr := nil ;
Result.StockID := str;
Result.StockName := str;
Result.PrevPtr := Result;
First := Result ;
Last := Result ;
Header := Result ;
Result.NodeValue := FCount;
Inc(Findex);
Inc(FCount);
end
else
begin
Result.NextPtr := nil;
Result.StockID := str;
Result.StockName := str;
Result.PrevPtr := PTTreeData(OleHandle).NextPtr ;
Last := Result ;
Inc(Findex);
Inc(FCount);
end;
OleHandle := result.AHead ;
end;
except
Result := nil;
end;
end;

procedure TTreeClass.IsBlankHeadLast(list:TTreeData);
begin
HeaderNode := true ;
end;

procedure TTreeClass.BackFindData;
begin
//
end;

constructor TTreeClass.Create;
begin
Findex:= 0;
FCount:= 0;
HeaderNode := False;
end;

procedure TTreeClass.DelData(Cindnal:THandle);
begin
if HeaderNode then
begin
if FCount = 1 then
begin
Dispose(Header);
Findex := 0 ;
FCount := 0 ;
HeaderNode := False;
end
else
begin
if Cindnal<>0 then
begin
if PTTreeData(Cindnal).NextPtr = nil then
begin
PTTreeData(Cindnal).PrevPtr.NextPtr := nil;
Dispose(PTTreeData(Cindnal));
Dec(FCount);
end
else
begin
PTTreeData(Cindnal).NextPtr := BlanK.NextPtr ;
PTTreeData(Cindnal).PrevPtr := BlanK.PrevPtr ;
BlanK.NextPtr.PrevPtr := BlanK.PrevPtr.NextPtr ;
BlanK.PrevPtr.NextPtr := BlanK.NextPtr.PrevPtr ;
Dispose(PTTreeData(Cindnal));
Dec(FCount);
end;
end;
end;
end;
end;

function TTreeClass.GetFirst:cardinal;
begin
Result := Header.AHead ;
end;

function TTreeClass.GetLast:cardinal;
begin
Result := 0 ;
if PTTreeData(AHandle).NextPtr = nil then
begin
Result := PTTreeData(AHandle).AHead ;
end;
end;

function TTreeClass.newData: PTTreeData;
var
Node:PTTreeData;
begin
try
begin
New(Node);
result := PTTreeData(Node);
end;
except
result := nil;
end;
end;

procedure TTreeClass.PreverFindData;
begin

end;

function TTreeClass.FindData(S:string):cardinal;
var
nodehd:THandle;
begin
Result := 0 ;
PTTreeData(nodehd).AHead := PTTreeData(AHandle).AHead ;
while not PTTreeData(nodehd).AHead <> Header.AHead do
begin
if PTTreeData(nodehd).StockID <> s then
begin
PTTreeData(nodehd).AHead := PTTreeData(nodehd).PrevPtr.AHead ;
end
else
begin
Result := PTTreeData(nodehd).AHead ;
Break;
end;
end;
end;

function TTreeClass.GetCount: Integer;
begin
Result := FCount ;
end;

end.