数据结构课程设计----哈希表设计

哈希表的应用      

基本要求:    根据给定的一组整数,建立哈希表。

1)设计哈希函数;      

2)分别采用线性探测再散列法和链地址法解决冲突;       

3)对哈希表进行查找,输出查找成功和不成功的信息。

测试数据要求:         建立哈希表时输入的数据可以有相同的值。

/*设计哈希表
    根据给定的一组整数,建立哈希表。 
基本要求:
    (1)设计哈希函数;
    (2)分别采用线性探测再散列法和链地址法解决冲突;
    (3)输入元素,在哈希表中进行查找,输出查找成功和不成功的信息。
测试数据要求:
    建立哈希表时输入的数据可以有相同的值。  
*/ 
#include <stdio.h>
#include<stdio.h>
#include<stdlib.h>
#define Max 20//初始大小
#define listincrement 10//增量
#define Chushusize 7
typedef struct{
int *data;//数据存储 

int length;//表的长度
int listsize;//申请空间大小
}sqlist;//顺序表
typedef struct{
int *data;//哈希表数据存储 
int length;//表的长度
int listsize;//申请空间大小
}Hsqlist;//线性哈希表

typedef struct Lnode{
	int data;
	struct Lnode *next;	
}Lnode,*HLinklist;
typedef struct HNode{
	Lnode *firstarc;//指向第一个依附于该点的指针 	 
}HNode,Hlist[Max];
typedef struct {
	
	 Hlist vertices;//哈希表链地址 
	int listnum;//哈希地址个数 
		
}HashTable;
void Initlist(sqlist &l){
//建立顺序表 
	printf("请输入线性表的大小:");
	scanf("%d",&l.length);	
	l.data=(int*)malloc(Max*sizeof(int));
	l.listsize=Max;
	printf("请输入数据元素:");
	for(int i=0;i<l.length;i++){
		scanf("%d",&l.data[i]);
	}			
}
void InitHsqlist(sqlist L1,Hsqlist &L2){
	//转化哈希表 线性探测再散列法
	int i,j,key;
	L2.length=Chushusize;
	L2.listsize=Max;
	L2.data=(int*)malloc(Max*sizeof(int));
	for(i=0;i<Max;i++)//初始化哈希表 
		L2.data[i]=0;
	for(i=0;i<L1.length;i++){
		key = L1.data[i]%Chushusize;
		if(L2.data[key]){
			for(j=1;L2.data[key];j++){
				key=(L1.data[i]%Chushusize+j)%10; 			
			}
		}
		L2.data[key]=L1.data[i];	
		printf("%d-%d\n",key,L1.data[i]);	
	} 	
}
void InitHashTable(sqlist L1,HashTable &L2){
//链地址法解决冲突 
	Lnode *p,*q;
	int i,j,key;
	
	L2.listnum = L1.length;
	for(i = 0 ; i < Max ; i ++)
		L2.vertices[i].firstarc=NULL;
	for(i = 0;i < L1.length;i++){
		p=(Lnode*)malloc(sizeof(Lnode));
		p->data=L1.data[i];
		p->next=NULL;
		
		key=L1.data[i]%7;
		q=L2.vertices[key].firstarc;
		if(q){
			while(q->next)
			q=q->next ;
			q->next=p;
		}
		else
			L2.vertices[key].firstarc=p;		
	}
	return;	
} 
void Output(Hsqlist L){
	
	int i;
	for(i=0;L.data[i]!='\0';i++)
		printf("%5d",L.data[i]);
	putchar('\n');		
}
void Output(HashTable L){
	
	int i;
	HLinklist p,q;	
	for(i=0;i<L.listnum;i++){
		p=L.vertices[i].firstarc;
		printf("%d----",i);
		while(p){
			printf("%d->",p->data);
			p=p->next;	
		}
		putchar('\n');		
	}
	return ;
}
void ChazhaoHsqlist(Hsqlist H){
	//查找 线性探测再散列法哈希表 
	int n;
	printf("根据给出的哈希地址查找元素:");
	scanf("%d",&n);
	printf("查找元素为:%d\n",H.data[n]); 
}
void ChazhaoHsqlist(HashTable H){
	//查找 链地址法解决冲突哈希表 
	int n;
	Lnode *temp;
	printf("根据给出的哈希地址查找元素:");
	scanf("%d",&n);
	 temp=H.vertices[n].firstarc;
	 printf("查找元素为:"); 
	 while(temp){
	 	printf("%5d",temp->data);
	 	temp=temp->next;
	 } 	
}
int main(){
 sqlist L1;
 Hsqlist L2;
 HashTable L3;
 Initlist(L1);
 InitHsqlist(L1,L2);//转化哈希表 线性探测再散列法
 Output(L2);
 InitHashTable(L1,L3);// 链地址法解决冲突 
 Output(L3);
 ChazhaoHsqlist(L2);//查找 
 ChazhaoHsqlist(L3);
 return 0;	
}

猜你喜欢

转载自blog.csdn.net/qq_25368751/article/details/85156610
今日推荐