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
BAĞLI LİSTE KAVRAMI Derleme zamanında boyutunun bilinmesine ihtiyaç yoktur (dinamik veri yapısı). Bir linked list veri elemanlarının dinamik listesini modellemek için kullanılan bir veri yapısıdır. Bu yüzden bağlı liste çalışması önemli veri yapılarından biridir.
Dizi ve BAĞLI LİSTE DİZİ Sıralı eşleşmeyi destekler, sabit bir veri yapısıdır Bir dizide herhangi bir pozisyona ekleme veya pozisyondan silme pahalı bir operasyondur. Bağlı Liste Elemanların sabit olarak yerleşmesine gerek yoktur. Bir eleman listeye bağlanabilmek için bir önceki elemana ihtiyaç duyar Bir eleman listeye eklenince bir sonraki elemanın adresini saklar.
Dizi ve BAĞLI LİSTE Array: max length=7 0 1 2 3 4 5 6 X X X X 0 1 2 3 4 5 6 Sıra numarasına göre elemanı al Linked List: max length=18 0 1 2 3 4 5 6 X 7 8 9 X 10 11 X 12 13 14 X 15 16 17 18
Bağlı liste tipleri 1 data Link data Link NULL data Link data Link 2 Link 3 data Link Link data Link data data LinkLink data 4 LinkLink LinkLink
Bağlı listeleri oluştururken 4 konu 1. Yapı Veri elemanı Bağlantı alanı elemanı 2. Elemanlar arasında bağlantı kurma şekli İlk, son, orta eleman 3. Tüm liste elemanlarını almak için kaç tane düğüme ihtiyaç var 4. Temel işlemler: Yeni eleman ekleme (her pozisyon) Silme (her pozisyondan) Bulma
data Link data Link NULL 1. Yapı 1. Yapı Veri elemanı Bağlantı alanı elemanı 2. Elemanlar arasında bağlantı kurma şekli İlk, son, orta eleman 3. Tüm liste elemanlarını almak için kaç tane düğüme ihtiyaç var 4. Temel işlemler: Yeni eleman ekleme (her pozisyon) Silme (her pozisyondan) Bulma
1. Yapı struct Node int data; Node *link; ;
1. Yapı: tek düğüm ile nasıl çalışırız Node a; a.data=10; a.link=null; cout<<a.data; Node *b; b=new Node; b->data=20; b->link=null; cout<<b->data; delete b; Compare??? What is the different?
2. Elemanlar arasında bağ kurmanın yolu İlk, son, orta eleman data Link data Link data Link data Link NULL Head Middle Last
3. Tüm liste elemanlarını almak için kaç tane düğüme ihtiyaç var ptail data Link data Link data Link data Link NULL phead phead, ptail değerlerini nasıl saklarız? Type 1: Node *phead=null, *ptail=null; Type 2: typedef struct Node *List; List phead, ptail;
4. Temel işlemler: p data Link data Link data Link NULL Insert node Remove node creating new node
4. Temel işlemler: yeni bir düğüm oluşturma Node * createnewnode(int X) Node *p=new Node; If (p!=null) p->data=x; p->link=null; return p; p data Link NULL
: sadece Phead ile void addnodeatfirst(node *newnode) if (phead==null) phead =newnode; else newnode->next=phead; phead =newnode; Insert Node at First Burada liste elemanı listenin sonuna değil başına eklenmektedir.
: sadece Phead ile void displaylist() node *temp=h; while (temp!=null) cout<<temp->data<<" "; temp=temp->next; Düğüm arama
: sadece Phead ile void RemoveNodeatFirst() if (phead!=null) node *t= phead; phead = phead ->next; delete t; Baştan düğüm silme İlk eleman silinince, sıradaki eleman ilk eleman olur.
: sadece Phead ile node *find(int key) node *temp=h; while (temp!=null && temp->data!=key) temp=temp->next; return temp; Find Node Listenin sonu geldiğinde veya eleman bulunduğunda döngüden çıkılır, Döngüden çıkıldığı anda eldeki temp değeri ne ise aranan elemanı adresi Odur.
: sadece Phead ile void removeatlast() node *t=h; node *truoc=t; while (t->next!=null) truoc=t; t=t->next; truoc->next=null; delete t; Remove Node at Last t, sıradaki düğümü, truoc ise onun adresini tutar, yani truoc aslında bir önceki elemandır. Son elemana gelene kadar sırayla kayıtlar arasında gezilir en sonunda ise; truoc->next=null ataması ve delete t komutu ile Sondaki eleman silinmiş olur.
: sadece Phead ile void insertatlast(node *newnode) node *t=h; while (t->next!=null) t=t->next; Sona düğüm ekleme t->next=newnode; Son düğüme kadar sırayla kayıtlar arasında gezilir, son düğüme gelince; t->next=newnode; ile sıradaki eleman sona eklenmiş olur.
: Phead ve ptail ile 4. temel işlemler: yeni düğüm ekle phead ptail data Link data Link data Link NULL data Link
4. Temel işlemler: Liste başına düğüm ekle void Insert_First (node *newnode) if ( ptail == NULL ) phead=ptail =newnode ; else newnode->next=phead ; phead=newnode; ptail aynı kalır phead güncellenir.
4. Temel işlemler: Liste sonuna düğüm ekle void Insert_Last (node *newnode) void Insert_Last (node *newnode) if ( ptail == NULL ) phead=ptail =newnode ; else ptail->next=newnode ; ptail=newnode;
4. Temel işlemler: Bir düğümden sonra düğüm ekleme void Insert_after (node *newnode,node *p) If (p!=ptail) newnode->next=p>next; p->next=newnode; else insert_last (newnode);
4. Temel işlemler: baştan bir düğüm silme void removenodeatfirst () void removenodeatfirst () If (phead!=null) Node *temp=phead; phead = phead ->next; delete temp;
4. Temel işlemler: bir düğümden sonrakini silme void removenodeafter (node *p) Node *temp=p>next; p->next=p->next->next; delete temp;
4. Temel işlemler: sondaki elemanı sil void removenodeatlast () void removenodeatlast () node *t=phead; node *truoc=t; while (ptail->next!=null) truoc=t; t=t->next; delete ptail; // veya delete t ptail=truoc; ptail->next=null;
4. Temel işlemler: Bütün düğümleri tara Void Display() Void Display() node *p=phead; while (p!=null) cout<<p->data<< ; p=p->next;
4. Basic operations: count number of nodes int Count () int Count () int count=0; node *p=phead; while (p!=null) count+=1; p=p->next; return count;
2.Singly Linked List 4. Basic operations: Listeyi Sil void removelist () Node *p=phead; While (p!=null) Node *temp=p; p = p ->next; delete temp;
Sadece phead kullanarak aşağıdaki özellikleri yerine getiren bir program yazınız Display menu Add one node at first Add one node at last Add many node at first Add many node at last Select and display n(th) node Find one node Add one node after select node Display node count Display List Remove one node Remove List Get sum of all nodes