ÖDEV AŞAĞIDA KODU YAZDIM FAKAT ÇALIŞMIYOR HATA NERDE BAKARSANIZ ÇOKK SEVİNİRİM.
Konu : Hashing
Problem: Bu ödevde kullanıcıların belirlediği e-mail adresi veren bir servis sağlayıcının gelen e-mail başvurularını hashing
yöntemi ile değerlendirebilmesini sağlayan bir sistem tasarlanacaktır. Sistemin işlem adımları aşağıdaki gibidir:
1. E-mail adresi bilgilerini saklamak için bir Hash Tablosu dizisi kullanınız.
2. Hash tablosu dizisinin bütün gözlerini başlangıçta NULL ile ilklendiriniz.
3. Kullanıcıdan giriş bilgisi olarak istediği e-mail adresi string’ini alarak bu string için hash-key’i üretiniz.
4. hashTablosu’nda Hash-key’in üretildiği adresi kontrol ediniz.
a. Adreste başka bir string varsa bu durumda linear probing yöntemi ile diğer adreslerin durumuna bakmaya
devam etmeniz gerekir.
b. Bakılan adresteki değer NULL ise bu isim daha önce kullanılmamıştır. Bu ismi o adrese yazarak
kullanıcıya işlemin başarı ile tamamlandığına dair mesaj veriniz.
c. Bakılan adreste kullanıcının istediği string varsa kullanıcıya bu ismin daha önce kullanıldığını, e-mail
adresi olarak yeni bir isim seçmesi gerektiği mesajını veriniz.
Hash Tablosu aşağıdaki şartları sağlayacak şekilde oluşturulmalıdır:
1. Tablo(dizi) uzunluğunu gösteren m değerinin belirlenmesi için aşağıdaki bağıntıyı kullanınız :
m = EnküçükAsalSayı >= TablodakiElemanSayısı *2
TablodakiElemanSayısı değerini 100 olarak alınız.
Tablo uzunluğunu belirleme işlemini elle yapınız, bunu için program yazmayınız.
2. Tabloya yerleştirilecek büyük harflerden oluşan bir string’in hashKey’ini aşağıdaki gibi hesaplayınız..
for(i=key=0;i < length(str); i++)
key += (str – ‘a’ )*26*i ;
key = key % m;
3. Hash tablosunu oluştururken çakışma(collusion) problemini çözmek için linear probing yöntemini kullanınız.
Yani hasTablosu dizisinde belirlediğiniz hashKey’in gösterdiği adres dolu ise bir sonraki adresi deneyiniz. Deneme
işlemini en fazla tablo uzunluğu kadar tekrar edebilirsiniz. Örneğin 13 uzunluklu bir tablo için, hashKey’iniz 12
ise ve 12. adres dolu ise 0. adresten kontrole devam etmeniz gerekir.
#include
#include
void insert(char ary[],int hFn, int size){
int i;
int key;
char str[56];
int pos;
int n = 0;
int INT_MAX = 0;
int INT_MIN = 0;
printf("enmaili girin\n");
scanf("%s",str);
for(i=key=0;str != 0; i++)
key += (str-'a' )*26*i; key = key % hFn;
pos = key;
while(ary[pos]!= INT_MIN) {
if(ary[pos]== INT_MAX)
break;
pos = (pos+1)%hFn;
n++;
if(n==size)
break;
}
if(n==size)
printf("yer yok \n\n");
else
ary[pos] = str;
}
void search(int ary[],int hFn,int size){
int INT_MIN = 0;
int INT_MAX = 0;
int element,pos,n=0;
printf("e maili girin\n");
scanf("%d",&element);
pos = element%hFn;
while(n++ != size){
if(ary[pos]==element){
printf("Enmail bulundu index %d\n",pos);
break;
}
else
if(ary[pos]==INT_MAX ||ary[pos]!=INT_MIN)
pos = (pos+1) %hFn;
}
if(--n==size) printf("bulunamadı\n");
}
void display(int ary[],int size){
int i;
printf("Index\tValue\n");
for(i=0;i<size;i++)
printf("%d\t%d\n",i,ary);
}
int main(int argc, const char * argv[]) {
int INT_MIN = 0;
int size,hFn,i,choice;
printf("tablonun uzunluğu\n");
scanf("%d",&size);
int ary[size];
printf("hashin modunu giriniz ]\n");
scanf("%d",&hFn);
for(i=0;i<size;i++)
ary=INT_MIN;
do{
printf("Ne yapmak istersiniz\n");
printf(" 1-> ekleme\n 3-> görüntüle\n 4-> arama 0-> çıkışt\n");
scanf("%d",&choice);
switch(choice){
case 1:
insert(ary,hFn,size);
break;
case 3:
display(ary,size);
break;
case 4:
search(ary,hFn,size);
break;
default:
printf("Doğru bir seçenek giriniz\n");
break;
}
}while(choice);
return 0;
}