16 9
3,15 6,10,63 1,16
哈希表
#include <stdio.h>
#include "stdlib.h"
#include "math.h"
typedef int datatype;
typedef struct node{
datatype data;
struct node *next;
}*list;
int prime(int m);
void output(list hasi[],int p);
void charu(list hasi[],int p,datatype key);
list creat_node();
int search(list hasi[],int p,datatype key);
void free_space(list hasi[],int p);
int main(int argc, const char *argv[])
{
int a[]={41,54,67,321,231,324,325,32,12,123};
int len=sizeof(a)/sizeof(a[0]);
int m=len*4/3;
int p=prime(m);
int i=0;
list hasi[p];
for(i=0;i<p;i++)
hasi[i]=NULL;
for(i=0;i<len;i++)
charu(hasi,p,a[i]);
output(hasi,p);
printf("input key:");
datatype key;
scanf("%d",&key);
int flag=search(hasi,p,key);
if(key==-1)
printf("key unexit\n");
else printf("key exit\n");
free_space(hasi,p);
return 0;
}
int prime(int m)
{
int i=m;
int j;
for(i=m;i>=2;i--)
{
int flag;
for(j=2;j<=sqrt(m);j++)
{
if(i%j==0)
flag=1;
}
if(flag==0)
return i;
}
}
list creat_node()
{
list s=(list)malloc(sizeof(struct node));
if(s==NULL)
return NULL;
s->data=0;
s->next=NULL;
}
void charu(list hasi[],int p,datatype key)
{
int index=key%p;
list s=creat_node();
s->data=key;
if(hasi[index]==NULL)
hasi[index]=s;
else{
s->next=hasi[index];
hasi[index]=s;
}
}
void output(list hasi[],int p)
{
int i=0;
for(i=0;i<p;i++)
{
printf("%d:",i);
if(hasi[i]==NULL)
{
puts("NULL");
continue;
}
list q=hasi[i];
while(q!=NULL)
{
printf("%d ",q->data);
q=q->next;
}
printf("\n");
}
}
#if 1
int search(list hasi[],int p,datatype key)
{
int index=key%p;
list q=hasi[index];
while(q!=NULL)
{
if(key==q->data)
return 0;
q=q->next;
}
return -1;
}
void free_space(list hasi[],int p)
{
int i=0;
for(i=0;i<p;i++)
{
if(hasi[i]==NULL)
continue;
else
{
while(hasi[i]!=NULL)
{
list del=hasi[i];
hasi[i]=hasi[i]->next;
free(del);
del=NULL;
}
}
}
}
#endif