思维导图
哈希表的实现和哈希表查找
源码:
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node *next;
}*sake;
sake create()
{
sake p=(sake)malloc(sizeof(struct node));
if(p==NULL)
return NULL;
p->data=0;
p->next=NULL;
return p;
}
void input(sake hash[],int element,int m)
{
int index=element%m;
sake s=create();
if(s==NULL)
return;
s->data=element;
if(hash[index]==NULL)
hash[index]=s;
else
{
s->next=hash[index];
hash[index]=s;
}
}
void output(sake hash[],int m)
{
int i;
for(i=0;i<m;i++)
{
printf("%-8d",i);
if(hash[i]==NULL)
puts("NULL");
else
{
sake p=hash[i];
while(p!=NULL)
{
printf("%-4d",p->data);
p=p->next;
}
puts("NULL");
}
}
}
int search(sake hash[],int element,int m)
{
int index=element%m;
if(hash[index]==NULL)
return -1;
sake p=hash[index];
while(p!=NULL)
{
if(p->data==element)
return 0;
p=p->next;
}
return -1;
}
int prime(int m)
{
int i,j;
for(i=m;i>=2;i--)
{
int flag=1;
for(j=2;j<m;j++)
{
if(i%j==0)
{
flag=0;
break;
}
}
if(flag==1)
{
return i;
}
}
}
int main(int argc, const char *argv[])
{
int arr[]={15,65,23,74,95,12,35,91,37,2};
int len=sizeof(arr)/sizeof(arr[0]);
int n=len*4/3;
int m=prime(n);
sake hash[m];
int i;
for(i=0;i<m;i++)
{
hash[i]=NULL;
}
for(i=0;i<len;i++)
{
input(hash,arr[i],m);
}
output(hash,m);
printf("请输入你要查找的元素");
int element;
scanf("%d",&element);
int flag=search(hash,element,m);
if(flag==0)
{
printf("已找到该元素\n");
}
else
{
puts("该元素不存在");
}
return 0;
}