SOMEBODY ELSE'S. ( DATA STRUCTURES and ALGORITHMS ) Veri Yapıları ve Algoritmaları

Benzer belgeler
YZM 2116 Veri Yapıları

Algoritma Geliştirme ve Veri Yapıları 9 Ağaç Veri Modeli ve Uygulaması. Mustafa Kemal Üniversitesi

YIĞINLAR YIĞINLAR. Yığın İşlemleri Postfix, Prefix, Infix. G. Ü. Bilgisayar Mühendisliği Bölümü

Final Sınavı Soruları Bahar 2018

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İ

ELN1002 BİLGİSAYAR PROGRAMLAMA 2

Ağaçlar (Trees) Ağaçlar (Trees)

Özyineleme (Recursion)

DOSYA ORGANİZASYONU. Ağaç Yapıları ÖZLEM AYDIN TRAKYA ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

YZM 2116 Veri Yapıları

VERİ YAPILARI DERS NOTLARI BÖLÜM 1 GİRİŞ. Yard. Doç. Dr. Deniz KILINÇ

Week 6: Bağlı Liste (Linked List) BAĞLI LİSTE KAVRAMI TEKİL (SINGLE) BAĞLI LİSTE ÇİFT (DOUBLE) BAĞLI LİSTE DAİRESEL (CIRCULAR) BAĞLI LİSTE

ALGORİTMA VE PROGRAMLAMA II

BIL222 Veri Yapıları ve Algoritmalar

YZM 2116 Veri Yapıları

Veri Modelleri. Ağaç Veri Modeli. Ağaç Veri Modeli

YZM 2116 Veri Yapıları

Sınav tarihi : Süre : 60 dak. a) strstr b) strchr c) strcat d) strcpy e) strlen. a) b) d) e) 0

Stack Islemleri. Postfix ve Infix notasyonlari. Stack ozellikleri

Veri Yapıları. Amaçlar: Temel Veri Yapılarını Tanımlamalı Veri Yapılarını Veri Modeli ve Türlerini Öğreneceksiniz. İçindekiler:

Veri Yapıları Laboratuvarı

YZM 2116 Veri Yapıları

ALGORİTMA VE PROGRAMLAMA I

İNÖNÜ ÜNİVERSİTESİ MÜHENDİSLİK FAKÜLTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ 2. SINIF 1. DÖNEM VERİ YAPILARI DERSİ LABORATUAR ÖDEVİ

Week 9: Trees 1. TREE KAVRAMI 3. İKİLİ AĞAÇ DİZİLİMİ 4. İKİLİ ARAMA AĞACI 2. İKİLİ AĞAÇ VE SUNUMU > =

Yrd. Doç. Dr. Caner ÖZCAN

İNÖNÜ ÜNİVERSİTESİ MÜHENDİSLİK FAKÜLTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ 2. SINIF 1. DÖNEM VERİ YAPILARI DERSİ LABORATUAR ÖDEVİ

Yigin & Kuyruk {\} /\ Suhap SAHIN Onur GÖK

AVL Agacı {\} /\ Suhap SAHIN Onur GÖK

AĞAÇ-TREE VERİ YAPISI

Pointer Kavramı. Veri Yapıları

Max - Min Heap Tree (Max ve Min Yığıt Ağaçları) Veri Yapıları ve Algoritmalar 2 - Mustafa EGE Ders Notları

ALGORİTMA VE PROGRAMLAMA I

Yrd. Doç. Dr. Caner ÖZCAN

/ C Bilgisayar Programlama Final Sınavı Test Soruları. Adı soyadı :... Öğrenci no :... İmza :... Tarih, Süre : , 60 dak.

Final Sınavı Soruları Güz, Süre: 90 Dakika

YAPILAR BİRLİKLER SAYMA SABİTLERİ/KÜMELERİ. 3. Hafta

BİL1001 Bilgisayar Bilimlerine Giriş 1

Göstericiler (Pointers)

Diziler (Arrays) Çok Boyutlu Diziler

YZM ALGORİTMA ANALİZİ VE TASARIM DERS#6: AZALT VE FETHET YÖNTEMİ

KOCAELİ ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ. BİLGİSAYAR LABORATUVARI II FİNAL SINAVI SORU ve CEVAPLARI(I. ogr)

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İ

Çoktan Seçmeli Değerlendirme Soruları Akış Şemaları İle Algoritma Geliştirme Örnekleri Giriş 39 1.Gündelik Hayattan Algoritma Örnekleri 39 2.Say

Week 7. Düğüm bulma Tekli bağlı liste: phead ve ptail Dairesel bağlı liste Çift bağlı liste

Giris {\} /\ Suhap SAHIN Onur GÖK

