Double Linked List (İkili Bağlantılı Liste): Adından da anlaşılacağı üzere iki tane bağlantı bilgisi vardır.Düğümümüzün iki pointerindan birincisi önceki düğümü(previous pointer) diğeri ise sonraki düğümü gösterir(next pointer).Her zaman ilk nodemizin önceki düğümü(prev pointeri) null , son nodemizin sonraki değeri (next pointeri) null'u gösterir.
C dilindeki kodumuz şöyle olur;
struct Node {
int data;
struct Node * prev;
struct Node * next;
};struct Node * head=NULL;
Bir örnek ile ikili bağlı listeye giriş yapıp eleman eklemek için kodlarımızı görelim , yorum satırları eklenmiştir.
#include<stdio.h>
#include<stdlib.h>
struct Node {
int data;
struct Node * prev;
struct Node * next;
};struct Node * head=NULL;
struct Node * temp=NULL;void basaElemanEkle(int data){
// eklenecek elemani oluşturup bellekte yer ayırıyoruz
struct Node *ptr;
ptr = (struct Node *) malloc ( sizeof(struct Node) );
// verilen datayı da aktardık
ptr->data=data;
// eğer ki başta eleman yok ise
if(head==NULL){
// baştaki elemanimiz yeni eklenecek eleman olur previous pointeri null
ptr->prev=NULL;
// sonraki değeri de null olur çünkü ilk eleman ve son eleman olmuş olur.
ptr->next=NULL;
// baştaki elemana yeni eklenmiş elemanı atıyoruz
head=ptr;
}
// eğer ki başta eleman var ise
else{
// geçici düğümümüze baştaki düğümü atıyoruz.Depolamak için çünkü baştaki eleman artık 2.eleman olcak
temp=head;
// baştaki elemanımızın artık önceki değeri yeni eklenecek eleman olacak
temp->prev=ptr;
// yeni eklenecek elemanın next'i yani sonraki değeri temp'i gösterecek çünkü temp'e atadığımız 1.düğüm artık 2.düğüm oldu
ptr->next=temp;
// baştaki düğümümüz null'u gösterecek.
ptr->prev=NULL;
// baştaki düğüme artık yeni atadığımız düğümü atadık.
head=ptr;
}
}
void sonaElemanEkle(int data){
// eklenecek elemani oluşturup bellekte yer ayırıyoruz
struct Node *ptr;
ptr = (struct Node *) malloc ( sizeof(struct Node) );
// verilen datayı da aktardık
ptr->data=data;
if(head==NULL){
// baştaki elemanimiz yeni eklenecek eleman olur previous pointeri null
ptr->prev=NULL;
// sonraki değeri de null olur çünkü ilk eleman ve son eleman olmuş olur.
ptr->next=NULL;
// baştaki elemana yeni eklenmiş elemanı atıyoruz
head=ptr;
}
// eğer ki başta eleman var ise
else{
// geçici düğümümüze baştaki düğümü atıyoruz.
temp=head;
Tek tek düğümleri dolaşıp son düğümü buluyoruz.
while(temp->next!=NULL){
temp=temp->next;
}
// artık temp son düğümmüz oldu bunun next'i artık yeni sona eklenen düğüm olan ptr'i gösterecek
temp->next=ptr;
// ptr son düğüm olduğu için previous pointeri temp'i gösterecek
ptr->prev=temp;
// son düğümün next pointeri de null'u gösterecek.
ptr->next=NULL;
}}
//Listeleme işlemini yapıyoruz.
void listele(){
temp=head;
printf("\n*******************************\n");
while(temp->next!=NULL){
printf("%d\t",temp->data);
temp=temp->next;
}
printf("%d",temp->data);
printf("\n*******************************\n");
}
int main(){
int choice,data;
while(1){
printf("1)Başa Eleman Ekle\n");
printf("2)Sona Eleman Ekle\n");
printf("Seçiminiz : ");
scanf("%d",&choice);
switch(choice){
case 1:printf("Data : ");scanf("%d",&data);basaElemanEkle(data);listele();break;
case 2:printf("Data : ");scanf("%d",&data);sonaElemanEkle(data);listele();break;
}
}
return 0;}