求教:用指针构建链表的程序注释 ( 积分: 50 )

  • 主题发起人 主题发起人 temarg
  • 开始时间 开始时间
T

temarg

Unregistered / Unconfirmed
GUEST, unregistred user!
在学习指针类型中,基本概念总搞不清楚,以致看不懂基本的程序.现将一个示例程序附后,请各位朋友给出详细注释(主要是实现部分的四个过程)为本人解惑.<br>清单如下,请给出详细注释.原有注释可作为参考.<br><br>unit&nbsp;zhizhen01Unit1;<br><br>interface<br><br>uses<br>&nbsp;&nbsp;Windows,&nbsp;Messages,&nbsp;SysUtils,&nbsp;Variants,&nbsp;Classes,&nbsp;Graphics,&nbsp;Controls,&nbsp;Forms,<br>&nbsp;&nbsp;Dialogs,&nbsp;StdCtrls;<br>type<br>&nbsp;&nbsp;TLinkExam&nbsp;=&nbsp;class(TForm)<br>&nbsp;&nbsp;&nbsp;&nbsp;ListBox1:&nbsp;TListBox;<br>&nbsp;&nbsp;&nbsp;&nbsp;Edit1:&nbsp;TEdit;<br>&nbsp;&nbsp;&nbsp;&nbsp;Label1:&nbsp;TLabel;<br>&nbsp;&nbsp;&nbsp;&nbsp;Label2:&nbsp;TLabel;<br>&nbsp;&nbsp;&nbsp;&nbsp;BtnList:&nbsp;TButton;<br>&nbsp;&nbsp;&nbsp;&nbsp;BtnDel:&nbsp;TButton;<br>&nbsp;&nbsp;&nbsp;&nbsp;BtnQuit:&nbsp;TButton;<br>&nbsp;&nbsp;&nbsp;&nbsp;Label3:&nbsp;TLabel;<br>&nbsp;&nbsp;&nbsp;&nbsp;Button1:&nbsp;TButton;<br>&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;Edit1KeyPress(Sender:&nbsp;TObject;&nbsp;var&nbsp;Key:&nbsp;Char);<br>&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;FormCreate(Sender:&nbsp;TObject);<br>&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;BtnListClick(Sender:&nbsp;TObject);<br>&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;BtnDelClick(Sender:&nbsp;TObject);<br>&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;BtnQuitClick(Sender:&nbsp;TObject);<br>&nbsp;&nbsp;private<br>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;Private&nbsp;declarations&nbsp;}<br>&nbsp;&nbsp;public<br>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;Public&nbsp;declarations&nbsp;}<br>&nbsp;&nbsp;end;<br>var<br>&nbsp;&nbsp;LinkExam:&nbsp;TLinkExam;<br>implementation<br>{$R&nbsp;*.dfm}<br>&nbsp;&nbsp;type<br>&nbsp;&nbsp;PLink=^Node;<br>&nbsp;&nbsp;Node=Record<br>&nbsp;&nbsp;Data:string[30];<br>&nbsp;&nbsp;Next:PLink;<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;var<br>&nbsp;&nbsp;DtRec:PLink;<br>procedure&nbsp;TLinkExam.FormCreate(Sender:&nbsp;TObject);<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;DtRec:=NIL;<br>&nbsp;&nbsp;end;<br>procedure&nbsp;TLinkExam.Edit1KeyPress(Sender:&nbsp;TObject;&nbsp;var&nbsp;Key:&nbsp;Char);<br>var<br>tempP,P:PLink;<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;key=#13&nbsp;then&nbsp;&nbsp;//如果按下回车键<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;new(tempP);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//创建一个节点<br>&nbsp;tempP^.Data:=Edit1.Text;<br>&nbsp;tempP^.Next:=NIL;<br>&nbsp;IF&nbsp;DtRec=NIL&nbsp;Then&nbsp;&nbsp;&nbsp;&nbsp;//如果链表为空<br>&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;New(DtRec);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//创建链表<br>&nbsp;&nbsp;&nbsp;DtRec:=tempP;<br>&nbsp;&nbsp;&nbsp;end<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//如果链表不为空<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p:=DtRec;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;p^.Next&lt;&gt;NIL&nbsp;do&nbsp;&nbsp;&nbsp;//找表尾<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P:=P^.Next;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p^.next:=tempP;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//将新结点添加到表尾<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;edit1.Clear;<br>&nbsp;&nbsp;&nbsp;edit1.SetFocus;<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>end;<br>procedure&nbsp;TLinkExam.BtnListClick(Sender:&nbsp;TObject);<br>var<br>p:Plink;<br>begin<br>&nbsp;listBox1.Clear;<br>&nbsp;p:=DtRec;<br>&nbsp;repeat<br>&nbsp;listBox1.Items.Add(P^.Data);<br>&nbsp;P:=P^.Next;<br>&nbsp;until&nbsp;P=Nil;<br>&nbsp;&nbsp;end;<br>procedure&nbsp;TLinkExam.BtnDelClick(Sender:&nbsp;TObject);<br>var<br>p,P1:Plink;<br>i:integer;<br>begin<br>&nbsp;&nbsp;i:=0;<br>&nbsp;&nbsp;p:=DtRec;<br>&nbsp;&nbsp;if&nbsp;P=NIL&nbsp;then&nbsp;&nbsp;&nbsp;//如果链表为空表<br>&nbsp;&nbsp;showmessage('链表为空表!')<br>&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;如果不为空表<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;P^.Data=Edit1.Text&nbsp;then&nbsp;&nbsp;{如果链表的第一个节点<br>&nbsp;&nbsp;&nbsp;&nbsp;为要删除的节点}<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;DtRec:=P^.Next;<br>&nbsp;&nbsp;&nbsp;&nbsp;P^.Next:=NIL;<br>&nbsp;&nbsp;&nbsp;&nbsp;P:=dtRec;<br>&nbsp;&nbsp;&nbsp;&nbsp;end<br>&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;{如果第一个节点不是要删除的节点}<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;p1:=p^.Next;<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;p1&lt;&gt;NIL&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;repeat<br>&nbsp;&nbsp;if&nbsp;p1.Data=edit1.Text&nbsp;then&nbsp;//如果找到了一个要删除的节点<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p^.Next:=p1^.Next;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p1:=p;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i:=i+1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p:=p1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p1:=p1^.Next;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br>&nbsp;&nbsp;&nbsp;&nbsp;until&nbsp;p1=NIL;<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;i=0&nbsp;then&nbsp;&nbsp;&nbsp;{如果链表不存在要删除的节点}<br>&nbsp;&nbsp;&nbsp;&nbsp;showmessage('无匹配的数据');<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;edit1.clear;<br>&nbsp;&nbsp;Edit1.SetFocus&nbsp;;<br>end;<br>procedure&nbsp;TLinkExam.BtnQuitClick(Sender:&nbsp;TObject);<br>begin<br>close;<br>end;<br><br>end.
 
