Alttaki soruya sorunun atkındaki kod olur mu?yani yaklaşıkolarak…
typedef struct Satir
{
int numara;
char ad[20], soyad[20];
struct Satir *sonraki;
struct Satir *onceki;
} Satirlar;
Yukarıdaki yapıda olan ve bilgileri text dosyada "#"karakteri ile ayrılmış olarak tutulan "Ogrenciler.txt" dosyasındakikayıtları öğrenci numarasına göre kendiniz belirleyeceğiniz en az 2 farklı hashfonksiyonu kullanarak:
1) Hash tablosunaekleyiniz.
2) Hash tablosu üzerinde öğrenci numarasına göre arama yapacakbir Hash_Arama() fonksiyonu yazınız. Yazacağınız fonksiyon, aranan kayıdakullandığınız farklı hash fonksiyonlarına göre kaç adımda ulaştığıbilgilerinide listeleyecektir.
3) Her hash fonksiyonuiçin Hash tablosu üzerindeki tüm kayıtlara ortalama kaç adımda ulaşıldığınıhesaplayacak bir fonksiyon yazınız.
(Not: Çakışmaya çözümolarak çift yönlü bağlı liste tekniği kullanılacaktır.)
#include<string.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
FILE *file;
typedef struct Satir
{
int number;
int index;
char ad[20], soyad[20];
struct Satir *sonraki;
struct Satir *onceki;
} Satirlar;
typdef struct _Table{
Satirlar str[20];
}Table;
Table table;
voidinitialize_Table(){
int i;
for(i=0;i<20;i++){
table.str.index=-1;
table.str.sonraki=NULL;
table.str,onceki=NULL;
}}
voidcreatNewFile()//dosya yoksa ilk defa yaratmak için
{
int i;
FILE *file;
if ( ( file =fopen( "data.dat", "wb" ) ) == NULL )//dosya ilk defayaratılacak
{
printf("File could not be created.\n" );
}
else
{
printf("File creating...\n" );
structSatir new_satir;
for(i=0;i<20;i++){
fwrite(&new_satir,sizeof(structSatir),1,file);}
fclose(file);
return;
}
int has1(int number){
return number%20;
}
void printAllFile()
{
struct Satirnew_satir;
int i;
system("cls");
fseek(file, 0,SEEK_SET);
for(i=0;i<20;i++)
{
if(i==20)
printf("----------------------------------------------------------------\n");
fread(&new_satir,sizeof(structSatir),1,file);
printf("%d%d %s %d\n",i,new_ogrenci.number,new_ogrenci.ad,new_ogrenci.index);
}
}
voidprintToFile(struct Satir str)
{
struct ogrencitemp;
struct ogrenciorigin;//probe 1 olan öğrenci
int hashing;
int adress;
intfp_counter;//file pointer counter
hashing=hash(ogrenci.number);
fseek(file,sizeof(struct Satir)*hashing, SEEK_SET);
fread(&origin,sizeof(structSatir),1,file);
if(origin.number==-1)//hashfonksiyonundan çıkan home adress boş ise direk yerine yazar
{
ogrenci.next=-1;
fseek(file,sizeof(struct Satir)*hashing, SEEK_SET);
fwrite(&ogrenci,sizeof(structogrenci),1,file);
}
else//homeadress dolu ise
{
ogrenci.next=origin.next;
fseek(file,sizeof(struct Satir)*(REALSIZE-1), SEEK_SET);
fread(&temp,sizeof(structSatir),1,file);
fp_counter=REALSIZE-1;//dosyasonu
while(temp.number!=-1&& fp_counter>=0)//dosya sonundan boş buluncaya kadar geri geliyoruzve dosyanın en başına gelirsek artık dosyanın dolu olduğu uyarısı veriyoruz.
{
fp_counter--;
fseek(file,sizeof(struct Satir)*fp_counter, SEEK_SET);
fread(&temp,sizeof(structSatir),1,file);
}
if(fp_counter>=0)//whiledan çıkma sebebi boş yer bulması ise
{
fseek(file,sizeof(struct Satir)*-1, SEEK_CUR);
fwrite(&ogrenci,sizeof(structSatir),1,file);
origin.next=fp_counter;
fseek(file,sizeof(struct Satir)*hashing, SEEK_SET);
fwrite(&origin,sizeof(structSatir),1,file);
}
else//whiledan çıkma sebebinin dosyanın en başına kadar ulaşmış ancak yer bulamamış olması
{
printf("Fileis full!!!\n");
}
}
}
int find(intnumber)//girilen bi numaralı öğrencinin kayıtlarda olup olmadığı
{
struct ogrencistır;
inthashing=hash(number);
fseek(file,sizeof(struct Satir)*hashing, SEEK_SET);
fread(&ogrenci,sizeof(structSatir),1,file);
while(ogrenci.number!=number&& stır.next!=-1)
{
fseek(file,sizeof(struct Satir)*stır.next, SEEK_SET);
fread(&stır,sizeof(structSatir),1,file);
}
if(stır.number==number)
{
return1;
}
else
{
return0;
}
}
nt main()
{
int key=0;//menüde seçim
intnumber;//find fonksiyonu için numara alma
struct Satirnew_satir;
if ( ( file =fopen( "data.dat", "rb+" ) ) == NULL )//dosya varsaaçılıyor
{
//dosyayoksa yaratılıyor
printf("File could not be opened.\n" );
creatNewFile();//yoksayaratılıyor
if ( (file = fopen( "data.dat", "rb+" ) ) == NULL )//tekraraçmaya çalışıyor
{
printf("File could not be opened. Program stops\n" );
}
else
{
printf("File is opened now.\n" );
}
}
///////
printf("------------------\nMenu:\n1-InsertRecord\n2-Print File\n3-FindRecord\n4-Exit\n------------------\nChoice:");
scanf("%d",&key);
while(key!=4)
{
switch (key)
{
case 1:
printf("StudentNumber:");
scanf("%d",&(new_satir.number));
while(find(new_satir.number))
{
printf("Thereis student with this number,Enter new number!\nStudent Number:");
scanf("%d",&(new_satir.number));
}
printf("StudentName:");
scanf("%s",&(new_ogrenci.name));
printf("StudentMidterm1:");
break;
case 2:
printAllFile();
break;
case 3:
printf("Enternumber:");
scanf("%d",&number);
if(find(number))
printf("Studentis found!\n");
else
printf("Studentis not found!\n");
break;
default:
printf("WrongChoice!\n");
break;
}
printf("------------------\nMenu:\n1-InsertRecord\n2-Print File\n3-FindRecord\n4-Exit\n------------------\nChoice:");
scanf("%d",&key);
system("cls");
}
}