📄 p377.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 + -