25 Aralık 2009 Cuma

menü tabanlı ağaç uygulaması

//veri yapıları dersi için menü tabanlı ağaç uygulaması yazdım,kitaptan da yardım alarak üzerinde değişiklikler ve eklemeler yaparak yazıldı.
#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:

 
Facebook

Bizi takip edin!

ESOGÜ Bilişim GünleriESOGÜ Bilişim Günleri