Sunum yükleniyor. Lütfen bekleyiniz

Sunum yükleniyor. Lütfen bekleyiniz

Listeler. İçerik * Soyut Veri Yapısı - Abstract Data Type (ADT) * Liste SVY * Liste SVY nın Dizi ile gerçekleştirilmesi * Bağlantılı Listeler * Temel.

Benzer bir sunumlar


... konulu sunumlar: "Listeler. İçerik * Soyut Veri Yapısı - Abstract Data Type (ADT) * Liste SVY * Liste SVY nın Dizi ile gerçekleştirilmesi * Bağlantılı Listeler * Temel."— Sunum transkripti:

1 Listeler

2 İçerik * Soyut Veri Yapısı - Abstract Data Type (ADT) * Liste SVY * Liste SVY nın Dizi ile gerçekleştirilmesi * Bağlantılı Listeler * Temel İşlemler n Ekleme - Insert, Bul- find, sil-delete, yaz-print, etc. * Bağlantılı liste türevleri n Dairesel (Circular) bağlantılı listeler n Çift-yönlü (Doubly) bağlantılı listeler

3 Soyut Veri Yapısı * Veri tipi n Nesneler kümesi + işlemler kümesi n Örnek : integer  Tamsayılar kümesi  işlemler: +, -, x, / * Genelleştirilebilinir mi? n (örnek prosedürler bir işlem kavramını genelleştirir) n Evet!  Soyut veri tipi n Yüksek-seviyede soyutlama high-level abstractions (soyutlama aracılığıyla karmaşıklık kontrolü) n Kaysülleme (Encapsulation) / giydirme

4 Kapsülleme * SVT üzerindeki işlemler sadece uygun fonksiyonun çağrılması ile yapılabilir.  Tip tanımı ve bu tip üzerindeki işlemler, programın bir bölümüne yerleştirilebilinir.  Eğer SVT nin gerçekleştirilmesi değiştirmek isteniyorsa n Nereye bakacağımızı biliyoruz. n Bir kısmını değiştirmekle programın başka yerlerinde hata çıkmayacağından emin oluruz. SVT basit tipler gibi davranabiliriz: Alt plandaki gerçekleştirilmesiyle ilgilenmemize gerek kalmayabilir. * SVT  C++: class * metot  C++: member function üye fonksiyonu

5 SVT… * Örnekler n set – küme SVT  Elemanların kümesi  işlemler: birleşim- union, kesişim-intersection, boyutu-size and tersi-complement n queue – kuyruk SVT  Elemanların art arda dizilmiş hali  işlemler: boş kuyruk oluştur-create empty queue, ekle- insert, incele-examine, sil-delete, ve yoket-destroy * İki SVT aynı değildir: Alt planda aynı modele sahip olmasına rağmen işlemleri farklıysa. n Örnek. Sadece birleşim ve bul işlemleri içeren set- küme SVT farklıdır. n Gerçekleştirmenin uygunluyu çalıştırılan işlemlere çok bağlıdır.

6 Avantaj ve Dezavantajları SVTlerinin kullanımı, gerçekleştirmesinden ayrıdır/ ayrılır. Modülerdir: bir SVT için bir modül n Hata ayıklaması (debug) kolaydır. n Birden fazla kişinin aynı anda beraber çalışmasına uygundur. SVT kodu farklı uygulamalar için tekrar kullanılabilir. Bilgi gizleme n Belirli bir işi yapmak için tasarlanmış mantıksal birimdir. n Kullanıcı programlarını etkilemeden gerçekleştirme detayları değiştirilebilir. Hızlı prototiplemeye müsaittir. n Basit SVT gerçekleştirmeleri ile prototipini yap ve sonra gerekirse ayarlama yap.  Verimlilik kaybı

7 Liste SVT * Sıfır veya birden fazla elemanların art arda dizilmiş hali A 1, A 2, A 3, … A N * N: liste uzunluğu * A 1 : ilk eleman * A N : son eleman * A i : i. Eleman / pozisyon * If N=0, then listeyi boşalt * Lineer olarak sıralanmış n A i precedes (önce gelir) A i+1 n A i follows (takip eder) A i-1

