Veri Yapıları - Forumkod.com

advertisement
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
Download