Baştan düğüm silerken düşünülmesi gereken senaryo şudur : 2.düğümümüz artık 1.düğüm olacak ve 2.düğümümüzün prev'i artık sondaki düğümü gösterecek ve sondaki düğümümüzün nexti artık 2.düğümümüzü gösterecek.
Sondan eleman silerken ise sondan önceki düğümümüzün nexti artık baştaki düğümü baştaki düğümüz prev'i ise artık sondan önceki düğümü gösterecek.
void bastanElemanSil(){
if(head==NULL){
printf("List is empty!!\n");
}
// eğer ki sadece tek bir düğüm var ise:
else if(head->next==head){
// baştaki buluyoruz NULL'a atıyoruz
head=NULL;
// ve bellekten uçuruyoruz....
free(head);
}
// birden fazla düğüm var ise
else{
temp=head;
// sondaki düğümü buluyoruz
while(temp->next!=head){
temp=temp->next;
}
// artık sondaki düğüm baştaki düğümden sonraki düğüm olan 2.düğümü gösterecek
temp->next=head->next;
// 2.düğümün prev'i sondaki düğümü gösterecek ve head'i boşa salcaz.
head->next->prev=temp;
// baştaki düğümü uçurduk
free(head);
// artık sondaki düğümden sonraki düğümümüz bizim baştaki düğümümüz olacak.
head=temp->next;
}
}void sondanElemanSil(){
if(head==NULL){
printf("List is empty!!");
}
// sadece tek bir düğüm var ise :
else if(head->next==head){
head=NULL;
free(head);
}
// birden fazla düğüm var ise
else{
temp=head;
// sondaki düğümden önceki düğümü buluyoruz
while(temp->next->next!=head){
temp=temp->next;
}
// sondaki düğümü uçuruyoruz..
free(temp->next);
// sondaki düğümden önceki düğümümüz artık baştaki düğümü gösterecek çünkü son düğüm oldu.
temp->next=head;
// baştaki düğümümüz de artık temp'i gösterecek.
head->prev=temp;
}
}
İlk ders ile birlikte kodların bütünü...
#include<stdio.h>
#include<stdlib.h>
// Double circular linked list
struct Node {
int data;
struct Node * prev;
struct Node * next;
};
struct Node * head=NULL;
struct Node * temp=NULL;void basaElemanEkle(int data){
// eklenecek düğüm için bellekten yer ayırdık
struct Node * ptr = (struct Node *) malloc (sizeof(struct Node));
// düğümün datasına değerimizi aktardık
ptr->data=data;
// eğer ki listede hiç eleman yok ise
if(head==NULL){
// bellekten yer ayrılan düğümün önceki düğümü de kendisini
ptr->prev=ptr;
// sonraki de kendisini gösterir çünkü tek eleman olacak
ptr->next=ptr;
// artık ilk elemanımız eklenen ptr oldu
head=ptr;
}
// eğer ki listede eleman var ise
else{
// head düğümü temp'e atandı
temp=head;
// sondaki düğümü buluyoruz
while(temp->next!=head){
temp=temp->next;
}
// sondaki düğümün next'i yeni eklenen elemanı gösterecek
// baştaki düğümün prev'i artık yeni eklenen elemanı gösterecek çünkü eklenen eleman baş düğüm olcak
temp->next=head->prev=ptr;
// yeni eklenen eleman önceki baş düğümü gösterecek çünkü önceki baş düğüm head
ptr->next=head;
// şimdi baş düğümümüz ptr oldu.
head=ptr;
}
}
void sonaElemanEkle(int data){
struct Node * ptr = (struct Node * ) malloc (sizeof(struct Node));
ptr->data=data;
if(head==NULL){
basaElemanEkle(data);
}else{
// ilk düğümü geçici düğüme atadık
temp=head;
// sondaki düğümü bulduk
while(temp->next!=head){
temp=temp->next;
}
// şuanda ki sondaki düğümün next'i artık baştaki düğümü değil sona yeni eklenecek düğümü gösterecek
temp->next=ptr;
// artık sona eklenecek ptr'ın next'i baştaki düğümü gösterecek
ptr->next=head;
// baştaki düğümün önceki değeri artık sona eklenen yeni ptr'ı gösterecek.
head->prev=ptr;
}}
void bastanElemanSil(){
if(head==NULL){
printf("List is empty!!\n");
}
// eğer ki sadece tek bir düğüm var ise:
else if(head->next==head){
// baştaki buluyoruz NULL'a atıyoruz
head=NULL;
// ve bellekten uçuruyoruz....
free(head);
}
// birden fazla düğüm var ise
else{
temp=head;
// sondaki düğümü buluyoruz
while(temp->next!=head){
temp=temp->next;
}
// artık sondaki düğüm baştaki düğümden sonraki düğüm olan 2.düğümü gösterecek
temp->next=head->next;
// 2.düğümün prev'i sondaki düğümü gösterecek ve head'i boşa salcaz.
head->next->prev=temp;
// baştaki düğümü uçurduk
free(head);
// artık sondaki düğümden sonraki düğümümüz bizim baştaki düğümümüz olacak.
head=temp->next;
}
}void sondanElemanSil(){
if(head==NULL){
printf("List is empty!!");
}
// sadece tek bir düğüm var ise :
else if(head->next==head){
head=NULL;
free(head);
}
// birden fazla düğüm var ise
else{
temp=head;
// sondaki düğümden önceki düğümü buluyoruz
while(temp->next->next!=head){
temp=temp->next;
}
// sondaki düğümü uçuruyoruz..
free(temp->next);
// sondaki düğümden önceki düğümümüz artık baştaki düğümü gösterecek çünkü son düğüm oldu.
temp->next=head;
// baştaki düğümümüz de artık temp'i gösterecek.
head->prev=temp;
}
}
void listele(){
if(head==NULL){
printf("List is empty!!");
}else{
temp=head;
while(temp->next!=head){
printf("%d\t",temp->data);
temp=temp->next;
}
printf("%d\n",temp->data);
}
}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("Seciminiz : ");
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;
}