Welcome to Scribd, the world's digital library. Read, publish, and share books and documents. See more
Download
Standard view
Full view
of .
Save to My Library
Look up keyword
Like this
3Activity
0 of .
Results for:
No results containing your search query
P. 1
Ünite_12 - VERİ YAPILARI

Ünite_12 - VERİ YAPILARI

Ratings: (0)|Views: 230 |Likes:
Published by Taner Erkan

More info:

Published by: Taner Erkan on Feb 02, 2012
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as DOC, PDF, TXT or read online from Scribd
See more
See less

11/07/2012

pdf

text

original

 
VERİ YAPILARI
AMAÇLAR 
Veri nesneleri in dinamik olarak haza tahsis etmek ve tahsis edilen alanı boşaltabilmek 
stericiler, kendine dönüşlü yapılar ve yineleme kullanarak bağveri yapılaoluşturabilmek.
Bağlı listeler, sıralar,yığınlar ve ikili ağaçlar oluşturabilmek ve yönetebilmek.
Bağlı veri yapılarının bir çok önemli uygulamasını anlamak.
BAŞLIKLAR 
12.1 GİRİŞ12.2 KENDİNE DÖNÜŞLÜ YAPILAR 12.3 DİNAMİK HAFIZA TAHSİSİ12.4 BAĞLI LİSTELER 12.5 YIĞINLAR 12.6 SIRALAR 12.7 AĞAÇLAR 
12.1 GİRİŞ
Şimdiye kadar tek belirteçli diziler,iki boyutlu diziler ve
struct
lar gibi sabit boyutta olan
veri yapılarını
inceledik.Bu ünite, çalışma zamanında boyutları büyüyebilen ve küçülebilen
dinamik veri yapılarını
tanıtmaktadır.
 Bağlı listeler 
, bir satırda dizilmiş veri nesnelerinin birlikleridir.Bir bağlı listedeki her noktaya ekleme ve her noktadan çıkarma yapılabilir.
Yığınlar 
,derleyicilerde ve işletim sistemlerinde önemlidir.Yığınlara ekleme ve yığınlardançıkarma, yalnızca yığının iki ucundan birinde yapılabilir.
Sıralar 
,bekleme satırlarını temsileder.Sıralara ekleme yalnızca arkadan (
kuyruk 
olarak da bilinir) ve sıralardan çıkarmayalnızca önden (
baş
olarak da bilinir) yapılır.
 İkili ağaçlar 
, verinin çok hızlı aranması vedizilmesini,veri nesnelerinin kopyalarının elenmesini, dosya sistemi dizinlerinin temsiledilmesini ve deyimlerin makine diline çevrilmesini sağlar.Bu veri yapılarından her birininoldukça ilginç uygulamaları vardır.Her veri yapısı tipini inceleyecek ve bu veri yapılarını oluşturan ve yöneten programlar sunacağız.Kitabın diğer kısmında( C++ ‘a ve nesneye yönelik programlamaya giriş) verisoyutlamayı (veri abstraction) çalışacağız. Bu teknik bize, bu veri yapılarını oldukça farklı bir şekilde kullanarak daha kolay elde edilebilir ve özellikle de daha kolay yeniden kullanılabilir yazılımlar tasarlamamızı sağlayacaktır.Bu ünite oldukça zorlayıcı bir kısımdır.Programlar oldukça güçlüdür ve daha öncekiünitelerde öğrenilen çoğu konuyu içermektedir.Programlar, ağırlıkla gösterici yönetiminedayanmaktadır.Bu konu, çoğu kişinin C’ de en zor başlıklar arasında yer aldığını düşündüğü bir konudur.Bu ünite, daha ileri düzeydeki programlama kurslarında kullanabileceğinizoldua pratik programlarla donalmıştır.Ayrıca bu ünite, veri yalan pratik uygulamalarını vurgulayan oldukça zengin alıştırmalar içermektedir.
 
Umarız “Kendi Derleyicinizi Geliştirmek” adkısımdaki proje üzerinde çalışırsınız.C programlarınızı çalıştırabilmeniz için, programlarınızı makine diline dönüştüren bir derleyicikullanıyorsunuz.Bu projede , kendi derleyicinizi oluşturacaksınız.Derleyiciniz, BASIC dilininilk versiyonlarındakine benzer, basit ama güçlü komutlarla yazılmış ifadelerden oluşan bir dosyayı okuyacaktır.Daha sonra, bu ifadeleri Simpletron Makine Dili (SMD) komutlarınadönüştürecektir.SMD dilini, 7.ünitedeki “Kendi bilgisayarınızı geliştirmek” kısmındaöğrenmiştiniz.Simpletron Gerçekleyici programınız, derleyiciniz tarafından üretilen SMD programını çalıştıracaktır.Bu proje, bu kursta öğrendiğiniz bir çok konuyu uygulayabilmeniziçin muhteşem bir fırsat vermektedir.Bu özel kısım, sizi yüksek seviyeli dilin tüm tarifleriüzerinde yürütecek ve her tipte yüksek seviyeli dili makine diline çevirmenizi sağlayacak algoritmaları tanımlayacaktır.Eğer zor işlerle uğraşmaktan hoşlanıyorsanız, alıştırmalardakiderleyici ve Simpletron Gerçekleyici kısımları üzerinde uğraşmanızı tavsiye ediyoruz.
 
