You are on page 1of 29

Veri Modelleri

Kaynak
• Algoritma Geliştirme ve Veri Yapıları, Toros Rifat ÇÖLKESEN,
Papatya Yayıncılık, 3. Basım
Veri Modelleri
• Veri modelleri, veriler arasındaki ilişkisel ve sırasal düzeni gösteren
kavramsal tanımlardır.
• Her program en azından bir veri modeline dayanır. Program için
uygun veri modelinin seçilmesi en etkin programın yazılmasını sağlar.
• Bilinen veri modellerinin bazıları şu şekilde sıralanabilir.
• Bağlantılı liste
• Ağaç
• Graf
• Durum makinası
• Veritabanı-ilişkisel
• Ağ bağlantı
• Bir uygulama bu veri modellerinden birine yaklaştırlırsa
gerçekleştirilmesi kolaylaşır. Çünkü bilinen veri modelleri ile yazılmış
bir çok algoritma vardır ve programcı bu algoritmaları kendi
uygulaması için rahatça kullanabilir.
• Uygun veri modeline dayanmayan tasarımlar çoğu zaman giderilmesi
güç sorunlara yol açarlar.
Örnek Veri Modelleri

Bağlantılı Liste

Ağaç

Graf
Bağlantılı Liste
• Bağlantılı liste aynı kümeye ait verilerin bellek üzerinde birbirlerine
sanal olarak bağlanması ile oluşturulur.
• Bağlantılı liste veri yapısında temel olarak iki kısım bulunur.
Bunlardan ilki verinin kendisi için diğeri ise bağlantı için kullanılan
kısımlardır. Veri kısmında bir veya birden fazla veri bulunabilir.
Bağlantı kısmı ise bir işaretçi içerir. Bu işaretçi ait olduğu verinin
bağlantısı nereye yapılacaksa orayı işaret eder.
• Bağlantılı liste bilgisayar biliminde önemli bir yere sahiptir. Bu veri
yapısı hem tek başına belli problemlerin çözümü için hem de diğer
veri yapılarının içerisinde ara bileşen olarak kullanılmaktadır.
• Bağlantılı listenin dezavantajı liste üzerindeki ara elemanlara hızlıca
erişilememesi ve arama gerektiren uygulamalarda algoritma
karmaşıklılığının yüksek olmasıdır.
Veri parçalarının Bağlantı bilgisinin
koyulacağı kısım tutulacağı kısım,
işaretçi
Veri Bağ

Bağlantılı Liste Veri Yapısı


Tek Yönlü Bağlantılı Liste
• En yalın bağlantılı liste veri yapısıdır.
• Bağlantılar tek yönlüdür.
• Veri yapısı üzerinde baştan sona doğru hareket edilebilir.
• Veri yapısı üzerinde işlem yapılırken her zaman ilk elemandan başlanır.
• Bağlantılı listeye ekleme yapılırken en son elemandan sonra ekleme yapılır.
Dolayısıyla son elemanı gösteren ek bir değişken kullanmak faydalı olacaktır.
• Bağlantılı listede hiç eleman yoksa veya sadece bir eleman varsa ilk ve son
değişkenler aynı elemanı gösterirler.
• Bu listede arama karmaşıklığı en çok listde olmayan bir elemanın aranması
durumudur. Bu da n elemanlı bir liste için 𝑂(𝑛) karmaşıklığı anlamına gelir.
• Uzunluk listedeki eleman sayısıdır. Örneğin aşağıdaki listenin uzunluğu dörttür.
Tek Yönlü Bağlantılı Liste Uygulaması
• Bağlantılı liste oluşturma: Bağlantılı liste en az iki eleman içerdiği için
C++ da bu veri yapısını bir struct olarak tanımlamak kullanışlı olacaktır.
Örnek veri yapımızda üç eleman bulunsun birincisi integer türünde bilgi
isimli bir değişken, ikincisi char türünde mesaj isimli bir değişken ve
sonuncusu da oluşturacağımız ve adına topluluk ismini vereceğimiz
struct türünde arka isimli bir işaretçi değişken olsun.
• Buna göre bağlantılı liste için struct tanımlaması aşağıdaki gibi olacaktır.