多看几本不同出版社的&lt;数据结构&gt;就懂啦,这个钱不能省的<br>它们的描述不一样,不过都是说同一件事,总有一种描述适合你滴,<br>或者上网看看别人推荐的,<br>祝你成功!
 
感觉一目了然,LZ有哪些地方不懂??
 
一目了然<br><br>unit&nbsp;untDict;<br><br>interface<br>uses&nbsp;SysUtils,StrUtils,&nbsp;Variants,&nbsp;Classes,Dialogs;<br><br>const&nbsp;Words='words.txt';&nbsp;//字典文件名<br><br><br>//链表元素<br>type<br>PChainElem=^ChainElem;<br>ChainElem=record<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value:Pointer;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//指向一个TCharTreeNode<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sucElem:PChainElem;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//后继节点指针(即:子树根节点及其兄弟节点)<br>end;<br>//链表类<br>type&nbsp;TChain=class<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;head,tail:PChainElem;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;published<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;constructor&nbsp;create;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;destructor&nbsp;destroy;override;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;ApendElem(curElem:PChainElem);&nbsp;//在链表尾追加一个节点<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;GetNext(curElem:PChainElem):PChainElem;&nbsp;&nbsp;&nbsp;//返回当前节点的下一个节点(兄弟)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;property&nbsp;ChainHead:Pointer&nbsp;read&nbsp;GetHead&nbsp;write&nbsp;SetChainHead&nbsp;default&nbsp;nil;&nbsp;//头节点为空,说明是叶子了。(父节点)}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;GetHead:PChainElem;&nbsp;//获得表头节点<br><br>end;<br><br>//树节点<br>type&nbsp;TCharTreeNode=class{(TChain)}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sValue:Word;//保存汉字的索引,通过该值可以计算出汉字的机内码,从而还原成汉字<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WordEnd:Boolean;&nbsp;&nbsp;//成词标记<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WordFreq:Word;&nbsp;//词频<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Chain:TChain;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//儿子节点组成的链表<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ParentNode:TCharTreeNode;&nbsp;//父节点指针<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;&nbsp;GetCharacter:string;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;SetCharacter(s:String);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;SetWordEnd(V:boolean);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;SetWordFreq(AFreq:Word);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;published<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;constructor&nbsp;create;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;destructor&nbsp;destroy;override;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;AddChild(const&nbsp;character:string;wFreq:longint=0;Wordend:Boolean=false):TCharTreeNode;&nbsp;&nbsp;//<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;GetFirstChild:TCharTreeNode;&nbsp;//第一个孩子节点<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;GetFirstElem:PChainElem;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;GetNextSibling(Elem:PChainElem):TCharTreeNode;&nbsp;//获得兄弟节点指针}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;GetNextElem(Elem:PChainElem):PChainElem;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;property&nbsp;Character:string&nbsp;read&nbsp;&nbsp;GetCharacter&nbsp;write&nbsp;SetCharacter&nbsp;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;property&nbsp;IsWordEnd:Boolean&nbsp;read&nbsp;wordEnd&nbsp;write&nbsp;SetWordEnd&nbsp;default&nbsp;false;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;property&nbsp;WordFreqs:Word&nbsp;&nbsp;read&nbsp;WordFreq&nbsp;write&nbsp;SetWordFreq&nbsp;default&nbsp;1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;GetParent:TCharTreeNode;&nbsp;&nbsp;//获得父节点指针<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;GetHead:PChainElem;<br>end;<br><br>//树<br>type&nbsp;TCharTree=class<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root:array[Word]&nbsp;of&nbsp;TCharTreeNode;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NodeCount:LongWord;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//节点个数<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;setCount(V:LongWord);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;FreeAllNode(Node:TCharTreeNode);<br>&nbsp;&nbsp;&nbsp;&nbsp;public<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;constructor&nbsp;create;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;destructor&nbsp;destroy;override;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;published<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;property&nbsp;Count:LongWord&nbsp;read&nbsp;NodeCount&nbsp;write&nbsp;SetCount;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;GetRoot(i:Word):TCharTreeNode;<br>end;<br><br>//数据库的数据载入到树---字典类<br>type&nbsp;TDictType=(dtOrder,dtReveser);<br><br>type&nbsp;&nbsp;PFreqAndWord=^TFreqAndWord;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TFreqAndWord=record<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iFreq,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iLen:Integer;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br><br><br>type&nbsp;TArrayString=array[0..249]of&nbsp;TFreqAndWord;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TArrayBool=array[0..249]of&nbsp;Boolean;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PArrayString=^TArrayString;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PArrayBool=^TArrayBool;<br><br>type&nbsp;TInterfacedDict=class(TInterfacedobject)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FTree:TCharTree;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FDictType:TDictType;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FDictPath:string;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;NodesCount:LongWord;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;SetNodeCount(ACount:LongWord);<br>&nbsp;&nbsp;&nbsp;&nbsp;protected<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;SetDictType(AType:TDictType);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;SetDictPath(Apath:string);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;function&nbsp;ChangeDict(APath:string):TInterfacedDict;virtual;&nbsp;//切换字典<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;function&nbsp;PlusDict(APath:string):TInterfacedDict;virtual;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;FindCharacter(S:AnsiString;nd:TCharTreeNode=nil):TCharTreeNode;//若nd=nil,则是查找根节点。否则,在nd的儿子里查找<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//function&nbsp;FindWordInDict(S:&nbsp;string):&nbsp;TCharTreeNode;virtual;&nbsp;&nbsp;//S是否是一个词<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;&nbsp;Trace(node1:TCharTreeNode):string;virtual;&nbsp;//没有匹配到,则须向上回溯<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;&nbsp;TraceAll(node1:TCharTreeNode;var&nbsp;FItem:TArrayString):Integer;virtual;&nbsp;//没有匹配到,则须向上回溯(找出路径上所有可以成词的词)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;GetRoot(i:word):TCharTreeNode;overload;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;GetRoot(c:AnsiString):TCharTreeNode;overload;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;GetFreq(var&nbsp;nd:TCharTreeNode):word;virtual;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;GetFee(nd:TCharTreeNode):word;virtual;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;constructor&nbsp;create;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;destructor&nbsp;Destroy;override;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;LoadDict(APath:&nbsp;string);virtual;&nbsp;&nbsp;&nbsp;&nbsp;//载入不同的字典---&gt;由子类去实现。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;property&nbsp;Tree:TCharTree&nbsp;read&nbsp;FTree&nbsp;write&nbsp;FTree;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;property&nbsp;Count:LongWord&nbsp;read&nbsp;NodesCount&nbsp;write&nbsp;SetNodeCount;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;property&nbsp;DictType:TDictType&nbsp;read&nbsp;FDictType&nbsp;{write&nbsp;SetDictType};&nbsp;&nbsp;//只读<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;property&nbsp;DictPath:string&nbsp;&nbsp;read&nbsp;FDictPath&nbsp;write&nbsp;SetDictPath;<br>&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;AfterConstruction;&nbsp;override;<br>end;<br>type&nbsp;TDict=class(TInterfacedDict)&nbsp;&nbsp;//单例类<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;published<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;LoadDict(APath:&nbsp;string);override;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;function&nbsp;GetInstance(chooce:Integer):TDict;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;constructor&nbsp;Create(APath:&nbsp;string);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;function&nbsp;CreateInstance(APath:string):Tdict;&nbsp;//创建单例类<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;function&nbsp;ChangeDict(APath:string):TInterfacedDict;override;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;function&nbsp;PlusDict(APath:string):TInterfacedDict;&nbsp;override;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;ReleaseInstance;&nbsp;//释放单例类<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;destructor&nbsp;Destroy;override;<br>end;<br>type&nbsp;TReverseDict=class(TInterfacedDict)&nbsp;//逆序载入字典,供逆向最大匹配使用<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;published<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;LoadDict(APath:&nbsp;string);override;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;function&nbsp;GetInstance(chooce:Integer):TReverseDict;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;constructor&nbsp;Create(APath:&nbsp;string);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;function&nbsp;CreateInstance(APath:string):TReverseDict;&nbsp;//创建单例类<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;function&nbsp;ChangeDict(APath:string):TInterfacedDict;override;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;function&nbsp;PlusDict(APath:string):TInterfacedDict;override;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;ReleaseInstance;&nbsp;//释放单例类<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;destructor&nbsp;Destroy;override;<br>end;<br><br>var<br>&nbsp;&nbsp;DictInstance:TDict;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{正序字典和逆序字典的实例}<br>&nbsp;&nbsp;RevDictInstance:TReverseDict;<br><br>implementation<br>uses&nbsp;untConst{,IniOp};<br>var&nbsp;<br>&nbsp;&nbsp;iDictRefCount,iRevDictRefCount:Integer;&nbsp;{字典的引用计数}<br>&nbsp;&nbsp;<br><br>{&nbsp;TChain&nbsp;}<br><br>procedure&nbsp;TChain.ApendElem(curElem:&nbsp;PChainElem);<br>{var<br>&nbsp;&nbsp;curPointer:PChainElem;}<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;Self.head=nil&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;head:=curElem;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tail:=curElem;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tail.sucElem:=curElem;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tail:=curElem;<br>end;<br><br>constructor&nbsp;TChain.create;<br>begin<br>&nbsp;&nbsp;head:=nil;<br>&nbsp;&nbsp;tail:=nil;<br>end;<br><br>destructor&nbsp;TChain.destroy;<br>var<br>&nbsp;&nbsp;Pcur,Pnext:PChainElem;<br>begin<br>&nbsp;&nbsp;Pcur:=head;<br>&nbsp;&nbsp;while&nbsp;(Pcur&lt;&gt;nil)&nbsp;do<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pNext:=pCur^.sucElem;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;Pcur^.value&lt;&gt;nil&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TCharTreeNode(Pcur^.value).Free;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dispose(pCur);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pCur:=pNext;<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;inherited;<br>end;<br><br>function&nbsp;TChain.GetHead:PChainElem;<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result:=head;<br>end;<br><br>function&nbsp;TChain.GetNext(curElem:&nbsp;PChainElem):&nbsp;PChainElem;<br>begin<br>&nbsp;&nbsp;&nbsp;Result:=curElem^.sucElem;<br>end;<br><br>{&nbsp;TCharTreeNode&nbsp;}<br><br>function&nbsp;TCharTreeNode.AddChild(const&nbsp;character:&nbsp;string;wFreq:longint;Wordend:Boolean):TCharTreeNode;<br>var<br>&nbsp;&nbsp;tn:TCharTreeNode;<br>&nbsp;&nbsp;ChainItem:PChainElem;<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tn:=TCharTreeNode.create;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tn.sValue:=word(byte(character[1])&nbsp;shl&nbsp;8)&nbsp;+&nbsp;word(character[2]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tn.WordEnd:=Wordend;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tn.WordFreq:=wFreq;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tn.ParentNode:=Self;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;New(ChainItem);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ChainItem^.value:=pointer(tn);&nbsp;&nbsp;///<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ChainItem^.sucElem:=nil;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Self.Chain.ApendElem(ChainItem);&nbsp;&nbsp;//加入到儿子链表中<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result:=tn;<br>end;<br><br>constructor&nbsp;TCharTreeNode.create;<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;Chain:=TChain.create;<br>&nbsp;&nbsp;&nbsp;&nbsp;ParentNode:=nil;<br>end;<br><br>destructor&nbsp;TCharTreeNode.destroy;<br>begin<br>&nbsp;&nbsp;Chain.destroy;<br>&nbsp;&nbsp;inherited;<br>end;<br><br>function&nbsp;TCharTreeNode.GetCharacter:&nbsp;string;<br>{var<br>&nbsp;//S:string;<br>&nbsp;preByte,sucByte:Byte;}<br>begin<br>&nbsp;&nbsp;SetLength(Result,2);<br>&nbsp;&nbsp;Result[1]:=Char(Byte((sValue&nbsp;and&nbsp;65280)&nbsp;shr&nbsp;8));<br>&nbsp;&nbsp;Result[2]:=Char(Byte(sValue&nbsp;and&nbsp;255));<br>end;<br><br><br>function&nbsp;TCharTreeNode.GetFirstChild:&nbsp;TCharTreeNode;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//获得第一个孩子节点<br>begin<br>&nbsp;&nbsp;&nbsp;if&nbsp;Assigned(Chain.GetHead.value)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result:=&nbsp;TCharTreeNode(Chain.GetHead.value)<br>&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result:=nil;<br>end;<br><br>function&nbsp;TCharTreeNode.GetParent:&nbsp;TCharTreeNode;<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result:=Self.ParentNode;<br>end;<br><br>function&nbsp;TCharTreeNode.GetNextSibling(Elem:PChainElem):&nbsp;TCharTreeNode;&nbsp;&nbsp;&nbsp;//获得当前节点的兄弟<br>begin&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//参数为&nbsp;当前节点所在的PChainElem<br>&nbsp;&nbsp;&nbsp;if&nbsp;Elem.sucElem&lt;&gt;nil&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result:=&nbsp;TCharTreeNode(Elem.sucElem.value)<br>&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result:=nil;<br>end;<br><br>procedure&nbsp;TCharTreeNode.SetCharacter(s:&nbsp;String);<br>begin<br>&nbsp;&nbsp;sValue:=word(Byte(S[1])&nbsp;shl&nbsp;8)&nbsp;+word(Byte(s[2]));<br>end;<br><br>procedure&nbsp;TCharTreeNode.SetWordEnd(V:&nbsp;boolean);<br>begin<br>&nbsp;&nbsp;&nbsp;WordEnd:=V;<br>end;<br><br>function&nbsp;TCharTreeNode.GetNextElem(Elem:&nbsp;PChainElem):&nbsp;PChainElem;<br>begin<br>&nbsp;&nbsp;&nbsp;Result:=Elem.sucElem;<br>end;<br><br>function&nbsp;TCharTreeNode.GetFirstElem:&nbsp;PChainElem;<br>begin<br>&nbsp;&nbsp;&nbsp;Result:=Self.Chain.GetHead;<br>end;<br><br>function&nbsp;TCharTreeNode.GetHead:&nbsp;PChainElem;<br>begin<br>Result:=Chain.head;<br>end;<br><br>procedure&nbsp;TCharTreeNode.SetWordFreq(AFreq:&nbsp;Word);<br>begin<br>&nbsp;&nbsp;WordFreq:=AFreq;<br>end;<br><br>{&nbsp;TCharTree&nbsp;}<br><br>constructor&nbsp;TCharTree.create;<br>var<br>&nbsp;&nbsp;I:Word;<br>begin<br><br>&nbsp;for&nbsp;i:=0&nbsp;to&nbsp;65535&nbsp;do&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//根<br>&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;root:=TCharTreeNode.create;<br>&nbsp;&nbsp;&nbsp;&nbsp;root.sValue:=i;<br>&nbsp;&nbsp;&nbsp;&nbsp;root.WordEnd:=False;&nbsp;&nbsp;//默认不是单字词&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;end;<br>&nbsp;NodeCount:=65536;<br>end;<br><br>destructor&nbsp;TCharTree.destroy;<br>var<br>&nbsp;&nbsp;i:Word;<br>begin<br>&nbsp;&nbsp;//做树的遍历,释放每一个节点<br>&nbsp;&nbsp;for&nbsp;i:=0&nbsp;to&nbsp;65535&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FreeAllNode(root);<br>&nbsp;&nbsp;inherited;<br>end;<br><br>procedure&nbsp;TCharTree.FreeAllNode(Node:TCharTreeNode);<br>var<br>&nbsp;&nbsp;V:Pointer;<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;Node=nil&nbsp;then&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(Node.Chain=nil)&nbsp;&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Node.Free;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(Node.GetHead=nil)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Node.Free;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;Node.GetHead.value&lt;&gt;nil&nbsp;then&nbsp;&nbsp;&nbsp;//如果它还有儿子节点,<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;V:=Node.GetHead.value;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Node.Chain.head:=Node.GetHead.sucElem;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FreeAllNode(TCharTreeNode(V));<br>&nbsp;&nbsp;&nbsp;&nbsp;end<br>&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TCharTreeNode(V).Free;<br>end;<br><br>function&nbsp;TCharTree.GetRoot(i:&nbsp;Word):&nbsp;TCharTreeNode;<br>begin<br>&nbsp;&nbsp;Result:=root;<br>end;<br><br>procedure&nbsp;TCharTree.setCount(v:LongWord);<br>begin<br>&nbsp;&nbsp;&nbsp;NodeCount:=v;<br>end;<br><br><br><br>{&nbsp;TDict&nbsp;}<br>class&nbsp;function&nbsp;TDict.ChangeDict(APath:&nbsp;string):&nbsp;TInterfacedDict;<br>begin<br>&nbsp;&nbsp;&nbsp;if&nbsp;Assigned(TDict.GetInstance(0))&nbsp;then<br>&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;TDict.GetInstance(0).DictPath=Trim(APath)&nbsp;then&nbsp;&nbsp;//字典相同<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result:=TDict.GetInstance(0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TDict.GetInstance(0).ReleaseInstance;&nbsp;&nbsp;//字典不同,则释放以前字典,并重新加载新字典<br>&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;Result:=TDict.CreateInstance(APath);<br>&nbsp;&nbsp;&nbsp;try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result.LoadDict(APath);<br>&nbsp;&nbsp;&nbsp;except<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{$Message&nbsp;Hint&nbsp;'show&nbsp;some&nbsp;error&nbsp;information&nbsp;abort&nbsp;Dict'}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Abort;<br>&nbsp;&nbsp;&nbsp;end;<br>end;<br><br>constructor&nbsp;TDict.Create(APath:&nbsp;string);<br>begin<br>//&nbsp;&nbsp;inherited&nbsp;Create;<br>//&nbsp;&nbsp;LoadDict(APath+words);<br>&nbsp;&nbsp;raise&nbsp;Exception.CreateFmt(StrCreateError,[ClassName]);<br>end;<br><br>class&nbsp;function&nbsp;TDict.CreateInstance(APath:&nbsp;string):TDict;<br>begin<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;Result:=GetInstance(1);<br>&nbsp;&nbsp;//LoadDict(APath+words);<br>end;<br><br>destructor&nbsp;TDict.Destroy;<br>begin<br>&nbsp;&nbsp;if&nbsp;GetInstance(0)=Self&nbsp;then&nbsp;GetInstance(2);<br>&nbsp;&nbsp;inherited;<br>end;<br><br>class&nbsp;function&nbsp;TDict.GetInstance(chooce:&nbsp;Integer):&nbsp;TDict;<br>//const&nbsp;instance:TDict=nil;<br>begin<br>&nbsp;&nbsp;case&nbsp;chooce&nbsp;of<br>&nbsp;&nbsp;0:&nbsp;;&nbsp;&nbsp;&nbsp;//供释放使用<br>&nbsp;&nbsp;1:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//创建<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Inc(iDictRefCount,1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;not&nbsp;Assigned(DictInstance)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DictInstance:=inherited&nbsp;Create;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//LoadDict(APath+words);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;2:&nbsp;&nbsp;DictInstance:=nil;&nbsp;&nbsp;//赋值<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;raise&nbsp;Exception.CreateFmt(strCreateParamError,[ClassName]);<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;Result:=DictInstance;<br>end;<br><br>procedure&nbsp;TDict.LoadDict(APath:&nbsp;string);<br>var<br>&nbsp;&nbsp;nd,tmpNode:TCharTreeNode;<br>&nbsp;&nbsp;str:string;<br>&nbsp;&nbsp;index:Word;<br>&nbsp;&nbsp;i,j:LongWord;<br>&nbsp;&nbsp;{Item:PChainElem;&nbsp;}<br>&nbsp;&nbsp;{isExsit:Boolean;}<br>&nbsp;&nbsp;F:TextFile;<br>&nbsp;&nbsp;PosDel1,PosDel2:Integer;<br>&nbsp;&nbsp;wfreq:string;<br><br>&nbsp;&nbsp;lst:TStringList;<br>&nbsp;&nbsp;sTip:string;<br>&nbsp;&nbsp;procedure&nbsp;Split(Splitor,Str:string);&nbsp;//sSubstr分割sStr,存入TStringList.<br>&nbsp;&nbsp;var<br>&nbsp;&nbsp;&nbsp;&nbsp;PSplitor,PStr,PPos:PAnsiChar;<br>&nbsp;&nbsp;&nbsp;&nbsp;s:string;<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;PSplitor:=PAnsiChar(Splitor);<br>&nbsp;&nbsp;&nbsp;&nbsp;PStr:=PAnsiChar(Str);<br>&nbsp;&nbsp;&nbsp;&nbsp;PPos:=PAnsiChar(Str);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;PPos&lt;&gt;#0&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(PPos^&lt;&gt;PSplitor^)&nbsp;and&nbsp;(PPos^&lt;&gt;#0)&nbsp;do&nbsp;inc(PPos);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetString(S,PStr,PPos-PStr);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lst.Add(S);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;PPos^&lt;&gt;#0&nbsp;then&nbsp;inc(PPos)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;break;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pstr:=ppos;<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;end;<br><br>begin<br>&nbsp;&nbsp;&nbsp;SetDictType(dtOrder);&nbsp;&nbsp;&nbsp;//指定字典属性<br>&nbsp;&nbsp;&nbsp;FDictPath:=APath;<br><br>&nbsp;&nbsp;&nbsp;lst:=TStringList.Create;<br>&nbsp;&nbsp;&nbsp;try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AssignFile(F,Apath);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Reset(F);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;except<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageDlg((Format(StrFileNotFound,[APath])),mtWarning,[mbOK],0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Abort;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(not&nbsp;Eof(F))&nbsp;do&nbsp;&nbsp;//把每一个词加载到树上<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Readln(F,str);&nbsp;&nbsp;//在字典中取词<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sTip:=str;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Split(#9,str);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{格式如:&nbsp;22072 &quot;分段&quot; 5}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str:=lst.Strings[1];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PosDel1:=Pos('&quot;',str);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{如果是汉字,则左右两侧有双引号,去掉双引号}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PosDel2:=LastDelimiter('&quot;',str);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str:=Copy(str,PosDel1+1&nbsp;,PosDel2-PosDel1-1);&nbsp;//剔除双引号<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;lst.Count&gt;=3&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wfreq:=lst.Strings[2];<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lst.Clear;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;Length(str)&lt;=1&nbsp;then&nbsp;Continue;&nbsp;//不是汉字(应该不会出现)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;index:=word(Byte(str[1])&nbsp;shl&nbsp;8)+&nbsp;word(Byte(str[2]));&nbsp;&nbsp;//树根节点索引<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;except<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageDlg(Format(StrRowError,[sTip]),mtWarning,[mbOK],0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Halt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nd:=Tree.root[index];<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;Length(str)=2&nbsp;then&nbsp;&nbsp;//单字词<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nd.WordFreq:=nd.WordFreq+StrToInt(wFreq);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nd.WordEnd:=True;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue&nbsp;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;i:=1&nbsp;to&nbsp;(Length(str)&nbsp;&nbsp;div&nbsp;2)-1&nbsp;&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmpNode:=FindCharacter(Copy(str,i*2+1,2),nd);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;tmpNode=nil&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nd:=nd.AddChild(Copy(str,i*2+1,2))&nbsp;//值相等的节点不存在。追加。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nd:=tmpNode;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Continue;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tree.Count:=tree.count+1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//树节点个数加1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;&nbsp;&nbsp;//end&nbsp;'for'<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nd.WordFreq:=StrToIntdef(wfreq,1);&nbsp;&nbsp;&nbsp;//词频<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nd.WordEnd:=True;&nbsp;&nbsp;//词结束标记<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;except<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageDlg(StrLoadDictError,mtInformation,[MBOK],0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Abort;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;finally<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lst.Free;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseFile(F);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>end;<br><br><br>class&nbsp;function&nbsp;TDict.PlusDict(APath:&nbsp;string):&nbsp;TInterfacedDict;<br>begin<br>&nbsp;&nbsp;{&nbsp;if&nbsp;Assigned(TDict.GetInstance(0))&nbsp;then<br>&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TDict(TDict.GetInstance(0))<br>&nbsp;&nbsp;&nbsp;end;&nbsp;}<br>end;<br><br>procedure&nbsp;TDict.ReleaseInstance;<br>begin<br>&nbsp;&nbsp;Dec(iDictRefCount,1);<br>&nbsp;&nbsp;if&nbsp;iDictRefCount&gt;0&nbsp;then&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;GetInstance(0)&lt;&gt;nil&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetInstance(0).Free;<br>end;<br><br><br><br><br><br>{&nbsp;TInterfacedDict&nbsp;}<br><br>procedure&nbsp;TInterfacedDict.AfterConstruction;<br>begin<br>&nbsp;&nbsp;inherited;<br>&nbsp;&nbsp;//<br>end;<br><br>class&nbsp;function&nbsp;TInterfacedDict.ChangeDict(APath:&nbsp;string):&nbsp;TInterfacedDict;<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;//空.&nbsp;须被覆盖.本想使用Virtui+Abstract修饰,但抽象类不能创建实例.<br>&nbsp;&nbsp;&nbsp;//下同.<br>end;<br><br>constructor&nbsp;TInterfacedDict.Create;<br>begin<br>&nbsp;&nbsp;inherited;<br>&nbsp;&nbsp;FTree:=TCharTree.Create;<br>end;<br><br>destructor&nbsp;TInterfacedDict.Destroy;<br>begin<br>&nbsp;&nbsp;FreeAndNil(FTree);<br>&nbsp;&nbsp;inherited;<br>end;<br><br>function&nbsp;TInterfacedDict.FindCharacter(S:&nbsp;AnsiString;<br>&nbsp;&nbsp;nd:&nbsp;TCharTreeNode):&nbsp;TCharTreeNode;<br>var&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//查找nd的子节点中值为S的节点。若找到了,则返回该子节点,否则返回nil<br>&nbsp;&nbsp;Item:PChainElem;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//若nd&nbsp;缺省,则返回值为S的根节点<br>begin<br>&nbsp;&nbsp;&nbsp;if&nbsp;nd=nil&nbsp;then&nbsp;&nbsp;&nbsp;&nbsp;//返回根节点<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result:=GetRoot(S)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Result:=GetRoot(word(Byte(S[1])&nbsp;shl&nbsp;8)&nbsp;+word(byte(s[2])))<br>&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item:=nd.GetHead;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(item&lt;&gt;nil)&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(TCharTreeNode(item.value)).Character=s&nbsp;then&nbsp;//找到值相等的儿子节点<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result:=&nbsp;TCharTreeNode(item.value);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item:=item.sucElem;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result:=nil;<br>&nbsp;&nbsp;end;<br>end;<br><br><br><br><br>function&nbsp;TInterfacedDict.GetFee(nd:&nbsp;TCharTreeNode):&nbsp;word;<br>begin<br>&nbsp;&nbsp;&nbsp;//<br>end;<br><br>function&nbsp;TInterfacedDict.GetFreq(var&nbsp;nd:&nbsp;TCharTreeNode):&nbsp;word;<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;Result:=nd.WordFreq;<br>end;<br><br>function&nbsp;TInterfacedDict.GetRoot(i:word):TCharTreeNode;<br>begin<br>&nbsp;&nbsp;&nbsp;Result:=Tree.GetRoot(i);<br>end;<br><br>function&nbsp;TInterfacedDict.GetRoot(c:&nbsp;AnsiString):&nbsp;TCharTreeNode;<br>var<br>&nbsp;&nbsp;wIndex:word;<br>begin<br>&nbsp;&nbsp;&nbsp;wIndex:=Word(byte(c[1])&nbsp;shl&nbsp;8)&nbsp;+&nbsp;Word(c[2]);<br>&nbsp;&nbsp;&nbsp;//if&nbsp;FTree=nil&nbsp;then&nbsp;ShowMessage('tree&nbsp;nil');<br>&nbsp;&nbsp;&nbsp;Result:=Tree.GetRoot(wIndex);<br>end;<br><br>procedure&nbsp;TInterfacedDict.LoadDict(APath:&nbsp;string);<br>begin<br>&nbsp;&nbsp;//<br>end;<br><br>function&nbsp;TInterfacedDict.NodesCount:&nbsp;LongWord;<br>begin<br>&nbsp;&nbsp;&nbsp;Result:=Tree.NodeCount;<br>end;<br><br>class&nbsp;function&nbsp;TInterfacedDict.PlusDict(APath:&nbsp;string):&nbsp;TInterfacedDict;<br>begin<br>&nbsp;&nbsp;//<br>end;<br><br>procedure&nbsp;TInterfacedDict.SetDictPath(Apath:&nbsp;string);<br>begin<br>&nbsp;&nbsp;&nbsp;FDictPath:=Apath;<br>end;<br><br>procedure&nbsp;TInterfacedDict.SetDictType(AType:&nbsp;TDictType);<br>begin<br>&nbsp;&nbsp;FDictType:=AType;<br>end;<br><br>procedure&nbsp;TInterfacedDict.SetNodeCount(ACount:&nbsp;LongWord);<br>begin<br>&nbsp;&nbsp;&nbsp;Tree.NodeCount:=ACount;<br>end;<br><br>function&nbsp;TInterfacedDict.Trace(node1:&nbsp;TCharTreeNode):&nbsp;string;<br>var<br>&nbsp;&nbsp;isStart:Boolean;<br>&nbsp;&nbsp;nd:TCharTreeNode;<br>begin<br>&nbsp;&nbsp;isStart:=False;<br>&nbsp;&nbsp;Result:='';<br>&nbsp;&nbsp;if&nbsp;&nbsp;node1=nil&nbsp;then&nbsp;raise&nbsp;Exception.Create('Trace错误!');&nbsp;&nbsp;&nbsp;//如果node1=nil&nbsp;可能出现死循环<br>&nbsp;&nbsp;repeat<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;node1.IsWordEnd&nbsp;then&nbsp;isStart:=True;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;isStart&nbsp;&nbsp;then&nbsp;Result:=node1.Character+Result;&nbsp;//分词结果<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nd:=node1.GetParent;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;nd=nil&nbsp;then&nbsp;&nbsp;Break;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{回溯到了根节点}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node1:=nd;<br>&nbsp;&nbsp;until&nbsp;(false);&nbsp;&nbsp;//回溯<br>end;<br><br>function&nbsp;TInterfacedDict.TraceAll(node1:&nbsp;TCharTreeNode;var&nbsp;FItem:TArrayString):Integer;<br>var<br>&nbsp;&nbsp;nd:TCharTreeNode;<br>&nbsp;&nbsp;bItem:TArrayBool;<br>&nbsp;&nbsp;i,j:Integer;<br>begin<br>&nbsp;&nbsp;if&nbsp;&nbsp;node1=nil&nbsp;then&nbsp;raise&nbsp;Exception.CreateFmt(StrNotAssignedError,[node1.ClassName]);&nbsp;//如果node1=nil&nbsp;可能出现死循环<br><br>&nbsp;&nbsp;FillChar(FItem,SizeOf(TArrayString),0);<br>&nbsp;&nbsp;i:=0;<br>&nbsp;&nbsp;repeat<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;node1.IsWordEnd&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bItem:=True;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FItem.iFreq:=node1.WordFreqs;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Inc(i);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;i&gt;10&nbsp;then&nbsp;raise&nbsp;Exception.Create(StrOverBoundsError);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;j:=0&nbsp;to&nbsp;i-1&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;bItem[j]&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FItem[j].iLen:=FItem[j].iLen+Length(node1.Character);&nbsp;&nbsp;//长度计数<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nd:=node1.GetParent;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;nd=nil&nbsp;then&nbsp;&nbsp;Break;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{回溯到了根节点}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node1:=nd;<br>&nbsp;&nbsp;until&nbsp;(false);&nbsp;&nbsp;//回溯<br>&nbsp;&nbsp;result:=i;&nbsp;&nbsp;//左临词的个数<br>end;<br><br>{&nbsp;TReverseDict&nbsp;}<br><br>class&nbsp;function&nbsp;TReverseDict.ChangeDict(APath:&nbsp;string):&nbsp;TInterfacedDict;<br>begin<br>&nbsp;&nbsp;&nbsp;if&nbsp;Assigned(TReverseDict.GetInstance(0))&nbsp;then<br>&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;TReverseDict.GetInstance(0).DictPath=Trim(APath)&nbsp;then&nbsp;&nbsp;//字典相同<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result:=TReverseDict.GetInstance(0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TReverseDict.GetInstance(0).ReleaseInstance;&nbsp;&nbsp;//字典不同,则释放以前字典,并重新加载新字典<br>&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;Result:=TReverseDict.CreateInstance(APath);<br>&nbsp;&nbsp;&nbsp;Result.LoadDict(APath);<br>end;<br><br>constructor&nbsp;TReverseDict.Create(APath:&nbsp;string);<br>begin<br>&nbsp;&nbsp;raise&nbsp;Exception.CreateFmt(StrCreateError,[ClassName]);<br>end;<br><br>class&nbsp;function&nbsp;TReverseDict.CreateInstance(APath:&nbsp;string):TReverseDict;<br>begin<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;Result:=GetInstance(1);<br>&nbsp;&nbsp;//LoadDict(APath+words);<br>end;<br><br>destructor&nbsp;TReverseDict.Destroy;<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;GetInstance(0)=Self&nbsp;then&nbsp;GetInstance(2);<br>&nbsp;&nbsp;&nbsp;&nbsp;inherited;<br>end;<br><br>class&nbsp;function&nbsp;TReverseDict.GetInstance(chooce:&nbsp;Integer):&nbsp;TReverseDict;<br>//const&nbsp;instance:TDict=nil;<br>begin<br>&nbsp;&nbsp;case&nbsp;chooce&nbsp;of<br>&nbsp;&nbsp;0:&nbsp;;&nbsp;&nbsp;&nbsp;//供释放使用<br>&nbsp;&nbsp;1:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//创建<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Inc(iRevDictRefCount,1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;not&nbsp;Assigned(RevDictInstance)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RevDictInstance:=inherited&nbsp;Create;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//LoadDict(APath+words);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;2:RevDictInstance:=nil;<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;raise&nbsp;Exception.CreateFmt(strCreateParamError,[ClassName]);<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;Result:=RevDictInstance;<br>end;<br><br>procedure&nbsp;TReverseDict.LoadDict(APath:&nbsp;string);&nbsp;&nbsp;&nbsp;&nbsp;//载入字典<br>var<br>nd,tmpNode:TCharTreeNode;<br>str:string;<br>index:Word;<br>i,j:LongWord;<br>{Item:PChainElem;&nbsp;}<br>{isExsit:Boolean;}<br>F:TextFile;<br>PosDel1,PosDel2:Integer;<br>wfreq:string;<br><br>lst:TStringList;<br>sTip:string;<br>&nbsp;&nbsp;procedure&nbsp;Split(Splitor,Str:string);&nbsp;//sSubstr分割sStr,存入TStringList.<br>&nbsp;&nbsp;var<br>&nbsp;&nbsp;&nbsp;&nbsp;PSplitor,PStr,PPos:PChar;<br>&nbsp;&nbsp;&nbsp;&nbsp;s:string;<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;PSplitor:=PChar(Splitor);<br>&nbsp;&nbsp;&nbsp;&nbsp;PStr:=PChar(Str);<br>&nbsp;&nbsp;&nbsp;&nbsp;PPos:=PChar(Str);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;PPos&lt;&gt;#0&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(PPos^&lt;&gt;PSplitor^)&nbsp;and&nbsp;(PPos^&lt;&gt;#0)&nbsp;do&nbsp;inc(PPos);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetString(S,PStr,PPos-PStr);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lst.Add(S);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;PPos^&lt;&gt;#0&nbsp;then&nbsp;inc(PPos)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;break;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pstr:=ppos;<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;end;<br>begin<br>&nbsp;&nbsp;&nbsp;FDictPath:=APath;<br>&nbsp;&nbsp;&nbsp;SetDictType(dtReveser);&nbsp;&nbsp;&nbsp;//指定字典属性<br><br>&nbsp;&nbsp;&nbsp;lst:=TStringList.Create;<br>&nbsp;&nbsp;&nbsp;try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AssignFile(F,Apath);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Reset(F);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(not&nbsp;Eof(F))&nbsp;do&nbsp;&nbsp;//把每一个词加载到树上<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Readln(F,str);&nbsp;&nbsp;//在字典中取词<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sTip:=str;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Split(#9,str);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str:=lst.Strings[1];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PosDel1:=Pos('&quot;',str);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PosDel2:=LastDelimiter('&quot;',str);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str:=Copy(str,PosDel1+1&nbsp;,PosDel2-PosDel1-1);&nbsp;//剔除双引号&nbsp;,找到词<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;lst.Count&gt;=3&nbsp;then&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//词频<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wfreq:=lst.Strings[2];<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lst.Clear;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;Length(Trim(str))&lt;=1&nbsp;then&nbsp;Continue;&nbsp;//不是汉字(应该不会出现)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str:=AnsiReverseString(Trim(str));&nbsp;//逆序<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;index:=word(Byte(str[1])&nbsp;shl&nbsp;8)+&nbsp;word(Byte(str[2]));&nbsp;&nbsp;//树根节点索引<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;except<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageDlg(Format(StrRowError,[sTip]),mtWarning,[mbOK],0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Halt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nd:=Tree.root[index];<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;Length(str)=2&nbsp;then&nbsp;&nbsp;&nbsp;&nbsp;//单字词<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nd.WordFreq:=StrToIntDef(wFreq,1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nd.WordEnd:=True;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue&nbsp;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;i:=1&nbsp;to&nbsp;(Length(str)&nbsp;&nbsp;div&nbsp;2)-1&nbsp;&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmpNode:=FindCharacter(Copy(str,i*2+1,2),nd);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;tmpNode=nil&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nd:=nd.AddChild(Copy(str,i*2+1,2))&nbsp;//值相等的节点不存在。追加。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nd:=tmpNode;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Continue;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tree.Count:=tree.count+1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//树节点个数加1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;&nbsp;&nbsp;//end&nbsp;'for'<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nd.WordFreq:=StrToIntdef(wfreq,1);&nbsp;&nbsp;&nbsp;//词频<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nd.WordEnd:=True;&nbsp;&nbsp;//词结束标记<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;except<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageDlg(StrLoadDictError,mtInformation,[MBOK],0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Abort;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;finally<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseFile(F);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>end;<br><br><br>class&nbsp;function&nbsp;TReverseDict.PlusDict(APath:&nbsp;string):&nbsp;TInterfacedDict;<br>begin<br><br>end;<br><br>procedure&nbsp;TReverseDict.ReleaseInstance;<br>begin<br>&nbsp;&nbsp;Dec(iRevDictRefCount,1);<br>&nbsp;&nbsp;if&nbsp;iRevDictRefCount&lt;=0&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;GetInstance(0)&lt;&gt;nil&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetInstance(0).Free;<br>end;<br><br><br><br><br><br><br><br>initialization<br>&nbsp;&nbsp;DictInstance:=nil;<br>&nbsp;&nbsp;RevDictInstance:=nil;<br><br>&nbsp;&nbsp;iRevDictRefCount:=0;<br>&nbsp;&nbsp;iDictRefCount:=0;<br>finalization<br>&nbsp;&nbsp;//...<br>end.
 
