Professional Documents
Culture Documents
2.hafta - Listeler - Yigit
2.hafta - Listeler - Yigit
2.hafta - Listeler - Yigit
LİSTELER
Günlük hayatta listeler; alışveriş listeleri,
davetiye, telefon listeleri vs. kullanılır.
BAĞLI LİSTELER
Bellekte elemanları ardışık olarak bulunmayan listelere
bağlı liste denir.
BAĞLI LİSTELER
Bağlantılı liste yapıları iki boyutlu dizi yapısına
benzemektedir. Aynı zamanda bir boyutlu dizinin
özelliklerini de taşımaktadır.
BAĞLI LİSTELER
Doğrusal veri yapılarında dinamik bir yaklaşım yoktur.
İstenildiğinde bellek alanı alınamaz ya da eldeki
bellek alanları iade edilemez. Bağlantılı listeler dinamik
veri yapılar olup yukarıdaki işlemlerin yapılmasına
olanak verir. Bağlantılı listelerde düğüm ismi verilen bellek
büyüklükleri kullanılır.
BAĞLI LİSTELER
Örnek: C dilinde bağlı liste yapısı
struct ListNode
{ int data;
struct ListNode *next;
}
Bağlı listenin ilk elemanının adresi global bir göstericide tutulabilir.
Son elemanına ilişkin gösterici ise NULL adresi olarak bırakılır. Bağlı
liste elemanları malloc gibi dinamik bellek fonksiyonları ile
oluşturulur.
BAĞLI LİSTELER
Bağlı Listelerle Dizilerin Karşılaştırılması:
Diziler;
Boyut değiştirme zordur
Yeni bir eleman ekleme zordur
Bir elemanı silme zordur
Dizinin tüm elemanları için hafızada yer ayrılır
Bağlı listeler ile bu problemler çözülebilir.
Mahmut 0
Mehmet 1
Melek 2
Metin Murat 3
Mustafa 4
5
10
BAĞLI LİSTELER
Ayrıca,
Her dizi elamanı için ayrı hafıza alanı ayrılır.
Bilgi kavramsal olarak sıralıdır ancak hafızada
bulunduğu yer sıralı değildir.
Her bir eleman (node) bir sonrakini gösterir.
11
BAĞLI LİSTELER
Listeler;
Listedeki her bir eleman data (veri) ve link (bağlantı)
kısmından oluşur. Data kısmı içerisinde saklanan bilgiyi
ifade eder. Link kısmı ise kendisinden sonraki elamanı
işaret eder.
BAĞLI LİSTELER
tail
head
15
Algorithm find(element)
nextNode header
while nextNode != null and nextNode.element != element
do
// sonraki elemana (düğüm) git
nextNode nextNode‐‐>nextElement
end while
// yukarıdaki döngü eleman bulunduğunda veya liste tamamen
//tarandığı halde eleman bulunamadığında sonlanır
If nextNode != null If nextNode != null
return nextNodeelement
else
// bir sonraki bileşen (düğüm) bulunulamıyor ise ELSE bloğuna girilir.
return null
23
tail
head
24
Örnekler- C++
Örnek 1: Tek yönlü bağlı liste
#include <stdio.h>
#include <stdlib.h>
main() {
struct notlar {
int vize1;
struct notlar *bag;
} *yeniadres, *ilk, *son;
yeniadres=(struct notlar*) malloc(sizeof(struct notlar));
printf("Yeniadres:%d\n",yeniadres);
ilk=yeniadres;
son=yeniadres;
yeniadres->vize1=79;
yeniadres->bag=NULL;
26
C++
printf("ilk:%d\n",ilk); //İlk elemanın adresini tutar
printf("son:%d\n",son); //Son elemanın adresini tutar
printf("T1___yeniadres->vize1:%d yeniadres->bag:%d\n",yeniadres->vize1,
yeniadres->bag);
//Hafızadan tekrar yer iste
yeniadres=(struct notlar*) malloc(sizeof(struct notlar));
printf("Yeniadres:%d\n",yeniadres);
son->bag=yeniadres;
yeniadres->vize1=95;
yeniadres->bag=NULL;
son=yeniadres;
printf("ilk:%d\n",ilk);
printf("son:%d\n",son);
printf("T2___yeniadres->vize1:%d yeniadres->bag:%d\n", yeniadres->vize1,
yeniadres->bag);}
27
BAĞLI LİSTELER
İlk işlemde hafızadan yeni bir adres isteme
yeniadres
yeniadres
son
28
BAĞLI LİSTELER
İkinci işlemde hafızadan yeni bir adres isteme
yeniadres
BAĞLI LİSTELER
yeniadres yeniadres
7332
7344 0
30
C++
31
Örnekler - C++
Örnek: 2- Çift yönlü bağlı liste ile filim adlarının saklanması
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TSIZE 45
struct filim {
char baslik[TSIZE];
int rating;
struct filim * sonraki; } ;
int main(void) {
struct filim * ilk = NULL;
struct filim * onceki, * simdiki;
char input[TSIZE];
puts("Filimin basligini girin (sonlandirmak icin enter (boşluk) girin):");
32
C++
while (gets(input) != NULL && input[0] != '\0') {
simdiki = (struct filim *) malloc(sizeof(struct filim));
if (ilk == NULL) ilk = simdiki;
else onceki->sonraki = simdiki;
simdiki->sonraki = NULL;
strcpy(simdiki->baslik, input);
puts("Ratingi girin <0-10>:");
scanf("%d", &simdiki->rating);
while(getchar() != '\n') continue;
puts("Filimin basligini girin (sonlandirmak icin bosluk girin):");
onceki = simdiki;
}
33
C++
if (ilk == NULL)
printf("Veri girilmemistir. ");
else
printf ("Filim Listesi:\n");
simdiki = ilk;
while (simdiki != NULL)
{
printf("Filim: %s Rating: %d\n", simdiki->baslik, simdiki->rating);
simdiki = simdiki->sonraki;
}
simdiki = ilk;
}
34
simdiki
simdiki simdiki
class Dugum
{
public int veri; // Değişik tiplerde çoğaltılabilir
public Dugum sonraki; // Sonraki düğümün adresi
public Dugum (int gelenVeri) // Yapıcı metot
{ veri = gelenVeri; } // Düğüm yaratılırken değerini aktarır
public void yazdir() // Düğümün verisini yazdırır
{ System.out.print(" "+veri); }
}
38
class BListeTest {
public static void main(String args[]) {
BListe liste = new BListe(); // liste adlı bir bağlı liste nesnesi oluşturur.
liste.basaEkle(9);
for(int i=8; i>=1; --i) liste.basaEkle(i);
liste.listele(); int deger = 5; Dugum d = liste.bul(deger);
if(d==null) System.out.println("\n"+deger+" Listede Yok");
else System.out.println("\n"+deger+" Bulundu");
Dugum s = liste.sil(5);
liste.listele(); Ekran Çıktısı :
} // Bastan Sona Liste : 1 2 3 4 5 6 7 8 9
} // 5 Bulundu
// Bastan Sona Liste : 1 2 3 4 6 7 8 9
43
Ödev
2-
K adet ders için N adet öğrencinin numara ve harf ortalamalarını bağlı
dizilerle gösteriniz.
Her bir node öğrenci numarası, dersin kodu, dersin harf ortalaması
bilgilerini bulunduracak.
Her öğrencinin numarası headNode içindeki bilgi olacak.
Her dersin kodu headNode içindeki bilgi olacak.
Her bir node aynı dersteki bir sonraki öğrenciyi gösterecek.
Her bir node aynı kişinin diğer dersini gösterecek.
Program Java veya C# Windows application olarak hazırlanacak ve aşağıdaki
işlemleri butonlarla yapacak.
1- Bir öğrenciye yeni bir ders ekleme
2- Bir derse yeni bir öğrenci ekleme
3- Bir öğrencinin bir dersini silme
4- Bir dersteki bir öğrenciyi silme
5- Bir dersteki tüm öğrencileri numara sırasına göre sıralı listeleme
6- Bir öğrencinin aldığı tüm dersleri ders koduna göre sıralı listeleme
45
Ödev
46
47
Yığıt/Yığın (Stack)
Son giren ilk çıkar (Last In First Out-LIFO) veya İlk giren son çıkar
(First-in-Last-out FILO) mantığıyla çalışır.
Yığıt/Yığın (Stack)
Yığın yapısını gerçekleştirmek için 2 yol vardır.
Dizi kullanmak
Bağlantılı liste kullanmak
Yığın İşlemleri
Ana yığın işlemleri:
push(nesne): yeni bir nesne ekler
Girdi: Nesne Çıktı: Yok
pop(): en son eklenen nesneyi çıkarıp geri döndürür.
Girdi: Yok Çıktı: Nesne
12 2 5
2 3 11
3 2
3
Yığıt/Yığın (Stack)
Örnek kullanım yerleri
Yazılım uygulamalarındaki Undo işlemleri stack ile
yapılır. Undo işlemi için LIFO yapısı kullanılır.
Web browser’lardaki Back butonu (önceki sayfaya)
stack kullanır. Buradada LIFO yapısı kullanılır.
Matematiksel işlemlerdeki operatörler (+,*,/,- gibi)
ve operandlar için stack kullanılabilir.
Yazım kontrolündeki parantezlerin kontrolünde stack
kullanılabilir.
52
Yığıt/Yığın (Stack)
Örnek : Yığına ekleme ve çıkarma
İşlem Yığıt (tepe) Çıktı
push(“M”); M
push(“A”); MA
push(“L”); MAL
push(“T”); MALT
pop(); MAL T
push(“E”); MALE T
pop(); MAL TE
push(“P”); MALP TE
pop(); MAL TEP
push(“E”); MALE TEP
pop(); MAL TEPE
53
12 2 11
2 3 2
3 3
pop(); push(11);
54
Başarım ve Sınırlamalar
Başarım
n yığındaki nesne sayısı olsun
Kullanılan alan O(n)
Her bir işlem O(1) zamanda gerçekleşir.
Sınırlamalar
Yığının en üst sayısı önceden tanımlanmalıdır ve
değiştirilemez.
Dolu bir yığına yeni bir nesne eklemeye çalışmak
istisnai durumlara sebep olabilir.
57
Yığın ve Operasyonları
public class Yigin {
if (dolumu()){
// Yığın dolu. Yeni eleman eklenemez.
return -1;
}
S[p] = yeni;
p++;
return 0;
} /bitti-koy
61
return S[p-1];
}
62
Stack Operations: al
// En üsteki elemanı dönder.
// Yığın boşsa -1 dönder.
public int al(){
if (bosmu()){
// Yığın boşsa hata dönder
System.out.println(“Stack underflow”);
return -1;
}
return S[id];
}
63
y.koy(44); y.koy(22);
koy(3)
Baş
3 9 2 6 15 3 eklendikten sonra
al()
Baş
9 2 6 15 3 alındıktan sonra
al()
Baş
2 6 15 9 alındıktan sonra
65
YiginDugumu(int e){
eleman = e; sonraki = NULL;
}
}
return ust.eleman;
} //bitti-ust
68
return temp.eleman;
} //bitti-al
69
if (y.bosmu())
System.out.println(“Yığın boş”);
y.koy(49); y.koy(23);
Örnekler –Java
Java'da hazır Stack (yığıt) sınıfı da bulunmaktadır. Aşağıdaki
örnekte String'ler, oluşturulan s yığıtına yerleştirilerek ters
sırada listelenmektedir.
import java.util.*;
public class StackTest
{
public static void main(String args[])
{ String str[] = { "Bilgisayar", "Dolap", "Masa", "Sandalye", "Sıra" };
Stack s = new Stack();
for(int i=0; i < t.length; ++) s.push(str[i]);
while(!s.empty() ) System.out.println(s.pop());
}
}
71
Uygulama Ödevi
Derleyici/kelime işlemciler
Derleyicileri düşünecek olursak yazdığımız ifadede ki
parantezlerin aynı olup olmadığını kontrol ederler.
Örneğin: 2*(i + 5*(7 – j / (4 * k)) ifadesinde parantez
eksikliği var. ")"
Yığın kullanarak ifadedeki parantezlerin eşit sayıda
olup olmadığını kontrol eden programı yazınız.
72
Uygulama Ödevi
ÖRNEKLER
74
if (rBBas.Checked)
bagliListe.headNode.sonraki = bagliListe.headNode.sonraki.sonraki;
Eleman ekleme
ListNode yeniNode = new ListNode(“Mustafa");
yeniNode.sonraki = aktif.sonraki;
aktif.sonraki.onceki = yeniNode;
aktif.sonraki = yeniNode;
yeniNode.onceki = aktif;
85
Eleman silme
while ((aktif.sonraki != bagliListe.tailNode) && (aktif.sonraki != silinecekNode))
{
aktif = aktif.sonraki;
}
aktif.sonraki.sonraki.onceki = aktif;
aktif.sonraki = aktif.sonraki.sonraki;
86
Eleman arama
while ((aktif.sonraki != bagliListe.tailNode) && (aktif.sonraki != arananNode))
{ aktif = aktif.sonraki;}
while ((aktif.onceki != bagliListe.headNode) && (aktif.onceki != arananNode))
{ aktif = aktif.onceki; }
87
Örnekler -Java
Örnek : Java’da dizi kullanarak karakter yığıtı sınıfı oluşturma ve
kullanma.
import java.io.*;
class StackChar
{
private int maxSize; private char[] stackArray; private int top;
public StackChar(int max)
{ maxSize = max; stackArray = new char[maxSize]; top= -1; }
Örnekler –Java
class Reverse
{
public static void main(String args[])
{
StackChar y = new StackChar(100);
String str = "Merhaba";
for(int i=0; i<str.length(); ++i)
y.push(str.charAt(i));
while(! y.isEmpty() ) System.out.println(y.pop());
}
}
95
Örnekler –C#
Örnek: Bağlı liste ile yığıt oluşturma
class stackNodeC
{
public string kitapAdi; public stackNodeC sonraki;
public stackNodeC(string kitapAdi) { this.kitapAdi = kitapAdi; }
}
class stackC
{
public stackNodeC headNode;
public stackC(string kitapAdi)
{
this.headNode = new stackNodeC(kitapAdi);
this.headNode.sonraki = headNode;
}
}
stackC kitapYigin = new stackC("");
96
Örnekler –C#
/* Stack işlemleri :
boş yığın stackSize() == 0 eleman sayısı= stackSize()
eleman ekleme= push(kitapAdi) eleman alma= pop() */
Örnekler –C#
// Stack işlemleri (eleman ekleme)
public void push(string kitapAdi)
{
if (stackSize() >= MaxSize)
MessageBox.Show ("Yığın maksimum elemana sahip ! Yeni
eleman eklenemez !", "Dikkat");
else
{ stackNodeC yeniNode = new stackNodeC(tBKitapAdi.Text);
yeniNode.sonraki = kitapYigin.headNode;
kitapYigin.headNode = yeniNode;
lStackSize.Text = "Stack Size =
"+Convert.ToString(stackSize());
}
}
98
Örnekler –C#
Örnekler –C++
Örnekler –C++
if (tepe != NULL) {
yedek = tepe;
strcpy(giden, tepe->kelime);
tepe = tepe->onceki; free(yedek); return 0; }
else
return 1; /* yığın boş */
101
Örnekler –C++
main() {
char *yenikelime, *cumle;
tepe = NULL;
printf("Cümleyi girin : "); gets(cumle);
yenikelime = strtok(cumle, " "); // cumle değişkenini boşluğa göre
ayırma.
while (yenikelime) {
push (yenikelime);
yenikelime = strtok(NULL, " ");
}
yenikelime = (char *) malloc(20); /* yenikelime NULL idi, yer açalım*/
while (!pop(yenikelime)) printf("%s ", yenikelime);
printf("\n");
getch();
}
102
Örnekler –C++