Arasınav Örnek Soruları Bahar 2018

YZM 2116 Veri Yapıları

DOSYA ORGANİZASYONU. Çarpışma çözümleme yöntemleri ÖZLEM AYDIN TRAKYA ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

/ C Bilgisayar Programlama Yıliçi Sınavı Test Soruları. Adı soyadı :... Öğrenci no :... İmza :... Tarih, Süre : , 60 dak.

Sınav tarihi : Süre : 60 dak. a) ABCDE b) BCDE c) ABCD d) kod hatalı e) BCD

BLM 111 ALGORİTMA VE PROGRAMLAMA I

Algoritmalar. İkili Arama Ağaçları. Bahar 2016 Doç. Dr. Suat Özdemir 1

STACK (ÇIKIN-YIĞIN-YIĞIT) VERİ YAPISI LAST-IN-FIRST-OUT LIFO VERİ YAPISI

Adı soyadı :... Öğrenci no :... İmza :... Tarih, Süre : dak.

Algoritma Geliştirme ve Veri Yapıları 8 Kuyruk ve Yığın Yapısı. Mustafa Kemal Üniversitesi

BMÜ-111 Algoritma ve Programlama. Bölüm 5. Tek Boyutlu Diziler

Temel Bilgisayar Programlama Final Sınavı Çalışma Notları

