Вы находитесь на странице: 1из 8

//I WANT TO TELL THAT DELETE, SEARCH, AND INSERT ARE WORKING PERFECTLY.

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;

//structure for hashtable


typedef struct {
unsigned int s,t,a,b,n;
t=log of s
record* data;

//s=size, n=number of elements //a and b for hashing

//array of pointers to strings

} 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));

//initialzing the pointers to NULL


for(i=0;i<H.s;++i)
strcpy(H.data[i].name,"");
return H;
}

//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]);

//just following the algo given

k=32-t;
z=(c*m);
return z>>k;

//Returning after cutting of 32-t

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

//checking if strcmp returns 0 or

%s",str,H.data[i].name);

printf("SEARCH SUCCESSFUL");
return 1;
}

//comparing the strings


else if(!strcmp(str,H.data[j].name))
{

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;

//allocating the dynamic array


T.data=(record*)malloc(T.s*sizeof(record));
for(i=0;i<T.s;++i)
strcpy(T.data[i].name,"");
print(T);
printf("a=%d b=%d s=%d t=%d n=%d",T.a,T.b,T.s,T.t,T.n);
char str[50];
//rehashing
for(i=0;stat!=0,i<H.s;++i)
{
T.n++;
stat=0;
if((strcmp(H.data[i].name,""))!=0)
{ printf("DONE");

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

//called to free the hashtable

*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';

//a temp string

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);

//while either ith or jth one is free


if((strcmp(H.data[i].name,"")==0)||(strcmp(H.data[j].name,"")==0))
{
if(strcmp(H.data[i].name,"")==0)
{
strcpy(H.data[i].name,str);
H.n++;
}

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;
}

//rehash successful or not

}
}
else
{
strcpy(str1,H.data[i].name);
ALSO WORKS)
strcpy(H.data[i].name,str);

//if ith and jth are filled ( THIS

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);

//insertion if rehash is fine

//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))

//checking if strcmp returns 0 or

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;

//if not found

printf("NO ELEMENT FOUND");


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);

printf("Enter the number of deletions");


scanf("%d",&m);
j=0;
//for delete
while(j<m);
{
++j;
printf("enter the data to be deleted");
scanf("%s",c);
H=delete(H,c);
print(H);
}

Вам также может понравиться