Burada typedef ile BAGLISTE isimli yeni


typedef struct topluluk {
Bir veri türü tanımlanmıştır. Yani artık BAGLISTE
int bilgi;
türünde değişkenler tanımlayabiliriz.
char mesaj[100];
struct topluluk *arka tanımlaması ise bir
struct topluluk *arka;
sonraki düğüm için işaretçi tanımlanmıştır.
}BAGLISTE;
Burada kullanılan struct topluluk on ekleri
İşaretçinin işaret edeceği veri türünü
belirtmektedir. Yani arka isimli işaretçi topluluk
struct yapısına sahip bir veriyi işaret edecektir.
Aynı int *a tanımında a’nın integer türünde bir
veriyi işaret etmesi gibi.
Listeye Eleman Ekleme
Listeye Eleman Ekleme
Tek Yönlü Bağlantılı Liste Uygulaması
• Bağlantılı listeye eleman ekleme: Bağlantılı listeye eleman eklemek için ilk olarak bu veri
yapımızın ilk ve son elemanlarını tanımlamalıyız. Çünkü bu elemanlar bize verimizin en başını ve
en sonunu gösterecektir. Bu elemanları sürekli veri ekleyip çıkardıkça güncellemeliyiz. Yoksa
verimizi hafızada kaybederiz.
BAGLISTE *ilk=NULL; BAGLISTE *son=NULL;
• Şimdi listemize eleman ekleyelim. Bunun için iki ihtimal vardır.
1. Liste boştur ve ekleyeceğimiz eleman listemizde hem ilk hem de son eleman
olacaktır.
2. Listede önceden eleman eklenmiştir. Yeni ekleyeceğimiz eleman listenin sonuna
eklenecektir.
• Buna göre listeye eleman eklemek için kaba kod ve gerçek kod aşağıdaki gibi
olacaktır. Gerçek kod (fonksiyon şeklinde)

Kaba Kod: int ekle(BAGLISTE *ki){


if (Bağlantılı listede halihazırda eleman varsa)
if(ilk!=NULL)
var olan elemanın sonuna ekle;
sonyeni eklenen elemanın adresi
{son->arka=ki;
else son=ki;
Listenin ilk elemanı olarak ekle son->arka=NULL; }
ilk  yeni eklenene elemanın adresi else{
son yeni eklenene elemanın adresi ilk=ki;
son=ilk;
Not: C++ da arrow (ok)  operatörü ilk->arka=NULL;
İşaretçi aracılığı ile struct içerisindeki veriye }
Erişmek için kullanılır. return 0; }
Listedeki Elemanları Listeleme
Listedeki Elemanları Listeleme
Tek Yönlü Bağlantılı Liste Uygulaması
• Bağlantılı listede bulunan elemanların listelenmesi: Bağlantılı listedeki
elemanlar listelenirken ilk elemandan başlanarak son elemana kadar her bir
elemanda bulunan işaretçi aracılığı ile hareket edilir ve her bir elemanda
bulunan bilgilere erişilir. Listenin sonuna gelinmesi ancak bir elemanın
işaretçisinde (arka) NULL değerinin görünmesi ile anlaşılır.
• Eleman listelemek için kaba kod ve gerçek kod aşağıdaki gibi olacaktır.

Gerçek kod (fonksiyon şeklinde)

Kaba Kod: int listele()


pilk {
if(p==NULL)
BAGLISTE *p;
liste boş bilgisi gönder
while(p!= NULL) p=ilk;
{ p ile işaret edilen eleman verisini yaz if (p==NULL) return -1;
p = parka while(p!=NULL){
} yazEkrana(p);
p=p->arka;
}
return 0;
}
Eleman Arama
Tek Yönlü Bağlantılı Liste Uygulaması
• Bağlantılı listede eleman arama: Bağlantılı listedeki belirli bir eleman
aranırken listenin en başından başlanmak zorundadır ve sırası ile tüm
elemanlara bakılmalıdır. Bu açıdan arama listeleme ile aynıdır. Sadece
aramada tüm elemanları yazdırmak yerine aranan eleman bulununca ekrana
yazdırma yapılır.
• Eleman aramak için kaba kod ve gerçek kod aşağıdaki gibi olacaktır.

