zoukankan      html  css  js  c++  java
  • _DataStructure_C_Impl:哈希表

    #include<stdlib.h>
    #include<stdio.h>
    typedef int KeyType;
    //元素类型定义
    typedef struct{
    	KeyType key;	//关键字
    	int hi;			//冲突次数
    }DataType;
    //哈希表类型定义
    typedef struct{
    	DataType *data;
    	int tableSize;	//哈希表的长度
    	int curSize;	//表中关键字个数
    }HashTable;
    //构造一个哈希表,并处理冲突
    void CreateHashTable(HashTable *H,int m,int p,int hash[],int n){
    	int i,sum,addr,di,k=1;
    	(*H).data=(DataType *)malloc(m*sizeof(DataType));	//为哈希表分配存储空间
    	if(!(*H).data)
    		exit(-1);
    	for(i=0;i<m;i++){	//初始化哈希表
    		(*H).data[i].key=-1;
    		(*H).data[i].hi=0;
    	}
    	for(i=0;i<n;i++){		//求哈希函数地址并处理冲突
    		sum=0;		//冲突的次数
    		addr=hash[i]%p;		//利用除留余数法求哈希函数地址
    		di=addr;
    		if((*H).data[addr].key==-1){	//如果不冲突则将元素存储在表中
    			(*H).data[addr].key=hash[i];
    			(*H).data[addr].hi=1;
    		}else{				//用线性探测再散列法处理冲突
    			do{
    				di=(di+k)%m;
    				sum+=1;
    			}while((*H).data[di].key!=-1);
    			(*H).data[di].key=hash[i];
    			(*H).data[di].hi=sum+1;
    		}
    	}
    	(*H).curSize=n;	//哈希表中关键字个数为n
    	(*H).tableSize=m;	//哈希表的长度
    }
    //在哈希表H中查找关键字k的元素
    int SearchHash(HashTable H,KeyType k){
    	int d,d1,m;
    	m=H.tableSize;
    	d=d1=k%m;		//求k的哈希地址
    	while(H.data[d].key!=-1){
    		if(H.data[d].key==k)	//如果是要查找的关键字k,则返回k的位置
    			return d;
    		else				//继续往后查找
    			d=(d+1)%m;
    		if(d==d1)		//如果查找了哈希表中的所有位置,没有找到返回0
    			return 0;
    	}
    	return 0;			//该位置不存在关键字k
    }
    //输出哈希表
    void DisplayHash(HashTable H,int m){
    	int i;
    	printf("哈希表地址:");
    	for(i=0;i<m;i++)
    		printf("%-5d",i);
    	printf("
    ");
    	printf("关键字key:  ");
    	for(i=0;i<m;i++)
    		printf("%-5d",H.data[i].key);
    	printf("
    ");
    	printf("冲突次数:  ");
    	for(i=0;i<m;i++)
    		printf("%-5d",H.data[i].hi);
    	printf("
    ");
    }
    //求哈希表的平均查找长度
    void HashASL(HashTable H,int m){
    	float average=0;
    	int i;
    	for(i=0;i<m;i++)
    		average=average+H.data[i].hi;
    	average=average/H.curSize;
    	printf("平均查找长度ASL=%.2f",average);
    	printf("
    "); 
    }
    void main(){
    	int hash[]={23,35,12,56,123,39,342,90};
    	int m=11,p=11,n=8,pos;
    	KeyType k;
    	HashTable H;
    	CreateHashTable(&H,m,p,hash,n);
    	DisplayHash(H,m);
    	k=123;
    	pos=SearchHash(H,k);
    	printf("关键字%d在哈希表中的位置为:%d
    ",k,pos);
    	HashASL(H,m);
    	system("pause");
    }

  • 相关阅读:
    如何在帮助页面添加测试工具
    如何给你的ASP.NET页面添加HelpPage
    各种序列化库的性能数据
    Quartz.NET配置
    T-SQL中只截取日期的日期部分和日期的时间部分
    sql 根据指定条件获取一个字段批量获取数据插入另外一张表字段中+MD5加密
    读取图片数据流转换成图片
    T-SQL Transact-SQL 编程
    Python 链接Mysql数据库
    c 生成随机不重复的整数序列
  • 原文地址:https://www.cnblogs.com/javafly/p/6037123.html
Copyright © 2011-2022 走看看