⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 p377.cpp

📁 清华大学-数据结构 清华大学-数据结构 清华大学-数据结构
💻 CPP
字号:
#ifndef DefaultSize
#define DefaultSize 100
#endif

		template <class Type> class HashTable;
		template <class Type> class ListNode {			//各桶中同义词子表的链结点(表项)定义
		friend class HashTable<Type>;
		private:
		   Type key;		//表项的关键码
		   ListNode *link;		//链指针
		};
 

		template <class Type>
		class HashTable {									//散列表类定义
		typedef ListNode<Type> * ListPtr;					//链表指针
		public:

		   HashTable ( int sz=DefaultSize ) : buckets ( sz ) 
		   { 
			   AllocateHt ( );
			   for (int i=0;i<sz;i++) ht[i]=NULL;				   			   
		   }		//构造函数
		   ~HashTable ( ) { delete [ ] ht; }						//析构函数
		   int Insert ( const Type & x );							//在散列表中插入x
		   int Remove ( const Type & x );						//在散列表中删除x
		   int IsIn ( const Type & x ) { return (  Find (x)) ? 1 : 0; }	//判x在散列表中否
		   int FindPos ( const Type & x ); 					//散列函数: 计算含x表项的初始桶号
	       Type* Find ( const Type & x);
		private:
		   int buckets;							//容量(桶的个数)
		   ListPtr *ht;						//散列表定义
		   void AllocateHt ( ) { ht = new ListPtr[buckets ]; }			//为散列表分配存储空间
		};

		template <class Type> int HashTable<Type>::Insert (const Type & x ) {
		//在ht表中搜索x。若找到则不再插入, 若未找到, 但表已满, 则不再插入, 以上两种情况, 返回0; 若找到
		//位置的标志是Empty或Deleted, 不论表是否已满, x插入, 返回1。
		   if ( Find (x) ) return 0;					//表中已有该项, 不再插入
		   int j=FindPos ( x  );
		   ListPtr p = ht[j];
		   ht[j]=new ListNode<Type>;
		   ht[j]->key=x;
		   ht[j]->link=p;
		   	return 1;
		}

		template <class Type> int HashTable<Type>::Remove ( const Type & x ) {
		//在ht表中删除元素x。若表中找不到x, 或虽然找到x, 但它已经逻辑删除过, 则返回0, 否则在表中删除
		//元素x, 返回1。
		   if ( !Find (x) ) return 0;					
		   int j=FindPos ( x  );
		   ListPtr p= ht[j];

		   if (ht[j]->key==x) 
			   ht[j]=p->link;
		   else
		   {
			   ListPtr q;
			   while (p->key!=x)
			   {
				   q=p;
				   p=p->link;
			   }
			   q->link=p->link;			
		   }
		   delete p;
		   return 1;
		}


		template <class Type> Type *HashTable<Type>::Find ( const Type & x) {
		//在散列表ht中搜索表项x。函数返回一个指向散列表中某表项的指针; 若表项不存在, 则返回0。
		   int j = FindPos ( x  );				//通过一个散列函数HashFunc( )计算桶号
		   ListPtr p = ht[j];
		   while ( p != NULL )						// p!=NULL时在同义词子表中寻找
			 if ( p->key == x ) return & p->key;			//找到返回
			 else p = p->link;						//否则, 循链向下找
			 return 0;							//整个链都搜索完, 未找到x, 返回0
		}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -