Süre 60 dakika, sınav açık kitaptır. Sınavda hiçbir şekilde fotokopi ve bilgisayar çıktısı kabul edilmeyecektir. Başarılar J
Soru 0) Tek yönlü bir bağlı listenin eleman sayısını bastıran kodu yazınız.(10 puan)
int say(node *ll){
int say = 0;
while(ll!=NULL){
say ++;
ll=ll->next;
}
printf(“%d”,say);
}
Soru 1) Tek yönlü bir bağlı listeyi ters çeviren kodu yazınız. (Sonuçta yine tek yönlü bir bağlı liste döndürülecek ancak elemanlar ters sıralı olacaktır)
node * ters (node *ll){
if(ll==NULL)
return ll;
node *s = ll->next;
node *p = s->next;
while (p!=NULL){
s->next = ll;
ll=s;
s=p;
p=p->next;
}
}
Soru 2) Toplam 3 adet yığın (stack) kullanarak en büyük sayıyı çıkaran ( popEnbuyuk() ) fonksiyonu yazmanız isteniyor. Buna göre yığınların pop ve push fonksiyonlarının yazılı olduğunu kabul edip bu fonksiyonları hazır bir şekilde kullanabilirsiniz. Yazacağınız bu yeni veri yapısını bir ADT (abstract data type, soyut veri tipi) olarak tasarlayınız ve veri yapınızın popEnbuyuk ve push fonksiyonlarının algoritmasını yazınız.
Stack1 için pop1, push1; stack2 için pop2, push2 ve stack3 için push3, pop3 fonksiyonları kullanılmıştır. Verilerin ilk başta 1. Stackte bulunduğu kabul edilmiştir. Stack 2 ve 3 boş olarak başlanmıştır.
int popEnbuyu(){
int eb = pop1();
while(!isEmpty1()){
int temp = pop1();
if(temp > eb)
eb= temp;
push2(temp);
}
while(!isEmpty2()){
push1(pop2());
}
}
void push(int sayi){
push1(sayi);
}
Soru3) Çalıştığınız firmada, yeni bir veri yapısı tasarlamanız isteniyor. Buna göre veri yapınıza eleman eklenebiliyor ancak çıkarılmıyor. Elemanlarınız sırayla dolaşılıp, sıradaki eleman alınabiliyor. Listenizdeki elemanlar bitince tekrar baştaki elemanlardan dolaşma işlemi devam ediyor. Listenize yeni bir eleman eklenince, sıradaki elemanların en sonuna atılıyor.
Yukarıda anlatılan bu yapıyı en uygun bağlı liste yapısını kullanarak kodlayınız ve kullandığınız yapının neden en iyi yapı olduğunu açıklayınız.
Tek yönlü dairesel bağlı listenin, sıradaki elemanını ve bir önceki elemanını tutan yapıdır.
Yukarıdaki bu tek cümlenin yazılması cevap olarak yeterli olmakla birlikte aşağıdaki şekilde kodunu yazmanız da mümkündür:
node * siradaki(node *bas, node * son, int * sonuc){
sonuc = bas->data;
son = bas;
return bas->next;
}
node *ekle(node * bas, node * son, int data){
son->next = (node*)malloc(sizeof(node));
son= so->next;
son->next = bas;
son->data = data;
}
“Bir kodun sadece %10’dan daha az bir kısmı sistemin gerçek amacı için vardır. Geri kalanı giriş-çıkış, veri kontrolü, veri yapılarının yönetimi ve diğer ev işlerini yapmaya yarar”
–
Mary Shaw