int main(void) { int num = 0; int input = 1; int retval = 0; struct NODE *nodepointer; nodepointer = (struct NODE *)malloc(sizeof(struct NODE));

Sınav tarihi : Süre : 60 dak.

Pointers (İşaretçiler)

BAĞLAÇLI LİSTELER LINKED LISTS

Yrd. Doç. Dr. Caner ÖZCAN

C Programlama Dilinde Değişkenler

VERİ YAPILARI LİSTELER. Yrd. Doç. Dr. Murat GÖK Bilgisayar Mühendisliği Bölümü YALOVA ÜNİVERSİTESİ

Veri Yapıları. Ağaçlar

Veri Yapıları. Yrd. Doç. Dr. Şadi Evren ŞEKER

else *on=*on+1; return gecici; } int giseyeyerlestir(struct gise*giseler) {//giseye bos olmasi durumunda yerlestirme yapiliyor...

BİLG Dr. Mustafa T. Babagil 1

Eln 1002 Bilgisayar Programlama II

Diziler. Yrd.Doç.Dr.Bülent ÇOBANOĞLU

HACETTEPE ÜNİVERSİTESİ BAHAR DÖNEMİ

Yrd. Doç. Dr. A. Burak İNNER Bilgisayar Mühendisliği

BLM 112- Programlama Dilleri II. Hafta 2 C Programlarının Bellek Düzeni ve Rekürsif (Özyinelemeli) Fonksiyonlar

BLM 111 ALGORİTMA VE PROGRAMLAMA I

Bil101 Bilgisayar Yazılımı I. M. Erdem ÇORAPÇIOĞLU Bilgisayar Yüksek Mühendisi

Veri Yapıları ve Algoritmalar dönem

PROGRAMLAMAYA GİRİŞ DERS 2

DİZİLER-KATARLAR ALGORİTMA VE PROGRAMLAMA II

1 PROGRAMLAMAYA GİRİŞ

BAĞLAÇLI LİSTELER LINKED LISTS

Ağaç (Tree) Veri Modeli

YZM 2116 Veri Yapıları

BLM 112- Programlama Dilleri II. Hafta 4 İşaretçiler (Pointers)

YZM VERİ YAPILARI DERS#9: HASH FONKSİYONLARI

Yrd. Doç. Dr. Caner ÖZCAN

Ağaç Yapıları (Tree Structures) Kütük Organizasyonu 1

Pythonda değişkenlerin türlerini tanımlamaya gerek yoktur

VERİ YAPILARI DERS NOTLARI BÖLÜM 5 QUEUE (KUYRUK) Yard. Doç. Dr. Deniz KILINÇ

PROSESLER. Proses. Proses

BLM 112- Programlama Dilleri II. Hafta 5 İşaretçiler (Pointers)

Binary Tree nedir?uygulamas nasl yaplr?

Temel Bilgisayar Bilimleri Ders Notu #4-2. kısım

AĞAÇLAR. Doç. Dr. Aybars UĞUR

ESM-361 Mikroişlemciler. 3. Hafta Ders Öğretim Üyesi Dr.Öğr.Üyesi Ayşe DEMİRHAN

ALGORİTMA VE PROGRAMLAMA II

Yrd. Doç. Dr. Caner ÖZCAN

Ders 4: Diziler (Arrays( Arrays) barisgokce.com

8. Bölüm DİZİLER. tip dizi_ismi[eleman_sayısı]; Bütün diziler 0 ile baţlar.

Fonksiyonlar. C++ ve NESNEYE DAYALI PROGRAMLAMA 51. /* Fonksiyon: kup Bir tamsayının küpünü hesaplar */ long int kup(int x) {

Transkript:

SOMEBODY ELSE'S ( DATA STRUCTURES and ALGORITHMS ) Veri Yapıları ve Algoritmaları Yazan: Burak Kıymaz Derleyen: Serhan Aksoy @2016

Burak Kıymaz 28.10.2015 Veri Yapıları Abstrak veri yapıları: (Abstract Data Types and Data Structures) ADT, içerisindeki verilerin ve bu verilerle yapılacak işlemlerin soyut bir şekilde tanımlanmış halidir. Data Structures : ADT nin gerçeklenmiş halidir. Data Structures şekilde yapılabilir. Struct ile yapılabilir. Paralel diziler ile yapılabilir Dinamik pointer lar ile yapılabilir. ÖRNEK (Genel Liste): Genel Liste ADT: sabit bir integer dizi olsun ekleme silme yazdırma arama fonksiyonları olsun. Genel Yapı #include <stdio.h> #include <stdlib.h> #define listeboyutu 10 struct genelliste{ int Data[listeBoyutu]; int size;// dolu eleman sayısı ; void baslat(); int dolumu(); int bosmu(); void ekle(); void sil(); void Bul(int, int*); void goster(); struct genelliste list; int main(int argc, char** argv) { baslat(); ekle(15); http://www.burakkiymaz.com

Burak Kıymaz 28.10.2015 ekle(25); ekle(35); sil(35); goster(); return (EXIT_SUCCESS); void baslat(){ list.size = 0; int dolumu() { if(list.size == listeboyutu){ return 1; else{ return -1; int bosmu(){ if (list.size == 0) return 1; else return -1; void ekle(int deger){ if (dolumu() == 1){ printf("uzgunuz liste dolu ekleyemiyoruz.. "); else{ list.data[list.size] = deger; list.size++; printf("%d listeye eklendi.",deger); void goster(){ if (bosmu() == 1){ printf("liste Bos"); else{ int i; printf("listedeki elemanlar: "); for (i=0;i<list.size;i++){ printf("%d, ",list.data[i]); void Bul(int eleman, int* pos){ *pos = -1; if (bosmu()==-1){ http://www.burakkiymaz.com

Burak Kıymaz 28.10.2015 int i=0; for (i=0;i<list.size;i++) if (eleman==list.data[i]){ *pos = i; break; void sil(int deger){ int k=-1; Bul(deger,&k); if (k==-1){ printf("eleman yok."); else{ int i=0; for (i=k;i<list.size;i++){ list.data[i] = list.data[i+1]; list.size--; Genel liste dezavantajlıdır çünkü bir eleman çıkarıldığı zaman tüm diziyi yerinden oynatmak gerekir. Bu yüzden ram kullanımı çok kötüdür. Bunu düzeltmek için LinkedList kullanılır. Linked List (Bağlı Liste) her düğüm (eleman) hem veriyi hem de bir sonrakinin adresini tutacaktır. Data Next indis Single LinkedList Double LinkedList Pre Data Next Multiple LinkedList Pre Data... Data Next http://www.burakkiymaz.com

Burak Kıymaz 28.10.2015 LinkedList 3 yöntemle yapılabilir. Çoklu dizilerle yapılır. Struct dizisi dinamik pointerlar ÖRNEK: int [10][2]; Bellek Indis Data Next 0 1 10 5 2 İlk 3 20 1 4 30-1 5 3 4 6 7 8 9 20 1 10 5 4 3 4 30-1 Silindi 20 1 10 4 30-1 http://www.burakkiymaz.com

Burak Kıymaz 04.11.2015 Veri Yapıları 0 1 2 3 4 5 6 7 8 10 30 40 50 15 23 45 60 80 1 2 3 4 5 6 7 8-1 3 5 Boş listesi 1 2 3 4 5 6 7 8 2 4 8-1 Head = 0 Boş = -1 // en baştaki değer, tüm liste dolu demek. void Baslat(){ int list[10][1]; int i; for (i=0;i<9;i++){ list[i][1] = i+1; list[9][1]=-1; int head = -1; int bas = 0; // dizi oluşturuldu şu anda dizi boş olduğu için head -1 boş =0 boş un 0 olmasının sebebi hepsi boş olduğu için birbirine bağlı. eleman = bos; list[bos][0] = 15; bos = list[bos][1]; list[eleman][1] = -1; head = eleman; http://www.burakkiymaz.com

Burak Kıymaz 04.11.2015 diziye eklenen ilk elemanın gösterdiği eleman 0 yazılır yani hiçbir yeri göstermez. Diziye sonradan eklenen elemanlar head olarak eklenir. eleman = bos; list[eleman][0] = 25; bos = list[bos][1]; list[eleman][1]; head = eleman; void yazdir(){ if (head!= -1){ int temp = head; while (temp!= -1) { // temp -1 olana kadar yazdırma işlemini yapar temp=-1 ise liste bitmiş demektir. printf("%d\n",list[temp][0]); // temp in göstersiği indisin elemanı yazdıırldı temp = list[temp][1]; // temp yazdırılan temp in gösterdiği adresi gösteriyor artık. Listeden bir elemanı sildiğimizde bu elemanı boşların bulunduğu listeye head olarak ekleriz. http://www.burakkiymaz.com

Burak Kıymaz 04.11.2015 Struct dizisi ile linked list struct dugum{ int data; int next; ; struct dugum liste[10]; int main(int argc, char** argv) { return (EXIT_SUCCESS); DATA DATA NEXT NEXT void Baslat(){ int i; for(i=0;i<9;i++){ liste[i].next = i+1; liste[i].next = -1; int head = -1; int bos = 0; // struct dizisinin başlatma komutu. http://www.burakkiymaz.com

Burak Kıymaz 04.11.2015 ÖRNEK UYGULAMA #include <stdio.h> #include <stdlib.h> void Baslat(); int dolumu(); int bosmu(); void yazdir(); void ekle(int); void sil(int); void dugumver(int*); void Bul(int,int*); struct dugum{ int data; // burada veri tutulacak int next; // burada bir sonraki düğümün indisi tutulacak ;// veri yapısı tanımlardık struct dugum liste[10]; int head = -1; int bos = 0; int main(int argc, char** argv) { Baslat(); int temp; dugumver(&temp); liste[temp].data = 15; head = temp; liste[temp].next = -1; http://www.burakkiymaz.com

Burak Kıymaz 04.11.2015 dugumver(&temp); liste[temp].data = 25; liste[temp].next = head; head = temp; // burada manuel olarak 2 tane eleman eklendi. yazdir(); return (EXIT_SUCCESS); void Baslat(){ int i; for(i=0;i<9;i++){ liste[i].next = i+1; liste[10].next = -1; int dolumu(){ if (bos == -1) return 1; else return -1; int bosmu(){ if (head == -1) return 1; else return -1; http://www.burakkiymaz.com

Burak Kıymaz 04.11.2015 void yazdir(){ if (bosmu() ==1){ printf("liste Bos"); else{ int temp = head; while (temp!=-1){ printf("%d\n", liste[temp].data); temp = liste[temp].next; void dugumver(int*k){ if (dolumu() ==1) printf("bos yer yok"); else{ *k = bos; bos = liste[bos].next; Ödev: İki boyutlu statik matris kullanarak bir linked list tasarlayın. Bu listeye eleman ekleme, çıkarma, listeyi yazdırma, listeyi başlatma, liste dolu mu, liste boş mu fonksiyonlarını yazın ve çalıştırın. http://www.burakkiymaz.com

Burak Kıymaz 11.11.2015 dinamik pointerla bağlı liste yapımı: Veri Yapıları DOUBLE LİNKED LİST typedef int tamsayi ; komutu int ifadesini tamsayi ifadesi ile değiştirir. Yani int x; ile tamsayi x; arasında hiçbir fark bulunmaz. typedef int* pointer Aynı şekilde int* x; ile pointer x; arasında hiçbir fark yoktur. typedef Node* ptrtype;// Bundan sonra Node* yerine ptrpointer kullanılacak. struct Node{ int data; struct Node* next; struct Node* back; ; struct Node A; struct Node B; Data Node A Next Node B Data Next Back Back A.next = &B; // Node B yi işaret eder. Next komutu pointer olduğu için & ile B nin adresini saklayabiliriz. A.back = &A; // back komutu da aynı şekilde pointer olduğundan dolayı adres saklayabilir. A.next = B.back; B.back->data = 15; // Burada B içerisindeki back pointerının işaret ettiği yere gidilir. Oradaki Data 15 olarak atanır. Yani buradaki komuta göre Node B nin Data kısmı 15 olarak değişir. Çünkü öncesinde B.back http://www.burakkiymaz.com

Burak Kıymaz 11.11.2015 A.next pointer ı ile eşitlenmiş, A.next ise öncesinde Node B nin adresini tutmaktadır. B.back->next->data =17;// Burada ise B nin next pointerının gösterdiği düğümün data kısmı 17 olarak değiştirilir. getnode(ptrtype* k){ *k = (ptrtype)malloc(sizeof(node)); // Node struct yapısının boyutu kadar bir alan ayırır. Node un yapılanmasını aynen kopyalar ve bu yapının adresini bizim belirlediğimiz k pointer ı ile fonksiyona gönderilen adrese kopyalar. Yani başka bir deyişle dinamik olarak bellekten bir struct yapısı oluşturulmuş olur.!!! getnode fonksiyonunun içerisine pointer adresi gönderilmesi gerekir. http://www.burakkiymaz.com

Burak Kıymaz 18.11.2015 Veri Yapıları struct Node{ int Data; struct Node* next; struct Node* back; ; struct Node A; struct Node B; struct Node* head; struct Node* temp; Back Data Next Burada bu şekilde bir yapı oluşturuldu. head = -1; // 1. elemanı ekleme temp = (Node*)malloc(sizeof(Node)); // bana Node büyüklüğünde bir alan ayır ve adresini döndür diyor. -1 15-1 mx Temp->data = 15 // ayrılan alanın datasına 15 yazıldı. Temp->back = -1; Temp->next=-1; head->temp; Head Mx Temp Mx // 2. elemanı ekleme temp = (Node*)malloc(sizeof(Node)); -1-5 mx kx kx 15-1 mx http://www.burakkiymaz.com

Burak Kıymaz 18.11.2015 Temp->data = -5 // ayrılan alanın datasına -5 yazıldı. Temp->next=head; temp->back=-1; head->back = temp; head->temp; Head kx Temp kx // 3. elemanı ekleme temp = (Node*)malloc(sizeof(Node)); -1 20 kx cx cx -5 mx kx kx 15-1 mx Temp->data = 20 // ayrılan alanın datasına 20 yazıldı. Temp->next=head; temp->back=-1; head->back = temp; head->temp; Head kx Temp kx Veriyi yazdırma void yazdir(){ if (head!= -1){ temp=head; while (temp!=-1){ printf("%d",temp->data); temp = temp->next; http://www.burakkiymaz.com

Burak Kıymaz 18.11.2015 Dugum Alma Fonksiyonu void dugumver(node** t1){ *t1 = (Node*)malloc(sizeof(Node)); dugumver(&temp);// dugumu alacağımız yerde bu şekilde çağırabiliriz. dugum ver fonksiyonu hafızadan bir yer alır ve adresini temp e verir. Bu sayede istediğimiz dugum adresini sadece fonksiyonu yazarak alabiliriz. Eleman silme eleman silmek istediğimiz zaman ilk kontrol etmemiz gereken silinecek eleman ilk eleman mı değil mi? Ilk elemansa; Temp = head; Head = head->next; head->back = NULL; free(temp); aradaki bir elemansa; temp->back->next = temp->next; temp->next->back = temp->back; free(temp); http://www.burakkiymaz.com

16.12.2015 Veri Yapıları Queue Veri yapıları FIFO (first in first out) yani sıraya ilk giren ilk çıkar. < - - - - - - - - - - - - - - -< - - - - - - - - - - - - - - -< head ilk elemanı rear ise son elemnı temsil eder. kuyrukta hiç eleman yokken head ve rear birer pointer dır.. struct Node* head; struct Node* rear; struct Node* temp; 1. eleman ekleme -1 15-1 2. eleman ekleme -1 15 25-1 Temp->next = -1; temp-> back; rear->next = temp; rear = temp; Kuyruk mantığında araya eleman eklemek ve silmek mümkün değildir çünkü kuyruk mantığına aykırıdır. Kuyruğun linkedlist ten bir farkı yoktur sadece sondan ekleme yapılır kullanımı aynıdır. Ekleme Ve Silme Kodu: int pop(){ eleman silme int k; if (head!=null){ k=head->data; head->next->back = head->back; // burada kuyruktaki ilk eleman çıkarılmış oldu. head = head->next; void push(int eleman){//eleman ekleme getnode(&temp); temp->data = eleman; temp->next = NULL; temp-> back = rear;

16.12.2015 Veri Yapıları if (rear==null) head = temp; else rear->next = temp; //rear->next = temp; => bu kısım ilk elemanda çalışmaz bu yüzden üstteki if-else komutu yazıldı... rear = temp; Yığınlar FILO (first in last out) yani ilk giren son çıkar. Bunlar işletim sisteminin omurgasını oluşturur. Derleyiciler de tamamen yığın yapısını kullanır. Eklenen tüm elemanlar başa eklenir ve head olarak tanımlanır. Ekleme ve Silme Kodu: int pop(){// eleman silme int k; if (head!=null){ k=head->data; head = head->next; head->back = NULL void push(int eleman){//eleman ekleme getnode(&temp); temp->data = eleman; temp->next = head; temp-> back = NULL; if (head!=null) head->back=temp; head = temp;

16.12.2015 Veri Yapıları Dairesel Linkedlist: Kendisinin adresi 15 head Kendisinin adresi Temp->data =15; temp->next = temp; temp->back = temp; 20 15 void push(int eleman){ getnode(&temp); temp->data = eleman; if (head!=null){ temp->next=head; temp->back = head->back; head->back = temp; temp->back->next = temp head = temp; else{ Temp->data =eleman; temp->next = temp; temp->back = temp; Editörlerdeki Stack (Yığın) Mantığı Bir fonksiyonda derleme yapılırken başka bir fonksiyon çağırılırsa bir aktivasyon kaydı tutulur ve yığına atılır bu aktivasyon kaydında temel olarak o satırın adresi(en son bulunduğu) o ana kadarki değişkenlerin değerleri tutulur.

16.12.2015 Veri Yapıları int main(int argc, char** argv) { int a=3, b=4; a=a+b; b=fonk1(a,b); // buraya kadar gelir ve fonk1 fonksiyonuna döner ve elindeki işlemi bırakır. b=2*b; a=fonk2(a,b); b=a+b; a=fonk1(a,b); return (EXIT_SUCCESS); int fonk1(int x, int y){ x=x+y; x=fonk2(x.y); x=x-y; return x; int fonk2(int x,int y){ return x-y; X=11,y=4 x= fonk2(11.4) adress:f2 A=7, b=4 b= fonk1(7.4); adress : 5 fonk1 içerisindeki fonk2 bittikten sonra yığındaki ilk elemana gidilir. Yığındaki ilk eleman bir sonraki yapılacak komutu belirtir. Ve yığından çıkarılır. Fonk1 bittikten sonra yine yığına gidilir ve ilk elemanda bulunan komut işlenir ve o satır yığından çıkarılır. A=7,b=6 a=fonk2(7.6) adress 7 Fonk 2 bittikten sonra yine bu satır silinir. X=2,y=1 x=fonk2(2.1) adress:f2 A=1,b=7 a= fonk1(1.7)

16.12.2015 Veri Yapıları adress:9 Yine aynı işlemler uygulanarak program tamamlanır. 4! = 4.3! 3! = 3.2! 2! = 2.1! 1! = 1.0! 0! = 1 Recursive (Özyinelemeli) Algoritmalar Faktöriyelin genel mantığı faktoriyel(n) = n. faktoriyel(n-1); şeklindedir int Faktoriyel(int n){ if(n==0) return 1; else return n*faktoriyel(n-1); N=1 return 1 adress: 4 N=1 return 1*F(0) adress: 4 N=2 return 2*F(1) adress: 4 N=3 return 3*F(2) adress: 4 N=4 return 4*F(3) adress:4 En son F(0) ile girdiğimizde return 1 komutu çalışır ve yığından veri çekmeye başlar ve ilk elemanı çeker: 1*1 = 1 2*1 = 2 2*3 = 6 6*4 = 24 ve burada yığın bittiği için ana fonksiyona döner.

23.12.2015 Veri Yapıları Fibonacci sayı sisteminin recursive kodu: int main(int argc, char** argv) { Veri Yapıları printf("%d",fibonacci(7)); return (EXIT_SUCCESS); int fibonacci(int merak){ int i=0; if (merak ==1 merak == 2){ return merak-1; else{ return fibonacci(merak-1)+ fibonacci(merak-2); çıktı :8 int main(int argc, char** argv) { suleyman(3); return (EXIT_SUCCESS); void suleyman (int n){ 1 if (n>0){ 2 printf("%2d", n-1); 3 n=n-1; 4 suleyman(n); 5 printf("%2d\n",n); N=0 suleyman(0) adres:4 N=1 suleman(1) adres:4 N=2 suleyman(2) adres:4 Çıktı: 2 1 0 0 1 2 2,1,0 ilk printf den dönen değer, 0 1 2 ise ikinci printf den dönen değer

23.12.2015 Veri Yapıları TREE (Ağaçlar) D, M, N, F ve S çocuğu almadığı için kördüğümdür. B Parent -> D, E, F nin annesi Bu ağacın derinliği (depth): 4 BT (Binary Tree) En önemli özelliği her düğümün en fazla 2 tane çocuğu olabilir. Binary tree nin uygulanması Lineer diziler ile yapılabilir. Diziler ile linkedlist kullanımı ile yapılabilir. Linkedlistin dinamik pointer kullanımı ile yapılabilir. Lineer Dizi ile Binary Tree Yapımı n seviyeyi göstermek üzere bir 2 (n+1) -1 tane eleman bulunabilir.

23.12.2015 Veri Yapıları 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 + - * 1 2 5 + 7 2 Dezavantajı: Sadece sağ kolda eleman varsa 4. seviyede 5 eleman için 31 karakter alan ayrılacak ve taşıma işlemi yapılacağı zaman veya araya eleman ekleneceği zaman tüm diğer elemanları da oynatmamız gerektiği için tercih edilmeyen bir yöntemdir. Lineer Dizi + Linkedlist ile Binary Tree Yapımı DATA SOL SAĞ + 2 3-4 5 * 6 7 1-1 -1 2-1 -1 5-1 -1 + 8 9 7-1 -1 2-1 -1 Lineer diziye göre daha kullanışlı bir yöntem fakat 9 eleman eklemek için 27 karakterlik alan ayrıldı. Eleman ekleme ve silme işlemi normal Linkedlist mantığıyla yapılır.

23.12.2015 Veri Yapıları Dinamik Pointer ile Binary Tree struct Node{ char data; struct Node* sag; struct Node* sol; struct Node* anne ; ; anne sol data sağ -1 + - * -1 1-1 -1 2-1 -1 5-1 + -1 7-1 -1 2-1 BST (Binary Search Tree) Bir düğümün sol dalındaki değerler o düğümden küçük eşit, sağındakiler büyük olacaktır. Verilen diziyi okumaya sol baştan başlanır. [15, 23, 6, 8, 45, 3, 7, -1, 19, 25] dizisini Binary Search Tree ile dizmek istersek;

23.12.2015 Veri Yapıları Binary Tree de arama yaparken bulmak istediğimiz sayının elimizdeki düğümden büyük mü, küçük mü olduğuna bakılır ve buna göre bir eleme işlemi yapılır. ÖDEV: Verilen bir diziyi Binary Search Tree ye yerleştiren programı yaz. (Dinamik pointer Linkedkist kullanılarak yapılacak.)

30.12.2015 Veri Yapıları Binary Search Tree 3 yönlü dinamik linked list ile yapılır. node* head, *temp, *p; Veri Yapıları elemanlarmıız var. Binary Search Tree ye Eleman Ekleme Mantık Elemanın ekleneceği anne düğümü bul O annenin uygun dalına yerleştir. P eklenecek elemanı göstersin typedef struct linkedlist llist; struct linkedlist{ int data; llist* mother; llist* left; llist* right; ; llist* head, *temp, *p, *tempmom; void ekle(int eleman){ getnode(&p); p-> data = eleman; p->left = NULL; p->right = NULL; if (head == NULL){ p->mother = NULL; head = p; else{

30.12.2015 Veri Yapıları temp = head; while(temp!=null){ tempmom = temp; if (eleman <= temp->data) temp = temp->left; else temp = temp->right; // burada anne düğüm bulundu. p->mother = tempmom; if (eleman <= tempmom->data) tempmom->left = p; else tempmom->right = p; Binary Search Tree den Eleman Silme Bst den elaman sileceksek şu üç koşulu göz önünde bulundurmamız gerekmektedir. kör düğümse tek çocuğu varsa iki çocuğu varsa void sil(){ // p nin sağ ve solu NULL ise kör düğüm demektir. // case 1 if (p->data<=p->mother->data) p->mother->left = NULL; else p->mother->right = NULL; if (p->left!= NULL){

30.12.2015 Veri Yapıları // case 2 // temp de p nin çocuğunu göstersin if (p->right = NULL){ temp = p->left; else temp = p->right; temp->mother = p->mother; if (p==p->mother->right) p->mother->right = temp; else p->mother->left = temp; /* * case 3 * p nin iki çocuğu varsa * ya sol daldaki en büyük eleman bulunur ya da sağdaki en küçük eleman bulunur. temp onu gösterir. * bunu düğümü p nin olduğu yere taşırız ve p nin tüm bağlantılarını keseriz. */ temp->left->mother = temp->mother; temp->mother->right = temp->left; temp->mother = p->mother; p->mother->right = temp; temp->left = p->left; temp->left->mother = temp; temp->right = p->right; p->right->mother = temp; free(p);

30.12.2015 Veri Yapıları Binary Search Tree de Dolaşma 3 türlü dolaşım vardır. inorder dolaşım preorder dolaşım postorder dolaşım Inorder Dolaşım sol-kök-sağ şeklindedir. 3 5 7 şeklindeki bir ağaçta önce 5 sonra 3 en son 7 yazılır. 8, 14, 23, 28, 33, 45, 46, 49 Seçilen eleman eğer kökse ona da bu işlemler uygulanır ta ki kör düğüm bulunana kadar. Inorder Dolaşım Kodu void inorder(llist* temp){ if (temp!=null){ inorder(temp->left); printf("%d",temp->data); inorder(temp->right);

30.12.2015 Veri Yapıları Preorder Dolaşım kök-sol-sağ şeklindedir. Preorder Dolaşım Kodu void preorder(llist* temp){ if (temp!= NULL){ printf("%d",temp->data); preorder(temp->left); preorder(temp->right); Postorder dolaşım sol-sağ-kök şeklinde dolaşım yapılır. 28, 14, 8, 23, 45, 33, 49, 46 8, 23, 14, 33, 46, 49, 45, 28

30.12.2015 Veri Yapıları Postorder Dolaşım Kodu void postorder(llist* temp){ if (temp!=null){ postorder(temp->left); postorder(temp->right); printf("%d",temp->data); Bir ifadeden bir ağacı elde etmek için Inorder+ Preorder veya Inorder + Postorder ile ağaç elde edilebilir ÖRNEK: PREORDER: A D F G H K L P Q R W Z INORDER: G F H K D L A W R Q P Z Ağacı Bulunuz Preorder da men başta A olduğundan dolayı kök(root) A olur. Inorder da A nın solundakiler hep solda sağındakiler hep sağda kalır.

06.01.2016 Aritmetik İfadeler Veri Yapıları Üç ifade yöntemi vardır Infix (aratakı) Prefix (öntakı) Postfix (sontakı) INFIX 2 + 3 * 5 7 / 4-2 elemanlarına Operand(terim) aradakilere ise Operatör denir PREFIX Operator terimlerin arasından alınıp sola yazılır. 2*5 -> Infix ifade *25 -> Prefix ifade POSTFIX Oparatör terimlerin sağına alınır. 25* -> Postfix ifade Infix ifadeyi Postfix e dönderme 2+3*5-7/4^2-7 2+(3*5)-(7/(4^2))-7 2+(35*)-(7(42^)/)-7 235*+742^/-7- Compilerlar yazılan bir aritmetik ifadeyi postfix e dönüştürüp öyle işlem yapar. Prefix ile aynı işlem - - + 2 * 3 5 7 / 7 ^ 4 2 7 Infix To Postfix Algorithm Operator ^ * / + - ( ) Öncelik 3 2 2 1 1 4 0 Infix ifadeyi soldan itibaren tek tek oku; Gelen değer terim ise doğrudan göster, gelen değer operatör ise bekle(yığına ata) Sol parantez ise doğrudan yığına at Gelen operatorün önceliği yığının top elemanından büyükse yığına at, küçükse yığın tepesindeki elemanın önceliği bizim elemanımızın önceliğinden küçük oluncaya kadar yığını boşalt. Sağ parantez ise yığındaki sol paranteze kadar ne varsa çıkar ve göster. NOT: Sol parantez girerken en büyük önceliği sahiptir fakat yığın içerisinde önceliği 0 olur.

06.01.2016 A * ( B + C D / E ) / F Gösterim Yığın ABC+D/-*F/ *(2) ((0) +(1)(- GELDİ GİREMEZ + SOLA GİTTİ) -(1) /(2) ) (0) ( ')' GELDİ BURAYA KEDER HEPSİNİ ÇIKAR) ( 2 + 8 / 4 ) ^ ( 2 4 ) * 2 Gösterim Yığın 284 ((0)+/ 284/+ 284/+24 ^(- 284/+24-^ 284/+24-^2 * 284/+24-^2* Infix To Prefix Algorithm İfadeyi ters çevir. Infix to postfix algoritmasını çalıştır Çıkan ifadeyi ters çevir. Postfix İfadenin Hesaplanması İfade soldan itibaren okunur. Gelen eleman terim ise yığına atılır, gelen eleman operatör ise yığındaki en top iki terim çıkarılır. (ilk eleman sağa ikincisi sola gelecek şekilde) operatör bunlara uygulanır. Çıkan sonuç tekrar yığına atılır. İfade bitince yığındaki son eleman sonuçtur. 2+5*(8-4) 2584-*+ - 4 8 5 2 4 4 5 2

06.01.2016 Prefix İfadenin Hesaplanmsı Prefix ifade sağdan sola doğru taranır. Gelen eleman terim ise yığına atılır operatör ise top iki eleman yığından çıkarılır. (ilk çıkan eleman sola ikinci sağa gelecek şekilde) operatör bu elemanlara uygulanır ve çıkan sonuç tekrar yığına atılır.