8 İşlemler * printList: listeyi yaz * makeEmpty: boş liste oluştur * find: listedeki bir elemanın pozisyonunu bul n liste: 34,12, 52, 16, 12 n find(52)  3 * insert: listeye bir eleman ekle n insert(x,3)  34, 12, 52, x, 16, 12 * remove: listeden bir eleman sil n remove(52)  34, 12, x, 16, 12 * findKth: Belirli bir pozisyondaki elemanı getir.

9 SVT Gerçekleştirmesi * SVT ini ifade edecek bir veri yapısı seç n Örnek: Diziler, kayıtlar vb. * Each operation associated with the ADT is implemented by one or more subroutines * Two standard implementations for the list ADT n Array-based n Linked list

10 Dizi Gerçekleştirmesi * Elemanlar art arda bir şekilde kaydediliyor.

11 Dizi Gerçekleştirmesi... * Listenin maksimum boyutunun bilinmesini gerektirir  Yer israfı * printList ve find: doğrusal * findKth: sabit * insert ve delete: yavaş n örnek 0. pozisyona ekleme (yeni eleman)  Öncelikle yer açmak için bütün dizinin bir hücre kaydırılmasını gerektirir. n örnek 0. pozisyonda silme  Bütün elemanların bir hücre yukarı kaydırılması gerekir n Ortalama olarak her iki işlemde de listenin yarısının yer değiştirmesi gerekir.

12 İşaretçi Gerçekleştirmesi (Bağlantılı Liste) * Liste de elemanlar art arda depolanmayacaksa n bağlantılı liste kullanılabilir n Hafızada art arda olmasına gerek olmayan yapılardır.  Her düğüm bir eleman ve kendisinden sonra gelen düğümüm adresini içeren bir işaretçi barındırır.  Son hücre bir sonraki bağlantı olarak NULL değerini gösterir.  Dizi gerçekleştirmesi ile karşılaştırılırsa, İşaretçi uygulaması gerektiği kadar alan kullanır ûFakat herbir hücrede işaretçi için alan tutar.

13 Bağlantılı Listeler * Bağlanmış düğümler serisine bağlantılı liste denir * Her düğüm en az aşağıdakileri içerir. n Veri (herhangi bir tiple olabilir) n Listedeki bir sonraki düğüme olan işaretçi * Baş: İlk düğüme olan işaretçidir  Son düşüm NULL’ a işaret eder A  Baş BCA veriişaretçi node

