AHMET YESEVİ ÜNİVERSİTESİ BİLİŞİM SİSTEMLERİ VE MÜHENDİSLİK FAKÜLTESİ BİLGİSAYAR MÜHENDİSLİĞİ LİSANS DÖNEM ÖDEVİ TBIL-303-01 Veri Yapıları ve Algoritmalar İki Yönlü Bağlantılı Liste Uygulaması HAZIRLAYAN 122132151 Fahri DÖNMEZ DANIŞMAN Dr. Mehmet ŞİMŞEK Kasım 2014
Verilen tek yönlü bağlantılı liste uygulamasının kodları değiştirilerek iki yönlü bağlantılı liste uygulaması yazıldı. Yazılan uygulamanın kaynak kodlarını ve derlenmiş dosyayı ekte gönderilmiştir. 2
Uygulamanın test adımları aşağıdaki gibidir: Kayıt eklemek için E tuşu girilir. Bilgi olarak tamsayı 1 ve mesaj olarak A girilir. Tekrar kayıt eklemek için yine E girilir. Bilgi olarak tamsayı 2 ve mesaj olarak B girilir. Tekrar kayıt eklemek için yine E girilir. Bilgi olarak tamsayı 3 ve mesaj olarak C girilir. 3
L tuşu ile girilmiş bilgiler listelenir. A tuşu ile arama işlemine girilir. Aranan a da tam sayı olarak girdiğimiz bilgi 2 girince bilgi bulunup ekrana getirilir. 4
Silme işlemi için S tuşu girilir. Seçiminiz olarak sorduğunda tamsayı olarak listeye girdiğimiz silinecek 2 yi girdim ve bilgi silindi. Silme işleminin gerçekleştiğini görmek için L ile listelediğimizde 2 bilgisinin silindiği gözüküyor. C ile de uygulamadan çıkıyoruz. Uygulamanın kodları ekte de.c dosyasında vardır. /*Ahmet Yesevi Üniversitesi*/ /*Bilgisayar Mühendisliği Uzaktan Eğitim Programı 2014 - Fahri Dönmez*/ /*Veri Yapıları ve Algoritmaları - Mehmet Şimşek*/ /* Listedeki düğümlerin veri yapısı tanımlaması */ #include <stdio.h> 5
#include <stdlib.h> #include <conio.h> #include <locale.h> typedef struct topluluk int bilgi; char mesaj[100]; struct topluluk *on; struct topluluk *arka; BLISTE2; /* Listenin ilk ve son düğüm adreslerinin tutan işaretçileri */ BLISTE2 *ilk2=null, *son2=null; /* Fonksiyon bildirimleri */ BLISTE2 *arama(int); BLISTE2 *silme(int); BLISTE2 *okuklavye(); void yazekrana(bliste2 *); /* Ana Program*/ main() BLISTE2 *eklenecek, *ki; int bilgi, sonuc; char secim; setlocale(lc_all,"turkish"); puts("\nahmet Yesevi Uluslararası Türk Kazak Üniversitesi"); puts("\nbilgisayar Mühendisliği 2014 - Fahri Dönmez"); puts("\nveri Yapıları ve Algoritmaları "); puts("\niki Yönlü Bağlantılı Liste Uygulaması"); puts("\nekleme\nlisteleme\narama\nsilme\nçıkış\nseçiminiz?"); while(1) secim=getchar(); switch(secim) case 'E': eklenecek=okuklavye(); 6
if(eklenecek!=null) ekle(eklenecek); else puts("ekleme için Bellek Dolu\n"); break; case 'L': sonuc=listele(); if(sonuc==-1) puts("boş Liste!"); break; case 'A': puts("aranan:"); scanf("%d", &bilgi); ki=arama(bilgi); if(ki==null) puts("aranan Bulunamadı"); else yazekrana(ki); break; case 'S': puts("silinecek:"); scanf("%d", &bilgi); ki=silme(bilgi); if(ki!=null) puts("silindi..."); else puts("silinmek istenen yok!"); break; case 'ç': case 'Ç': case 'c': case 'C': puts ("Hoşçakal!"); exit(0); case '\n': puts("\nekleme\nlisteleme\narama\nsilme\nçıkış\nseçiminiz?"); break; default: puts("yanlış Seçim!!!"); /* switch'in */ /* while döngüsünün */ /* ana programın */ 7
/* Kayıt ekleme fonksiyonu */ int ekle(bliste2 *ki) if(ilk2!=null) /* halıhazırda kayıt var mı? */ son2->arka=ki; /* arkaya bağla */ ki->on=son2; /* öne bağla */ son2=ki; /* son düğüm yeni eklenen */ son2->arka=null; /* son düğümün arkası NULL */ else /* ilk düğüm ise burası yürütülür */ ilk2=ki; /* ilk ve son düğüm aynı */ son2=ki; ilk2->arka=null; ilk2->on=null; return 0; /* Listedeki tüm kayıtları listeleme */ int listele() BLISTE2 *p; p=ilk2; if(p==null) return -1; /* boş liste ise dön */ while(p) yazekrana(p); /* düğümün içeriğini ekrana yazıyor */ p=p->arka; return 0; /* arama yapar ve ilk bulduğu düğümün adresini gönderir */ BLISTE2 *arama(int aranan) 8
BLISTE2 *p; p=ilk2; while(p!=null) if(p->bilgi==aranan) return p; /* bulunursa adresi gönderiliyor */ p=p->arka; /* bir sonraki düğümün adresi */ return NULL; /* bulunamadı anlamında NULL gönderiliyor */ /* düğüm silme fonksiyonu */ BLISTE2 *silme(int silinen) BLISTE2 *p; p=arama(silinen); if(p==null) return NULL; if(ilk2==p) /* ilk düğüm mü? */ if(ilk2->arka!=null) /* listede birden çok düğüm var */ ilk2=p->arka; ilk2->on=null; else /* listede yalnızca bir düğüm var */ ilk2=null; son2=null; else /* aradan bir düğüm mü? */ p->on->arka=p->arka; if(p==son2) /* silinen son düğüm ise */ son2=son2->on; else p->arka->on=p->on; free(p); return p; 9
/* Bir kayıt bilgisini ekrana yazar */ void yazekrana(bliste2 *yazilacak) printf("bilgi:%d, mesaj:%s\n",yazilacak->bilgi, yazilacak->mesaj); /* Bir kayıt bilgisini klavyeden okur; dinamik olarak yerleştirir */ BLISTE2 *okuklavye() BLISTE2 *okunan; okunan=malloc(sizeof(bliste2)); /* dinamik olarak yer isteniyor */ if(okunan==null) /* boş yer verildi mi? */ return NULL; /* boş yer yok ise NULL gelir */ puts("bilgi Giriniz:"); scanf("%d",&(okunan->bilgi)); puts("mesaj Giriniz:"); scanf("%s", okunan->mesaj); return okunan; /* bilginin yerleştirildiği adres gönderiliyor */ 10