12.2 KENDİNE DÖNÜŞLÜ YAPILAR 
Kendine dönüşlü bir yapı , yapı tipiyle aynı tipte bir yapıyı gösteren bir gösterici elemanınasahiptir.Örneğin;
struct dugum{int veri;struct dugum *yeniPtr;};
tanımı,
struct dugum
tipini tanımlamaktadır.
struct dugum
tipindeki yapının iki elemanıvardır:tamsayı elemanı
veri
ve bir gösterici olan
yeniPtr
elemanı.
yeniPtr
elemanı,
structdugum
(burada tanımlanan veri tipiyle aynı tipte bir yapı , bu sebepten de kendine dönüşlüterimi kullanılır) tipindeki bir yapıgöstermektedir.
yeniPtr
elemanı,
bağ(link)
olarak  bilinir.
yeniPtr
,
struct dugum
tipindeki bir yapıyı yine aynı tipteki başka bir yapıya bağlamak için kullanılabilir. Kendine dönüşlü yapılar birbirine bağlanarak listeler, sıralar,yığınlar ve ağaçlar gibi kullanışlı veri tipleri oluşturmakta kullanılabilirler.Şekil 12.1, bir listeoluşturmak için bağlanmış kendine nüşiki yapıyı tasvir etmektedir.İkinci kendinedönüşlü yapının bağ elemanında, bağın başka bir yapıyı göstermediğini belirtmek için bir ters bölü işaretinin(
NULL
’u temsil etmektedir) kullanıldığına dikkat ediniz.Ters bölü işaretiyalnızca sterimlerde kullanılmaktar,C’ deki ters karakteriyle bir alakasıyoktur.
NULL
gösterici(null karakterin string sonunu göstermesi gibi) veri yapısının sonunugösterir.Genel Programlama Hataları 12.1
 Bir listenin son bağına NULL yerleştirmemek.
12.3 DİNAMİK HAFIZA TAHSİSİ
Dinamik veri yalayaratmak ve netmek in dinamik hafıza tahsisi yapmak gerekir.Dinamik hafıza tahsisi programın çalışma zamanında yeni düğümleri tutabilmesi içindaha fazla hafıza alanı elde etme yeteneğidir.Dinamik hafıza tahsisinin limiti bilgisayardakikullanılabilir fiziksel hafıza miktarı kadar ya da sanal hafıza sistemlerinde sanal hafıza kadar  büyük olabilir.Sıklıkla, limitler daha küçüktür çünkü kullanılabilir hafıza kullanıcılar arasında paylaştırılmalıdır.
 
Şekil 12.1
İki kendine dönüşlü yapı birbirine bağlanmıştır.
malloc
ve
free
fonksiyonları ile
sizeof 
operatörü, dinamik hafıza tahsisi için gereklidir.
malloc
fonksiyonu, tahsis edilecek byte sayısını argüman olarak alır ve tahsis edilen alanı gösteren
void*
tipte bir gösterici döndürür.
void*
bir gösterici her tipteki göstericiye atanabilir.
malloc
fonksiyonu normalde
sizeof 
operatörü ile kullanılır.Örneğin,
yeniPtr = malloc ( sizeof ( struct dugum ) )
ifadesi,
struct dugum
tipindeki yapının boyutunu byte olarak hesaplar,
sizeof(struct dugum)
 byte’lık yeni bir hafıza alanı tahsis eder ve
yeniPtr
değişkene tahsis edilen alan için bir göstericiyi depolar. Eğer uygun hafıza yoksa,
malloc
 
NULL
bir gösterici döndürür.
free
fonksiyonu tahsis edilen alanı serbest bırakır(hafıza sisteme geri döndürülür,böyleceileride yeniden tahsis edilebilir)Az önceki
malloc
çağrısı ile dinamik olarak tahsis edilenhafıza alanını serbest bırakmak için
free ( yeniPtr ) ;
ifadesi kullanılır.İlerleyen kısımlar listeleri, yığınları, sıraları ve ağaçları anlatacaktır. Bu veri yapılarının her  biri, dinamik hafıza tahsisi ve kendine dönüşlü yapılar sayesinde oluşturulur ve yönetilir.
Taşınırlık İpuçları 12.1
 Bir yapının boyutu, elemanlarının boyutları toplamına eşit olmak zorunda değildir.Bunun sebebi, çeşitli makinelerde hizalamanın farklı yapılmasıdır(10.üniteye bakınız)
Genel Programlama Hataları 12.2
 Bir yapının boyutunun, elemanlarının boyutlarının toplamına eşit olduğunu düşünmek.
İyi Programlama Alıştırmaları 12.1
 Bir yapının boyutuna karar vermek için
 sizeof 
operatörünü kullanmak.
İyi Programlama Alıştırmaları 12.2
malloc
kullanırken,geri dönüş değerinin
 NULL
gösterici olup olmadığına kontrol etmek.Eğer istenen hafıza tahsis edilemezse bir hata mesajı yazdırmak.
Genel Programlama Hataları 12.3
 Dinamik olarak tahsis edilen hafızaya ihtiyaç kalmadığında, tahsis edilen hafızayı sisteme geri döndürmemek.Bu, sistemin olması gerekenden daha erken bir zamanda hafıza sıkıntısıçekmesine sebep olur.
İyi Programlama Alıştırmaları 12.3
 Dinamik olarak tahsis edilen hafızaya ihtiyaç kalmadığında,hafızayı sisteme anında geridöndürmek için
 free
kullanın.
1510

You're Reading a Free Preview

Download
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->