#include
#include
#include
typedef struct topluluk{
int bilgi;
struct topluluk *sol,*sag;
}agac;
agac *kok=NULL;
agac *ara(),*sil(),*okuklavye();
void ekranayaz(),ekle(),listele(),terslistele();
agac *sirala();
agac *ara();
int sayagacdugum();
int main(int argc, char *argv[])
{
agac *yeni,*adres;
int bilgi,miktar;
char secim;
while(1){
puts("\nekleme --------e\nsilme-------s\nkucukten buyuge sıralama----------l\nsayma----S\nprogramdan cıkıs------c\nara-----a\nbuyukten kucuge sırala------t ");
secim=getch();
switch(secim){
case 'e': yeni=okuklavye();
ekle(kok,yeni);
break;
case 'l':if(kok!=NULL)
listele(kok);
else
puts("bos liste");
break;
case 's':
puts("silinecek:");
scanf("%d",&bilgi);
adres=sil(kok,bilgi);
if(adres!=NULL)
puts("silindi");
else
puts("silinmek istenen yok!!!!");
break;
case 'c':
puts("hoşçakal!!!!!");
exit(0);
break;
case 'S': miktar=sayagacdugum(kok,0);
printf("agactaki eleman sayısı:%d",miktar);
break;
case 'a':
puts("aranan:");
scanf("%d",&bilgi);
adres=ara(kok,bilgi);
if(adres==NULL)
puts("Aaranan bulunamadı");
else
ekranayaz(adres);
break;
case 't':
if(kok!=NULL)
terslistele(kok);
else
puts("bos liste");
break;
default:
puts("yanlıs secim!!!");
}
}
}
void ekle(agackok,yeni)
agac *agackok,*yeni;
{
if(agackok==NULL)kok=yeni;
else
{
if((yeni->bilgi) <= (agackok->bilgi)){
if(agackok->sol==NULL)
agackok->sol=yeni;
else ekle(agackok->sol,yeni);
}
else{ if(agackok->sag==NULL)
agackok->sag=yeni;
else ekle(agackok->sag,yeni);
}
}
}
void listele(agac *agackok){
if(agackok!=NULL)
{listele(agackok->sol);
ekranayaz(agackok);
listele(agackok->sag);
}
}
void ekranayaz(agac *veri){
printf("\nbilgi:%d",veri->bilgi);
}
agac *sil(agac *agackok,int silinecek)
{ agac *qa,*q,*qc,*sa,*s;
if(agackok==NULL)//ağaçta düğüm olup olmadığı
return NULL;
q=agackok;
qa=NULL;
//silnecek veriyi içeren düğümğn ağaçta olup olmadığı vearsa kendisinin ve ailesinin adresinin bulunması
while(q!=NULL && q->bilgi!=silinecek){
qa=q;
if(silinecek <=q->bilgi)
q=q->sol;
else
q=q->sag;
}
if(q==NULL)//aranan bulundu mu
return NULL;//aranan yok
if(q->sol!=NULL && q->sag!=NULL)//iki alt cocuğu varsa
{
//iki çocuk varsa sol alt ağaçtaki en büyük değerin bulunması ve silinecek olanla yer değişmesi
s=q->sol;
sa=q;
while(s->sag!=NULL){
sa=s;
s=s->sag;
}
q->bilgi=s->bilgi;
q=s;
qa=sa;
}
if(q->sol!=NULL)//qnun en fazla bir çocuğu olabilir
qc=q->sol;
else
qc=q->sag;
//düğüm silme
if(q==agackok)//silinecek olan kök mü
kok=qc;
else
{ //q sag mı sol mu
if(q==qa->sol)
qa->sol=qc;
else
qa->sag=qc;
}
free(q);
return q;
}
int sayagacdugum(agac *agackok,int miktar)
{ if(agackok==NULL) return miktar;//agac bos ise mikrarı değiştirmeden geri döner
miktar++;
miktar=sayagacdugum(agackok->sol,miktar);
miktar=sayagacdugum(agackok->sag,miktar);
return miktar;
}
agac *okuklavye()
{ agac *yeni;
yeni=malloc(sizeof(agac));
if(yeni==NULL){
puts("bellek dolu");
return NULL;
}
puts("bilgi giriniz:");
scanf("%d",&(yeni->bilgi));
yeni->sag=NULL;
yeni->sol=NULL;
return yeni;//bilginin yerleştirildiği adres gönderiliyor
}
agac *ara(agackok,aranan)
agac *agackok;
int aranan;
{ while(agackok!=NULL && agackok->bilgi!=aranan)
{ if(aranan< agackok->bilgi)
agackok=agackok->sol;
else
agackok=agackok->sag;
}
return agackok;
}
agac *sirala(agackok)
agac *agackok;
{
ekranayaz(agackok->sol);
sirala(agackok);
ekranayaz(agackok->sag);
}
void terslistele(agac *agackok)
{ if(agackok!=NULL)
{ terslistele(agackok->sag);
ekranayaz(agackok);
terslistele(agackok->sol);
}
}
Hiç yorum yok:
Yorum Gönder