14 Basit bir Bağlantılı Liste Sınıfı  İki sınıf kullanılır : Node ve List  Node sınıfını düğümler için tanımla data : double -tipinde veri next : listedeki bir sonraki düğüme işaretçi class Node { public: doubledata;// data Node*next;// pointer to next };

15 Basit bir Bağlantılı Liste Sınıfı  List sınıfı aşağıdakiler içerir head : listedeki ilk düğüme olan işaretçi. İlk başta liste boş olduğu için, head, NULL değerini alır. n List üzerindeki işlemler class List { public: List(void) { head = NULL; }// constructor ~List(void);// destructor bool IsEmpty() { return head == NULL; } Node* InsertNode(int index, double x); int FindNode(double x); int DeleteNode(double x); void DisplayList(void); private: Node* head; };

16 Basit bir bağlantılı liste sınıfı * List işlemleri IsEmpty : listenin boş oluş olmadığını belirle. InsertNode : belirlenen bir pozisyona yenib ir düğüm ekle FindNode : verilen bir değere sahip düğümü bul DeleteNode : verilen bir değere sahip düğümü sil DisplayList : listedeki bütün düğümleri listele

17 Yeni bir düğüm ekleme * Node* InsertNode(int index, double x) index’inci elemandan sonra verisi x’e eşit olan düğümü ekle (örnek., index = 0 iken, düğümü ilk eleman olarak ekle; index = 1 iken, ilk elemandan sonra düğüm ekle.) Eğer ekleme başarılı ise, eklenmiş düğümü dönder yoksa, return NULL. (Eğer index liste uzunluğu ise, ekleme başarısız olacak.) * Adımlar 1. index ’inci elemanı bul 2. Yeni düğüm için hafızada yer ayır 3. Yeni düğüm kendisinden sonrakini gösterecek 4. Yeni düğümden önceki yeni düğümü gösterecek newNode index’ inci eleman

18 Yeni bir düğüm ekleme  InsertNode ‘ da karşılaşılan durumlar 1. Boş listeye ekle 2. En öne ekle 3. En sona ekle 4. Ortaya ekle * Gerçekte iki temel durum vardır. n İlk düğüm olarak ekleme (Durum 1 and Durum 2) n Ortaya veya sona ekleme (Durum 3 and Durum 4)

19 Yeni bir düğüm ekleme Node* List::InsertNode(int index, double x) { if (index < 0) return NULL; int currIndex=1; Node* currNode=head; while (currNode && index > currIndex) { currNode=currNode->next; currIndex++; } if (index > 0 && currNode == NULL) return NULL; Node* newNode=newNode; newNode->data=x; if (index == 0) { newNode->next=head; head=newNode; } else { newNode->next=currNode->next; currNode->next=newNode; } return newNode; } Try to locate index ’th node. If it doesn’t exist, return NULL.

20 Yeni bir düğüm ekleme Node* List::InsertNode(int index, double x) { if (index < 0) return NULL; int currIndex=1; Node* currNode=head; while (currNode && index > currIndex) { currNode=currNode->next; currIndex++; } if (index > 0 && currNode == NULL) return NULL; Node* newNode=newNode; newNode->data=x; if (index == 0) { newNode->next=head; head=newNode; } else { newNode->next=currNode->next; currNode->next=newNode; } return newNode; } Create a new node

21 Yeni bir düğüm ekleme Node* List::InsertNode(int index, double x) { if (index < 0) return NULL; int currIndex=1; Node* currNode=head; while (currNode && index > currIndex) { currNode=currNode->next; currIndex++; } if (index > 0 && currNode == NULL) return NULL; Node* newNode=newNode; newNode->data=x; if (index == 0) { newNode->next=head; head=newNode; } else { newNode->next=currNode->next; currNode->next=newNode; } return newNode; } Insert as first element head newNode

22 Yeni bir düğüm ekleme Node* List::InsertNode(int index, double x) { if (index < 0) return NULL; int currIndex=1; Node* currNode=head; while (currNode && index > currIndex) { currNode=currNode->next; currIndex++; } if (index > 0 && currNode == NULL) return NULL; Node* newNode=newNode; newNode->data=x; if (index == 0) { newNode->next=head; head=newNode; } else { newNode->next=currNode->next; currNode->next=newNode; } return newNode; } Insert after currNode newNode currNode

23 Bir düğüm bulma * int FindNode(double x) Listede verisi x olan düğümü ara. n Eğer böyle bir düğüm varsa pozisyonunu dönder,. Yoksa, return 0. int List::FindNode(double x) { Node* currNode=head; int currIndex=1; while (currNode && currNode->data != x) { currNode=currNode->next; currIndex++; } if (currNode) return currIndex; return 0; }

24 Düğüm silme * int DeleteNode(double x) n Listeden verisi x from the list. n Böyle bir düğüm varsa, pozisyonunu dönder. Yoksa, return 0. * Adımlar İstenen düğümü bul ( FindNode işlemine benzer) n Bunulan düğümün işgal ettiği hafızayı boşalt (gözden çıkar) n Bulunan düğümün öncekisi, bulunan düğümün sonrakisini gösterir şekilde ayarla.  InsertNode, gibi iki özel durum vardır. n İlk düğümü sil n Ortadaki veya sonraki düğümü sil.

25 Düğüm silme int List::DeleteNode(double x) { Node* prevNode=NULL; Node* currNode=head; int currIndex=1; while (currNode && currNode->data != x) { prevNode=currNode; currNode=currNode->next; currIndex++; } if (currNode) { if (prevNode) { prevNode->next=currNode->next; delete currNode; } else { head=currNode->next; delete currNode; } return currIndex; } return 0; } Try to find the node with its value equal to x

26 Düğüm silme int List::DeleteNode(double x) { Node* prevNode=NULL; Node* currNode=head; int currIndex=1; while (currNode && currNode->data != x) { prevNode=currNode; currNode=currNode->next; currIndex++; } if (currNode) { if (prevNode) { prevNode->next=currNode->next; delete currNode; } else { head=currNode->next; delete currNode; } return currIndex; } return 0; } currNodeprevNode

27 Düğüm silme int List::DeleteNode(double x) { Node* prevNode=NULL; Node* currNode=head; int currIndex=1; while (currNode && currNode->data != x) { prevNode=currNode; currNode=currNode->next; currIndex++; } if (currNode) { if (prevNode) { prevNode->next=currNode->next; delete currNode; } else { head=currNode->next; delete currNode; } return currIndex; } return 0; } currNodehead

28 Bütün elemanları yazdırma * void DisplayList(void) n Bütün düğümlerin verilerini yazdır n Listedeki düğüm sayısını yazdır. void List::DisplayList() { int num=0; Node* currNode=head; while (currNode != NULL){ cout data << endl; currNode=currNode->next; num++; } cout << "Number of nodes in the list: " << num << endl; }

29 Listeyi yoketme * ~List(void) n destructor u kullanarak liste tarafından işgal edilen hafızayı serbest bırak. n Listedeki her bir düğümü birer birer sil. List::~List(void) { Node* currNode = head, *nextNode = NULL; while (currNode != NULL) { nextNode=currNode->next; // destroy the current node delete currNode; currNode=nextNode; }

30 List ‘ in kullanımı int main(void) { List list; list.InsertNode(0, 7.0);// successful list.InsertNode(1, 5.0);// successful list.InsertNode(-1, 5.0);// unsuccessful list.InsertNode(0, 6.0);// successful list.InsertNode(8, 4.0);// unsuccessful // print all the elements list.DisplayList(); if(list.FindNode(5.0) > 0)cout << "5.0 found" << endl; elsecout << "5.0 not found" << endl; if(list.FindNode(4.5) > 0) cout << "4.5 found" << endl; elsecout << "4.5 not found" << endl; list.DeleteNode(7.0); list.DisplayList(); return 0; } Number of nodes in the list: found 4.5 not found 6 5 Number of nodes in the list: 2 result

31 Bağlantılı Liste Çeşitleri * Dairesel (Çevrimsel) bağlantılı listeler n Son düğüm listedeki ilk düğümü işaret eder n Listeyi gezmeyi ne zaman bitireceğimizi nasıl bileceğiz? (İpucu: current node işaretçisinin kafa (baş) ı işaret edip etmediğini kontrol et.) A Head BC

32 Bağlantılı Liste Çeşitleri * Çift bağlantılı liste (Doubly linked lists) n Herbir düğüm hem öncekini hem sonrakini işaret eder. İki NULL vardır: listenin ilk ve son düğümlerinde Avantajı: verilen düğümde, öncekini ziyaret etmek kolaydır. Listeleri ters yönde gezmek kolayıdır. A Head B  C 

33 Dizi ve Bağlantılı Listeler * Bağlantılı listelerin kodlaması ve yönetimi dizilerden daha zordur fakat kendine has avantajları vardır. n Dinamik: bir bağlantılı liste kolaylıkla büyüyebilir ve daralabilir.  Listede kaç düğüm olması gerektiğini bilmemize gerek yoktur. Gerektikçe hafızada oluşturulur.  Buna karşılık C++ ‘ da dizi boyutu derleme zamanında sabittir. n Kolay ve hızlı ekleme ve silme  Dizide ekleme ve silme için geçici değişkenlere kopyalamak ve boşluk açmak veya boşluğu silmek gerekir.  Bağlantılı listede ise düğümlerin hareket etmesine gerek yoktur. Sadece işaretçilerin ayarları değiştirilir.

34 Örnek: Polinomial SVT * Tek- değişkenli polinomial için SVT * Dizi gerçekleştirmesi

35 Polinomial SVT … n Eğer A j katsayıları sıfırdan farklı ise kabul edilebilirdir, diğer durumda istenmez. n Örnek: Çarp  Zamanın çoğu sıfırların çarpımı için ve var olmayan parçaların çarpımı için harcanır. * Bağlantılı liste kullanılarak uygulanması n Herbir terim bir hücrede tutulur ve üstel değerlerin azalmasına göre sıralanır.


"Listeler. İçerik * Soyut Veri Yapısı - Abstract Data Type (ADT) * Liste SVY * Liste SVY nın Dizi ile gerçekleştirilmesi * Bağlantılı Listeler * Temel." indir ppt

Benzer bir sunumlar


Google Reklamları