Hash表

/*
	Name: Hash 
	Copyright: 
	Author: huowolf
	Date: 27/06/15 20:57
	Description: HashTable的简单实现 
*/

#include <iostream>
using namespace std;
#define MAXSIZE 17      //该值最好采用某个4n+3形式的素数
#define NULLKEY -1
#define Exist   0

typedef struct node
{
    int data;      
    struct node *next;
}Node;                  //关键字节点

typedef struct Table{
    Node * table;
    int size;
}HashTable;

/*
本程序采用除留余数法构造哈希函数,
采用链地址法解决冲突
*/
void InitHashTable(HashTable *H);
void InsertHashTable(HashTable *H,int key); 
bool SearchHashTable(HashTable *H,int key);
bool DeleteHashTable(HashTable *H,int key);
void Display(HashTable *H);
int main()
{
	HashTable H;
    InitHashTable(&H);
    cout<<"请输入你要插入的一组数据,以-1结束输入:";
    int i,key;
    while(1)
    {
        cin>>i;
        if(i==-1)
            break;
        InsertHashTable(&H,i);
    }
    Display(&H);
    
    	cout<<"请输入你要查找的内容:";
    cin>>key;
    if(SearchHashTable(&H,key))
        cout<<"在哈希表中找到该关键字"<<key<<endl;
    else
        cout<<"哈希表中不存在着关键字"<<key<<endl;
        
    cout<<"请输入你要删除的内容:";
    cin>>key;
    bool result =  DeleteHashTable(&H,key); 
    if(result)
    	cout<<"关键字"<<key<<"已经成功删除"<<endl;
	else
		cout<< "关键字"<<key<<"不存在"<<endl;

	Display(&H);
	return 0;
}

void InitHashTable(HashTable *H)
{
    H->size = MAXSIZE;
    H->table = new Node[H->size];
    //初始化哈希表的数据,方便对该位置是否存在冲突进行判别
    for (int i = 0; i < H->size; ++i) 
    {
        H->table[i].data = NULLKEY;
        H->table[i].next = NULL;
    }
}

int Hash(int key)   //hash函数
{
    return key%MAXSIZE;
}

void InsertHashTable(HashTable *H,int key)  //插入数据到hash表
{
    int addr = Hash(key);
    if(H->table[addr].data==NULLKEY)   
        H->table[addr].data = Exist;

	Node *p = new Node;
    p->data = key;
    p->next = H->table[addr].next;
    H->table[addr].next = p;



}

bool SearchHashTable(HashTable *H,int key)  //查找关键字key的值
{
    int addr = Hash(key);
    Node *p = H->table[addr].next;
    while(p!=NULL)
    {
        if(p->data==key)
            return true;
        else
            p = p->next;
    }
    return false;
}

bool DeleteHashTable(HashTable *H,int key)		//删除关键字 
{
    int addr = Hash(key);
    Node *pCur = &H->table[addr];   			//当前节点
    Node *pPre = pCur;                  		//前一个节点
    
    while(pCur->next)
    {
    	if(pCur->data==key)
    	{
	    	pPre->next = pCur->next;
	    	delete pCur;
	    	pCur = NULL;
	    	return true;
    	}
		else
		{
			pPre = pCur;
        	pCur = pCur->next;       	
		}
    }
    return false;	
}

void Display(HashTable *H)
{
	cout<<"该哈希表中存在如下元素:"<<endl;
    Node *p;
	for(int i=0;i<MAXSIZE;i++)
    {
        if(H->table[i].data!=NULLKEY)
        {
            p = H->table[i].next;
            while(p)
            {
				cout<<p->data<<" ";
                p = p->next;                
            }
            cout<<endl;
        }
    }
}

hash的源代码#include <stdio.h> /*标准输入输出函数库*/ #include<stdlib.h> /*标准函数库*/ #include<string.h> #define HASH_LEN 50 /*哈希的长度 */ #define M 47 #define NAME_N 30 /*人名拼音的最大个数*/ typedef struct NAME { char *py; /*名字的拼音*/ int k; /*拼音所对应的整数*/ }NAME; NAME NameList[HASH_LEN]; /*定义一个NAME类型的一维结构体数组*/ typedef struct hterm /*定义一个结构体类型hterm ,用typedef语句定义一个新类型HASH一个哈希*/ { char *py; /*名字的拼音*/ int k; /*拼音所对应的整数 */ int si; /*查找长度 */ }HASH; HASH HashList[HASH_LEN]; /*定义HASH类型的一维数组*/ //创建一个姓名 void CreateNameList() /*创建姓名赋值*/ { NameList[0].py="liudan"; NameList[1].py="yanfanglei"; NameList[2].py="sunwei"; NameList[3].py="muyunfei"; NameList[4].py="wuyuanyuan"; NameList[5].py="weixing"; NameList[6].py="hefanrong"; NameList[7].py="wangxiaotian"; NameList[8].py="zhoulei"; NameList[9].py="houcuncun"; NameList[10].py="zhangliang"; NameList[11].py="songyangyang"; NameList[12].py="tianhuanhuan"; NameList[13].py="renkun"; NameList[14].py="sungang"; NameList[15].py="fuxiaohui"; NameList[16].py="qinlong"; NameList[17].py="gaodan"; NameList[18].py="andongmei"; NameList[19].py="wanglintao"; NameList[20].py="wangyalan"; NameList[21].py="limenglu"; NameList[22].py="wangxin"; NameList[23].py="zhangnana"; NameList[24].py="shirui"; NameList[25].py="wangdong"; NameList[26].py="majunchao"; NameList[27].py="wanghuanhuan"; NameList[28].py="wangni"; NameList[29].py="heqi";
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值