Gerçek kod (fonksiyon şeklinde)

Kaba Kod: BAGLISTE *ara(int aranan) // fonksiyon geriye BAGLISTE


pilk //türünde bir işaretçi döndürmektedir.
while(p!= NULL) {
{ if (pbilgi ile aranan aynı ise) BAGLISTE *p;
p yi gönder
p=ilk;
p = parka
} while(p!=NULL){
return NULL if(p->bilgi==aranan) return p;
p=p->arka;
}
return NULL;
}
Eleman Silme
Eleman Silme
Eleman Silme
Eleman Silme
Tek Yönlü Bağlantılı Liste Uygulaması
• Bağlantılı listede eleman silme: Bağlantılı listedeki belirli bir elemanı silmek için öncelikle
arama yapılmalı ve eleman bulunursa o eleman listeden çıkarılmalıdır. Elemanı listeden
çıkarırken elemanın bağlı olduğu bir sonraki elemanı kaybetmemek çok önemlidir. Bu işlem
silinecek elemanın arka işaretçisi ile gösterilen elemanın silinecek elemandan bir önceki
eleman tarafından işaret edilmesi ile sağlanır.
• Silinecek eleman ardan çıkarıldıktan sonra hafızadan silinir (delete veya free)
• Eleman silmek için kaba kod ve gerçek kod aşağıdaki gibi olacaktır.
Kaba Kod:
pilk
while(p!= NULL)
{silinmek istenen elemanın ve bir önceki elemanın adresini bul}
if (silinmek istenen listede var ise)
{ if(silinmek istenen ilk eleman ise)
if(listede yalnızca bir eleman var ise)
{ilk=NULL;son=NUL;
else
İlk=ilk arka;}
}
else // silinecek olan ilk eleman değil
{ silinmek istenen elemanın bağlantısını kopart
yeni bağlantıyı düzenle
}
free(silinenin adresi)
}
else
silinmek istenen listede yok yaz ve geri dön
Tek Yönlü Bağlantılı Liste Uygulaması
• Bağlantılı listede eleman silme gerçek kod (fonksiyon şeklinde
BAGLISTE *sil(int silinecek) else{ // silinecek olan
{ // arada bir eleman
BAGLISTE *p, *bironceki; bironceki->arka=p->arka;
p=ilk; if(bironceki->arka==NULL)
bironceki=NULL; son=bironceki; //silinen son
while(p!=NULL){ // arama dugum
if(silinecek==p->bilgi) }
break; free(p);
bironceki=p; return p;
p=p->arka; }
} else
if (p!=NULL){ return NULL;
if(bironceki==NULL){/ //silinecek olan }
//birinci dugum
if (ilk==son){ // listede // tek düğüm varsa
ilk==NULL;
son==NULL;}
else ilk=ilk->arka;
}
Tek Yönlü Bağlantılı Liste Uygulaması
TAM ÖRNEK

#include <iostream>
#include<stdlib.h>
using namespace std;
// listedeki veri yapısının tanımlanması
typedef struct topluluk {
int bilgi;
char mesaj[100];
struct topluluk *arka;
}BAGLISTE;

// Listenin ilk ve son elemanlarının adreslerini tutan işaretçiler


BAGLISTE *ilk=NULL, *son=NULL;

BAGLISTE *ara(int), *sil(int), *okuKlavye();


void yazEkrana(BAGLISTE *yazilicak);int ekle(BAGLISTE *ki);int listele();

// Devamı sonraki sayfada


Tek Yönlü Bağlantılı Liste Uygulaması
int main() TAM ÖRNEK
{

BAGLISTE *eklenecek, *ki;


int bilgi, sonuc;
char secim;
while(1){
// Ekrana Menü çıkarılıyor
cout<<endl<<"Ekleme"<<endl<<"Listeleme"<<endl<<"Arama"<<endl;
cout<<"Silme"<<endl<<"Cikis"<<endl<<"Seciminiz ?"<<endl;
cin>>secim;
switch(secim)
{
case 'E':
{
eklenecek=okuKlavye(); //ekleme secildi
if (eklenecek!=NULL) ekle(eklenecek);
else cout<<endl<<"Ekleme icin bellek dolu ! "<<endl;
break;
}
// Devamı sonraki sayfada
Tek Yönlü Bağlantılı Liste Uygulaması
TAM ÖRNEK
case 'L':// listeleme seçildi
{
sonuc=listele();
if (sonuc==1) cout<<endl<<"Bos Liste ! "<<endl; break;
}
case 'A': // Arama secildi
{
cout<<endl<<"Aranan: ";scanf("%d",&bilgi);
ki=ara(bilgi);
if (ki==NULL) cout<<endl<<"Aranan Bulunamadi ! "<<endl;
else yazEkrana(ki); break;
}
case 'S': // Silme secildi
{
cout<<endl<<"Silinecek: ";scanf("%d",&bilgi);
ki=sil(bilgi);
if (ki==NULL) cout<<endl<<"Silindi ! "<<endl;
else cout<<"Silinmek istenen veri listede yok ! "<<endl;break;
}
// Devamı sonraki sayfada
Tek Yönlü Bağlantılı Liste Uygulaması
TAM ÖRNEK

case 'C':// Çıkış seçildi


{
cout<<"HOSCAKAL :) "<<endl;
exit(0);

}
default:cout<<"Yanlıs Secim !! "<<endl;
}
}

system("pause");
return 0;
}
// Devamı sonraki sayfada
Tek Yönlü Bağlantılı Liste Uygulaması
TAM ÖRNEK

// fonksiyonlar
void yazEkrana(BAGLISTE *yazilacak){
printf("bilgi: %d, mesaj:%s\n",yazilacak->bilgi, yazilacak->mesaj);
}
int ekle(BAGLISTE *ki){
if(ilk!=NULL)
{son->arka=ki;
son=ki;
son->arka=NULL; }
else{
ilk=ki;
son=ilk;
ilk->arka=NULL;
}
return 0;
}
// Devamı sonraki sayfada
Tek Yönlü Bağlantılı Liste Uygulaması
TAM ÖRNEK
int listele(){
BAGLISTE *p;
p=ilk;
if (p==NULL) return -1;
while(p!=NULL){
yazEkrana(p);
p=p->arka;
}
return 0;
}
BAGLISTE *ara(int aranan)
{
BAGLISTE *p; p=ilk;
while(p!=NULL){
if(p->bilgi==aranan) return p;
p=p->arka;
}
return NULL;
}
// Devamı sonraki sayfada
Tek Yönlü Bağlantılı Liste Uygulaması
TAM ÖRNEK
BAGLISTE *sil(int silinecek)
{
BAGLISTE *p, *bironceki;p=ilk;
bironceki=NULL;
while(p!=NULL){
if(silinecek==p->bilgi) break;
bironceki=p;p=p->arka;}

if (p!=NULL){
if(bironceki==NULL){
if (ilk==son){
ilk==NULL;son==NULL;
}
else ilk=ilk->arka;
}
else{ bironceki->arka=p->arka;
if(bironceki->arka==NULL) son=bironceki;}
free(p);return p;}
else return NULL;
} // Devamı sonraki sayfada
Tek Yönlü Bağlantılı Liste Uygulaması
TAM ÖRNEK

BAGLISTE *okuKlavye(){
BAGLISTE *okunan;
okunan=new BAGLISTE;
if (okunan==NULL)
return NULL;
cout<<"Bilgi Giriniz"<<endl;
scanf("%d",&(okunan->bilgi));
cout<<"Mesaj Giriniz"<<endl;
scanf("%s",&(okunan->mesaj));
return okunan;

}} // Devamı sonraki sayfada

You might also like