NİŞANTAŞI ÜNİVERSİTESİ Veri Yapıları ve Algoritmalar DERS 2 NİŞANTAŞI ÜNİVERSİTESİ © Mühendislik Mimarlık Fakültesi mmf.nisantasi.edu.tr
YBLG202 Veri Yapıları ve Algoritmalar DERS 2 VERİ YAPILARI, DİZİLER, YAPILAR, DİNAMİK DİZİLER NİŞANTAŞI ÜNİVERSİTESİ ©
NİŞANTAŞI ÜNİVERSİTESİ © VERİ YAPILARI Veri Yapıları Programlamada veri yapıları en onemli unsurlardan birisidir. Program kodlarını yazarken kullanılacak veri yapısının en ideal şekilde belirlenmesi, belleğin ve calışma biciminin daha etkin kullanılmasını sağlar. Program icerisinde işlenecek veriler diziler ile tanımlanmış bir veri bloğu icerisinden secilebileceği gibi, işaretciler kullanılarak daha etkin şekilde hafızada saklanabilir. Veri yapıları, dizi ve işaretciler ile yapılmasının yanında, nesneler ile de gercekleştirilebilir. NİŞANTAŞI ÜNİVERSİTESİ ©
NİŞANTAŞI ÜNİVERSİTESİ © VERİ YAPILARI Veri Yapıları Verileri tanımlayan veri tiplerinin, birbirleriyle ve hafızayla ilgili tum teknik ve algoritmik ozellikleridir. NİŞANTAŞI ÜNİVERSİTESİ ©
NİŞANTAŞI ÜNİVERSİTESİ © VERİ YAPILARI Diziler C dilinde dizi (array), aynı türden bir ya da daha fazla nesnenin bellekte bir dizi veri yapısı biçiminde tutulmasını garanti eden araçtır. C’de bir dizinin tanımlanmasıyla birden fazla sayıda nesne tek bir deyimle tanımlanabilir.10 elemana sahip bir dizi tanımlamak yerine, şüphesiz isimleri farklı 10 ayrı nesne de tanımlanabilir. Ama 10 ayrı nesne tanımlandığında bu nesnelerin bellekte ardışıl olarak yerleşmeleri garanti altına alınmış bir özellik değildir. Oysa dizi tanımlamasında, dizinin elemanı olan bütün nesnelerin bellekte ardışıl olarak yer almaları garanti altına alınmış bir özelliktir. Dizi de bir veri türü olduğuna göre dizilerin de kullanılmalarından önce tanımlanmaları gerekir. NİŞANTAŞI ÜNİVERSİTESİ ©
NİŞANTAŞI ÜNİVERSİTESİ © VERİ YAPILARI Göstericiler Adresler tamsayı görünümünde olsalar da tamsayı sabitleri gibi belirtilmezler. Çünkü tür bilgilerinin de belirtilmesi gerekir. Adres sabitleri, tamsayı türlerindeki sabitler üzerinde bilinçli tür dönüşümü yapılarak elde edilirler. Bir tamsayı sabitini adres türüne çevirmek için tür dönüştürme operatörü kullanılır. (<tür> *) <tamsayı sabiti> Tür dönüştürme operatörünün içindeki * adres ya da göstericiyi temsil etmektedir. Örneğin 0x1F00 hexadesimal olarak gösterilmiş int türden bir sabittir. Ancak: (int *) 0x1F00 NİŞANTAŞI ÜNİVERSİTESİ ©
NİŞANTAŞI ÜNİVERSİTESİ © VERİ YAPILARI Yapı nedir Yapılar (structures) programcının birden fazla nesneyi bellekte ardışıl olarak yaratmasına izin veren bir sentaks aracıdır. Yapıların kullanılmasıyla bellekte birbirini izleyecek şekilde yer alan birden fazla nesne yaratılabilir. Bellekte ardışıl nesnelerin dizi tanımlamalarıyla da yaratılabileceğini biliyorsunuz. Ancak yapıların dizilerden bazı farklılıkları vardır: Diziler aynı türden nesneleri içinde tutabilirken, yapılar farklı türlerden nesneleri tutabilirler. Yapıların kullanılmasının ana nedeni budur. Çoğu zaman, türleri farklı bir takım nesneler, mantıksal olarak bir bütün oluşturabilirler. İsim, yaş, cinsiyet, departman, ücret, öğrenim durumu gibi bilgileri farklı türden nesneler içinde saklayabiliriz ve bunların tamamı bir işyerinde çalışan bir kişiye ait bilgiler olabilir. Aralarında mantıksal ilişki olan farklı türden veriler yapılar içinde saklanabilir. NİŞANTAŞI ÜNİVERSİTESİ ©
NİŞANTAŞI ÜNİVERSİTESİ © VERİ YAPILARI Yapı Bildirimi Yapı ile programcının yeni bir tür yaratmasına olanak sağlar. Yapıların kullanılabilmesi için yapılması gereken ilk işlem bu yeni türü derleyiciye tanıtmaktır. Tanıtma işlemi yapı bildirimi (structure declaration) ile olur. Yapı bildirimini gören derleyici, bu yeni tür hakkında bilgi edinmiş olur. Bu bildirimle derleyiciye aşağıdaki bilgiler verilir: - türün ismi - türün bellekte ne kadar yer kapladığı - elemanların isimleri Derleyici bir yapı bildirimini gördükten sonra, bu türden bir nesne tanımlandığında nesne için bellekte ne kadar yer ayıracağını öğrendiği gibi, bu nesnenin programcı tarafından kullanımına ilişkin ifadelere ilişkin derleme zamanında bazı kontroller yapabilir. Yapı bildiriminin belirli bir sentaksı vardır. NİŞANTAŞI ÜNİVERSİTESİ ©
NİŞANTAŞI ÜNİVERSİTESİ © VERİ YAPILARI Dinamik Bellek Yönetimi C dilinde bir dizi tanımlandığı zaman, bu dizi için derleyici tarafından bellekte yer ayrılır. Örneğin: int a[100]; Derleme sırasında yukarıdaki gibi bir dizi tanımlaması ile karşılaşan derleyici bellekte (eğer kullanılan sistemde int türü uzunluğunun 2 byte olduğu varsayılırsa) toplam 200 byte yer ayıracaktır. Programın çalışması sırasında bir dizinin uzunluğunu değiştirmek mümkün değildir. Diziler konusunda açıklandığı gibi, dizi tanımlama ifadelerinde dizi boyutunu gösteren ifade (köşeli parantezin içerisindeki ifade) sabit ifadesi olmalıdır, değişken içeremez. Çünkü derleyicinin bellekte yer ayırması için, dizi boyutunu bilmesi gerekir. Oysa pratikte birçok uygulamada açılması gereken dizinin boyutu programın çalışması sırasında (runtime) belirlenmektedir. NİŞANTAŞI ÜNİVERSİTESİ ©
NİŞANTAŞI ÜNİVERSİTESİ © VERİ YAPILARI malloc fonksiyonu malloc fonksiyonu programın çalışma zamanı sırasında bellekten dinamik bir blok elde etmek için kullanılır. Fonksiyonun stdlib.h başlık dosyası içindeki bildirimi aşağıdaki gibidir: void *malloc(size_t nbyte); size_t türünün derleyiciyi yazanların seçimine bağlı olarak unsigned int ya da unsigned long türlerinden birinin yeni tür ismi olarak tanımlanması gerektiğini, ve sistemlerin hemen hemen hepsinde size_t türünün unsigned int türü olduğunu hatırlayalım. Fonksiyona gönderilecek arguman ayrılmak istenen bloğun byte olarak uzunluğudur. Ayrılan alanın sürekli (contigious) olması garanti altına alınmıştır. malloc fonksiyonunun geri dönüş değeri elde edilen bellek bloğunun başlangıç adresidir. NİŞANTAŞI ÜNİVERSİTESİ ©
NİŞANTAŞI ÜNİVERSİTESİ © VERİ YAPILARI Veri Yapısı, bilgisayarda verinin saklanması (tutulması) ve organizasyonu icin bir yoldur. Veri yapılarını saklarken ya da organize ederken iki şekilde calışacağız; 1- Matematiksel ve mantıksal modeller (Soyut Veri Tipleri – Abstract Data Types - ADT): Bir veri yapısına bakarken tepeden (yukarıdan) soyut olarak ele alacağız. Yani hangi işlemlere ve ozelliklere sahip olduğuna bakacağız. Soyut bakışın icerisinde uygulama (implementasyon) yoktur. Ornek olarak bir listeyi ele alabiliriz. Bu listenin ozelliklerinden bazılarını aşağıda belirtirsek, Liste; - Herhangi bir tipte belirli sayıda elemanları saklasın, - Elemanları listedeki koordinatlarından okusun, - Elemanları belirli koordinattaki diğer elemanlarla değiştirsin (modifiye), - Elemanlarda guncelleme yapsın, Ekleme/silme yapsın 2- Uygulama (Implementation): Matematiksel ve mantıksal modellemenin uygulamasıdır. Diziler, programlamada cok kullanışlı veri yapıları olmasına rağmen bazı dezavantajları ve kısıtları vardır Soyut veri tipleri (ADT)’nin resmi tanımını şu şekilde yapabiliriz; Soyut veri tipleri (ADTs) sadece veriyi ve işlemleri (operasyonları) tanımlar, uygulama yoktur. Bazı veri tipleri; - Arrays (Diziler) - Linked List (Bağlı liste) - Stack (Yığın) - Queue (Kuyruk) - Tree (Ağaç) - Graph (Graf, çizge) NİŞANTAŞI ÜNİVERSİTESİ ©
YBLG202 Veri Yapıları ve Algoritmalar Kaynakça NİŞANTAŞI ÜNİVERSİTESİ ©
NİŞANTAŞI ÜNİVERSİTESİ © KAYNAKÇA M. T. Goodrich, R. Tamassia, D. M. Mount, Data Structures and Algorithms in C++, John Wiley & Sons, Inc., 2011 Hakan Kutucu, VERİ YAPILARI, Karabük Üniversitesi Mühendislik fakültesi, 2014 Data Structures and Algorithms, TutorialPoints, NİŞANTAŞI ÜNİVERSİTESİ ©