Академический Документы
Профессиональный Документы
Культура Документы
BUT
THERE IS A BIT OF PROBLEM IN REHASH! ( YOU CAN CHECK THE DELETE AND SEARCH BY
CHANGING THE WHILE LOOPS IN MAIN)
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
//A struct to store a string
typedef struct {
char name[30];
} record;
} hashtable;
#define MAX_ITER 10
#define MAX_LEVEL 4
//Part 1
hashtable init( hashtable H )
{ int i;
//initializing the parameters to given values
H.s=8;
H.t=3;
H.n=0;
H.a=1;
H.b=3;
//allocating the dynamic array
H.data=(record*)malloc(H.s*sizeof(record));
//Print function
hashtable print( hashtable H)
{
int i;
//used to print the hashtable
for(i=0;i<H.s;++i)
{
if(H.data[i].name!="")
printf("%d-%s\n",i,H.data[i].name);
else printf("EMPTY");
}
}
//Part 2
//Hash Function
int hash(char* str, int c, int t)
{
unsigned int i,l,z,k;
unsigned int m;
l=strlen((str));
//its perfect!
unsigned int A=65791;
//unsigned int n = (unsigned int)pow(2,32);
for(i=0,m=0;i<l;++i)
m=(A*m+str[i]);
k=32-t;
z=(c*m);
return z>>k;
bits
}
hashtable insert( hashtable M, char* str, int level, int* status);
//part 3
//Search function
int search( hashtable H, char* str)
{
int i,j;
i=hash(str,H.a,H.t);
//getting index
j=hash(str,H.b,H.t);
printf("i=%d
j=%d",i,j);
1 or -1
if(!strcmp(str,H.data[i].name))
{
printf("%s
%s",str,H.data[i].name);
printf("SEARCH SUCCESSFUL");
return 1;
}
printf("%s
%s",str,H.data[j].name);
printf("SEARCH SUCCESSFUL");
return 1;
//if not found
printf("SEARCH FAILED");
return 0;
}
//part 5
//Rehash function
hashtable rehash(hashtable H,int a,int b,int s,int t,int n, int* status)
{
int i,k;
hashtable T;
int stat;
stat=0;
//initialising all
T.a=a;
T.b=b;
T.s=s;
T.n=0;
T.t=t;
strcpy(str,H.data[i].name);
T=insert(T,str,MAX_LEVEL,&stat);}
else strcpy(T.data[i].name,"");
}
//checking for successful rehashing
if(T.n<n)
{
//free the hashtable
*status=0;
for(k=0;k<T.s;++k)
{
free(T.data[k].name);
}
return H;
}
else
*status=1;
for(k=0;k<H.s;++k)
{
free(H.data[k].name);
}
return T;
//part 5
hashtable insert( hashtable H, char* str, int level, int* status)
{
hashtable M;
int k=0;
if(search(H,str))
//searching for data
{
printf("Data already present");
*status=1;
return H;
}
int i,j;
int statusrehash;
float load;
char* str1;
str1[0]='\0';
while(k<MAX_ITER)
//running loop
{
k++;
i=hash(str,H.a,H.t);
j=hash(str,H.b,H.t);
printf("%d%d",i,j);
else
{if(strcmp(H.data[j].name,"")==0)
{
strcpy(H.data[j].name,str);
H.n++;
}
//finding load factor
load=(float)H.n/(float)H.s;
if(load<=0.5)
{
printf("%f",load);
*status=1;
return H;
}
if(load>0.5)
//load check
printf("%f",load);
statusrehash=0;
M=rehash(H,H.a,H.b,2*H.s,H.t+1,H.n,&statusrehash);
if(statusrehash==1)
{
*status=1;
return M;
}
if(statusrehash==0)
{
*status=0;
return H;
}
}
}
else
{
strcpy(str1,H.data[i].name);
ALSO WORKS)
strcpy(H.data[i].name,str);
strcpy(str,str1);
}
}
if(level>=MAX_LEVEL)
//A check on Rehash
{
*status=0;
return H;
}
else
{
statusrehash=0;
// two types of rehashes implremented
M=rehash(H,H.a+2,H.b+2,H.s,H.t,H.n,&statusrehash);
if(statusrehash==0)
M=rehash(H,H.a,H.b,2*H.s,H.t+1,H.n,&statusrehash);
if(statusrehash==1)
H=insert(H,str,level+1,status);
//part 6
//Delete function
hashtable delete( hashtable H, char* str)
{
int i,j;
i=hash(str,H.a,H.t);
j=hash(str,H.b,H.t);
printf("%d
%d",i,j);
if(!strcmp(str,H.data[i].name))
1 or -1
{ printf("%s
%s",str,H.data[i].name);
strcpy(H.data[i].name,"");
//copying empty to string
H.n--;
printf("DELETE SUCCESSFUL");
return H;
}
else if(!strcmp(str,H.data[j].name))
{
printf("%s
%s",str,H.data[j].name);
strcpy(H.data[j].name,"");
H.n--;
printf("DELETE SUCCESSFUL");
return H;
//Part 7
//sorry as i could not use the files. Thus i have given 3 while loops which
can be made as much as u like to give the inputs for search delete and
insert.
main()
{
int i,Status,j;
int level=0;
hashtable H;
char c[80];
H=init(H);
int* status;
status=&Status;
print(H);
//for insertion
//while(1)
//
j=0;
int m;
m=0;
printf("Enter the number of insertions");
scanf("%d",&m);
while(j<m)
{
++j;
printf("enter the data to be inserted");
scanf("%s",c);
printf("%s",c);
*status=0;
level=0;
H=insert(H,c,level,&Status);
if(*status==1)
printf("INSERT SUCCESSFUL \n");
else
printf("INSERT FAILED\n");
print(H);
}
printf("Enter the number of search");
scanf("%d",&m);
j=0;
//for search
while(j<m)
{
++j;
printf("enter the data to be searched");
scanf("%s",c);
search(H,c);
print(H);