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 0 1 2 3 4 5 6 X X X X 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 data Link Link data data 3 Link Link NULL 2 Link Link data data Link Link data LinkLink data data LinkLink LinkLink 4 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 2. Tekli Bağlı Liste data Link data Link NULL 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 2. Tekli Bağlı Liste 1. Yapı struct Node { int data; Node *link; } ; 2. Tekli Bağlı Liste 1. Yapı: tek düğüm ile nasıl çalışırız Node *b; b=new Node; Node a; a.data=10; a.link=NULL; cout<<a.data; b->data=20; b->link=NULL; cout<<b->data; delete b; Compare??? What is the different? 2. Tekli Bağlı Liste 2. Elemanlar arasında bağ kurmanın yolu İlk, son, orta eleman data Link data Link data Link data Link NULL Head Middle Last 2. Tekli Bağlı Liste 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, pTail değerlerini nasıl saklarız? pHead Type 1: Node *pHead=NULL, *pTail=NULL; Type 2: typedef struct Node *List; List pHead, pTail; 2. Tekli Bağlı Liste 4. Temel işlemler: p data Link data Link data Link NULL Remove node Insert node creating new node 2. Tekli Bağlı Liste 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 2. Tekli Bağlı Liste : sadece Phead ile void addnodeatFirst(node *newnode) { Insert if (pHead==NULL) { pHead =newnode; } else { newnode->next=pHead; pHead =newnode; } } Node at First Burada liste elemanı listenin sonuna değil başına eklenmektedir. 2. Tekli Bağlı Liste : sadece Phead ile void displaylist() { node *temp=h; while (temp!=NULL) { cout<<temp->data<<" "; temp=temp->next; } } Düğüm arama 2. Tekli Bağlı Liste : 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. 2. Tekli Bağlı Liste : 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. 2. Tekli Bağlı Liste : 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. 2. Tekli Bağlı Liste : 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. 2. Tekli Bağlı Liste : Phead ve pTail ile 4. temel işlemler: yeni düğüm ekle pHead data Link pTail data Link data Link data Link NULL 2. Tekli Bağlı Liste 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. 2. Tekli Bağlı Liste 4. Temel işlemler: Liste sonuna düğüm ekle void Insert_Last (node *newnode) { if ( pTail == NULL ) { pHead=pTail =newnode ; } else { pTail->next=newnode ; pTail=newnode; } } 2. Tekli Bağlı Liste 4. Temel işlemler: Bir düğümden sonra void Insert_after (node *newnode,node *p) düğüm ekleme { If (p!=pTail) { newnode->next=p>next; p->next=newnode; } else insert_Last (newnode); } 2. Tekli Bağlı Liste 4. Temel işlemler: baştan bir düğüm silme void removeNodeAtFirst () { If (pHead!=NULL) { Node *temp=pHead; pHead = pHead ->next; delete temp; } } 2. Tekli Bağlı Liste 4. Temel işlemler: bir düğümden sonrakini silme void removeNodeAfter (node *p) { Node *temp=p>next; p->next=p->next->next; delete temp; } 2. Tekli Bağlı Liste 4. Temel işlemler: sondaki elemanı sil 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; } 2. Tekli Bağlı Liste 4. Temel işlemler: Bütün düğümleri tara Void Display() { node *p=pHead; while (p!=NULL) { cout<<p->data<<“ “; p=p->next; } } 2. Tekli Bağlı Liste 4. Basic operations: count number of nodes 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; } } 2. Tekli Bağlı Liste 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