using System;
namespace Study
{
/// <summary>
/// CChain 的摘要说明。
/// </summary>
public class CChain
{
public class CChainNode
{
public object Data;
public CChainNode NextChainNode;
public CChainNode PreviousChainNode;
public object Tag;
public string Key;
public CChainNode()
{
this.Data=null;
this.Tag=null;
this.Key=null;
this.NextChainNode=this.PreviousChainNode=null;
}
public CChainNode(object vData,object vTag,string vKey)
{
this.Data=vData;
this.Tag=vTag;
this.Key=vKey;
this.NextChainNode=this.PreviousChainNode=null;
}
}
public class CChainIterator
{
private CChainNode pCurrentChainNode,pFirstChainNode,pLastChainNode;
private bool pbFirst,pbLast;
public CChainIterator(CChainNode vFirstChainNode,CChainNode vLastChainNode)
{
this.pCurrentChainNode=this.pFirstChainNode=this.pLastChainNode=null;
if(vFirstChainNode!=null)
{
pCurrentChainNode=pFirstChainNode=vFirstChainNode;
pbFirst=false;
}
if(vLastChainNode!=null)
{
pCurrentChainNode=pLastChainNode=vLastChainNode;
pbLast=false;
}
}
public CChainNode CurrentChainNode
{
get
{
return this.pCurrentChainNode;
}
}
public bool NextChainNode()
{
if(this.pFirstChainNode==null)
{
return false;
}
if(pCurrentChainNode==pFirstChainNode && pbFirst==false)
{
pbFirst=true;
return true;
}
else
{
pCurrentChainNode=pCurrentChainNode.NextChainNode;
if(pCurrentChainNode ==null)
{
return false;
}
else
{
return true;
}
}
}
public bool PreviousChainNode()
{
if(this.pLastChainNode==null)
{
return false;
}
if(pCurrentChainNode==pLastChainNode && pbLast==false)
{
pbLast=true;
return true;
}
else
{
pCurrentChainNode=pCurrentChainNode.PreviousChainNode;
if(pCurrentChainNode ==null)
{
return false;
}
else
{
return true;
}
}
}
}
public CChainNode FirstChainNode;
public CChainNode LastChainNode;
public CChainNode CurrentChainNode;
public CChain()
{
this.FirstChainNode=this.LastChainNode=this.CurrentChainNode =null;
}
~CChain()
{
}
public bool IsEmpty()
{
if(this.FirstChainNode==null)
{
return true;
}
else
{
return false;
}
}
public bool AppendChainNode(CChainNode vChainNode)
{
if(vChainNode==null)
{
return false;
}
else
{
if(this.FirstChainNode==null)
{
this.FirstChainNode=vChainNode;
this.FirstChainNode.PreviousChainNode=null;
this.FirstChainNode.NextChainNode=null;
this.LastChainNode=this.CurrentChainNode=this.FirstChainNode;
}
else
{
this.CurrentChainNode.NextChainNode=vChainNode;
vChainNode.PreviousChainNode=this.CurrentChainNode;
vChainNode.NextChainNode=null;
this.LastChainNode=this.CurrentChainNode=vChainNode;
}
return true;
}
}
public bool InsertChainNode(int Index,CChainNode vChainNode)
{
CChainNode pCn;
int pCount=0;
CChain.CChainIterator pCi=new CChainIterator(this.FirstChainNode,null);
if(vChainNode==null || Index<0)
{
return false;
}
if(Index==0)
{
pCn=this.FirstChainNode;
vChainNode.NextChainNode=pCn;
pCn.PreviousChainNode=vChainNode;
this.FirstChainNode=vChainNode;
vChainNode.PreviousChainNode=null;
return true;
}
while(pCi.NextChainNode()==true)
{
pCount++;
if(pCount==Index)
{
pCn=pCi.CurrentChainNode.NextChainNode;
pCi.CurrentChainNode.NextChainNode=vChainNode;
vChainNode.PreviousChainNode=pCi.CurrentChainNode;
vChainNode.NextChainNode=pCn;
if(pCn!=null)
{
pCn.PreviousChainNode=vChainNode;
}
return true;
}
}
return false;
}
public bool ContainsKey(string vKey)
{
CChain.CChainIterator pCi=new CChainIterator(this.FirstChainNode,null);
while(pCi.NextChainNode()==true)
{
if(pCi.CurrentChainNode.Key ==vKey)
{
return true;
}
}
return false;
}
public CChain.CChainNode Item(string vKey)
{
CChain.CChainIterator pCi=new CChainIterator(this.FirstChainNode,null);
while(pCi.NextChainNode()==true)
{
if(pCi.CurrentChainNode.Key ==vKey)
{
return pCi.CurrentChainNode;
}
}
return null;
}
public object ItemData(string vKey)
{
CChain.CChainIterator pCi=new CChainIterator(this.FirstChainNode,null);
while(pCi.NextChainNode()==true)
{
if(pCi.CurrentChainNode.Key ==vKey)
{
return pCi.CurrentChainNode.Data;
}
}
return null;
}
public int ChainNodeCount()
{
int pCount=0;
CChain.CChainIterator pCi=new CChainIterator(this.FirstChainNode,null);
while(pCi.NextChainNode()==true)
{
pCount++;
}
return pCount;
}
}
}