Arkadaşlar baştan düğüm silerken 2.düğümümüz bizim artık 1.düğümümz olacak bunu dikkate alalım ve son olarak da sondan düğümü silmek için ise sondan önceki düğümü buluyoruz çünkü o artık bizim son düğümümüz olacak bütün kodlar aşağıda yorumlarla birlikte düzenli bir şekilde verilmiş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;
}}
void bastanElemanSil(){
if(head==NULL){
printf("List is empty!!\n");
}else if(head->next==NULL){
head=NULL;
free(head);
}else{
// 2.düğümü temp'e attık
temp=head->next;
// baştaki elemanı uçurduk
free(head);
// 2.düğümümüz 1.düğüm oldu ilk düğümün prev'i NULL'u gösteriyor
temp->prev=NULL;
// head'e ilk 2.düğümümüzü artık atadık 1.düğümümüz oldu.
head=temp;
}
}void sondanElemanSil(){
struct Node * ptr;
if(head==NULL){
printf("List is empty!!\n");
}else if(head->next==NULL){
// tek eleman var ise
bastanElemanSil();
}else{
temp=head;
// sondan bir önceki düğümü buluyoruz.Çünkü artık o son düğüm olacak
while(temp->next->next!=NULL){
temp=temp->next;
}
// Son eleman
ptr=temp->next;
// uçtu
free(ptr);
// son düğüm null gösterir.
temp->next=NULL;
}
}
//Listeleme işlemini yapıyoruz.
void listele(){
if(head==NULL){
printf("!!!!List is empty!!\n");
}
else{
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("3)Baştan eleman sil\n");
printf("4)Sondan eleman sil\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;
case 3:bastanElemanSil();listele();break;
case 4:sondanElemanSil();listele();break;
}
}
return 0;}