链表类具有哈希表的功能

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;
  }
 }
}

时间: 2024-12-27 06:26:29

链表类具有哈希表的功能的相关文章

java HashSet类实现哈希表

 /*HashSet 类实现哈希表(散列表) 我们应该为插入到 哈希表的各个对象重写 hashCode()和equals() 方法  String 类重写的   hashCode() 是根据字符串计算的   Object 类的       hashCode() 是根据内存地址计算散列地址 哈希表只能通过迭代器迭代元素 Iterator */ import java.util.*; class HashTest {  public static void main(String []args)  

上古时代 Objective-C 中哈希表的实现

因为 ObjC 的 runtime 只能在 Mac OS 下才能编译,所以文章中的代码都是在 Mac OS,也就是 x86_64 架构下运行的,对于在 arm64 中运行的代码会特别说明. 写在前面 文章会介绍上古时代 Objective-C 哈希表,也就是 NXHashTable : NXHashTable 的实现 NXHashTable 的性能分析 NXHashTable 的作用 NXHashTable 的实现有着将近 30 年的历史,不过仍然作为重要的底层数据结构存储整个应用中的类. 文中

PHP哈希表碰撞攻击原理

最近哈希表碰撞攻击(Hashtable collisions as DOS attack)的话题不断被提起,各种语言纷纷中招.本文结合PHP内核源码,聊一聊这种攻击的原理及实现. 哈希表碰撞攻击的基本原理 哈希表是一种查找效率极高的数据结构,很多语言都在内部实现了哈希表.PHP中的哈希表是一种极为重要的数据结构,不但用于表示Array数据类型,还在Zend虚拟机内部用于存储上下文环境信息(执行上下文的变量及函数均使用哈希表结构存储). 理想情况下哈希表插入和查找操作的时间复杂度均为O(1),任何

PHP内核探索:哈希表碰撞攻击原理_php实例

下面通过图文并茂的方式给大家展示PHP内核探索:哈希表碰撞攻击原理. 最近哈希表碰撞攻击(Hashtable collisions as DOS attack)的话题不断被提起,各种语言纷纷中招.本文结合PHP内核源码,聊一聊这种攻击的原理及实现.  哈希表碰撞攻击的基本原理 哈希表是一种查找效率极高的数据结构,很多语言都在内部实现了哈希表.PHP中的哈希表是一种极为重要的数据结构,不但用于表示Array数据类型,还在Zend虚拟机内部用于存储上下文环境信息(执行上下文的变量及函数均使用哈希表结

哈希表

定义 一般的线性表.树,数据在结构中的相对位置是随机的,即和记录的关键字之间不存在确定的关系,因此,在结构中查找记录时需进行一系列和关键字的比较.这一类查找方法建立在"比较"的基础上,查找的效率依赖于查找过程中所进行的比较次数. 若想能直接找到需要的记录,必须在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使每个关键字和结构中一个唯一的存储位置相对应,这就是哈希表. 哈希表又称散列表.哈希表存储的基本思想是:以数据表中的每个记录的关键字 k为自变量,通过一种函数H(k)计算出

C#数据结构篇(一链表类) killertang(原作)

C#数据结构篇(一)线性表           作者: 寒羽狼 (Dark_Slaer_Tang)             最近,马子跑了,你说女人老是容易翻脸...,看来做程序员必定要 "茕茕孑立,行影相吊"悲惨命运了.还是老老实实编程吧,我发现用c# 编一些数据接结构的类也瞒不错的,于是想把数据结构的算法,用C#重写一遍,打发无聊的时光,下面是数据结构中的链表的实现.        首先定义结点类型,定义了,前一个指针域,后一个指针域,如下: using System; names

AS2.0中实现数据结构-哈希表

数据|数据结构 在游戏制作中我们经常需要存储一些离散的对象数据,比如道具箱里的道具,经常需要执行插入和删除操作,而且道具之间没有联系是无序排列的.有些人会说直接用数组不就得了,但是有大量数据存储时的数组的删除插入操作的效率是很低的.因此我们需要哈希表这样的可以提供快速的插入和删除,查找操作的数据结构,不论哈希表中有多少数据,插入和删除操作只需要接近常量的时间:即O(1)的时间级.既然这么好那么我们的AS可以实现吗?当然可以!AS发展到AS2.0,已经成为在语法上更接近于Java + Pascal

C#中用哈希表搜索对象

.NET Framework中的大多数容器都是序列式容器(sequence containers):它们按顺序存储对象.这 种类型的容器功能很多--你可以以任何特殊的顺序来存储任意数量的对象. 然而,这种多功能性是以一定的性能为代价的.在一个序列中查找一个特殊的对象所需要的时间取决 于容器中对象的数量.如果我们没有对容器中元素进行排序,那么随着元素数量的增加,你所需要的查找 时间也就直线增加了:如果容器中元素的数量增加了一倍,那么你用来查找一个特殊元素的时间也就增加 了一倍.然而,如果我们对容器

数据结构是哈希表(hashTable)

哈希表也称为散列表,是根据关键字值(key value)而直接进行访问的数据结构.也就是说,它通过把关键字值映射到一个位置来访问记录,以加快查找的速度.这个映射函数称为哈希函数(也称为散列函数),映射过程称为哈希化,存放记录的数组叫做散列表.比如我们可以用下面的方法将关键字映射成数组的下标:arrayIndex = hugeNumber % arraySize.         哈希化之后难免会产生一个问题,那就是对不同的关键字,可能得到同一个散列地址,即同一个数组下标,这种现象称为冲突,那么我