linuxping兄贴的代码太长了,本人还是看不懂.<br>我只想弄懂最基本的知识,不清楚的地方如下,烦请各位解释:<br>主要是:prodedure&nbsp;TLindExit1KeyPress(sender:var&nbsp;Key:char);<br>请自<br>if&nbsp;DtRec=NIL&nbsp;then&nbsp;始至本段程序添加完表尾,本人都不清楚程序的意义,请解释.
 
DtRec代表一个链表,但它指向链表的表头,它为nil,链表就什么也没有。
 
关键问题是楼主“数据结构”功底差,建议你好好读几本这方面的书,有个系统的了解。否则即使别人给你解释了一个问题下次还会有其它问题出现。
 
这个不难的,楼上的都说过了,如果你不明白整个数据结构,基础不扎实,就是懂了这个,要是一变化,你就又不懂了,所以别对这些代码耿耿于怀,不要急,先回去把相关的基础知识看懂,到时候你再回来看这题,就会发现&nbsp;just&nbsp;that!学习需要耐心哦,加油!
 
感谢朋友们的热情解答.散分,不多,请笑纳.
 

Similar threads

S
回复
0
查看
688
SUNSTONE的Delphi笔记
S
S
回复
0
查看
683
SUNSTONE的Delphi笔记
S
S
回复
0
查看
784
SUNSTONE的Delphi笔记
S
后退
顶部