Aşağıda baştan ve sondan eleman silmek için fonksiyonlarımız bulunmakta : Yorumlarda her şey belirtildi.
void bastanElemanSil(){
if(head==NULL){
printf("List is empty!!\n");
}else if(head->next==head){
head=NULL;
free(head);
}else{
//2.düğümümüzü temp'e attık
temp=head;
// son düğümü bulacaz.
while(temp->next!=head){
temp=temp->next;
}
// artık son düğümden sonraki düğüm artık 2.düğümümüzü gösterecek çünkü 2.düğüm artık 1.düğüm olacak
temp->next=head->next;
// 1.düğümü uçurduk bellekten
free(head);
// artık 2.düğümümüzü 1.düğüm yaptık
head=temp->next;
}
}void sondanElemanSil(){
if(head==NULL){
printf("List is empty!!!\n");
}else{
// eğer ki 1 düğüm tek varsa bastanElemanSil fonksiyonunu çağırdık direk
if(head->next==head){
bastanElemanSil();
}
// eğer ki 1'den fazla düğüm var ise :
else{
// baştaki düğümü geçici düğüme attık
temp=head;
// sondan bir önceki düğümü bulduk çünkü artık o bizim son düğümümüzü olacak ve
while(temp->next->next!=head){
temp=temp->next;
}
// son düğümü bellekten uçuruyoruz
free(temp->next);
// sondan bir önceki düğümümüzü temp'e atmıştık while içerisinde ve sonraki düğümü artık baştaki düğümü gösterecek
temp->next=head;
}
}}
Önceki dersle kodların birleştirildiği durum :
#include<stdio.h>
#include<stdlib.h>
struct Node {
int data;
struct Node * next;
};struct Node * head=NULL;
struct Node * temp=NULL;void basaElemanEkle(int data){
// eklenecek düğüm için bellekten yer ayırıyoruz
struct Node * ptr;
ptr = (struct Node * ) malloc (sizeof(struct Node));
// datamızı aktarıyoruz
ptr->data=data;
// eğer ki başta düğüm yok ise
if(head==NULL){
// baştaki düğümümüz yeni eklenecek düğüm olacak ve
head=ptr;
// next'i kendisini gösterecek circular linked list olduğu için
ptr->next=ptr;
}
// başta düğüm var ise
else{
// baştaki düğümü geçici düğümümüze atıyoruz çünkü
temp=head;
// sondaki düğümü bulabilmek için ve while'de sondaki düğümü de temp'e atıyoruz
while(temp->next!=head){
temp=temp->next;
}
// artık yeni eklediğimiz node'nin next'i şuan baştaki node'yi gösterecek
ptr->next=head;
// sondaki düğümün next'i yeni eklediğimiz boştaki düğümü gösterecek
temp->next=ptr;
// ve baştaki düğümümüz artık yeni eklediğimiz düğüm olan ptr olacak
head=ptr;
}}
void sonaElemanEkle(int data){
// eklenecek düğüm için bellekten yer ayırıyoruz
struct Node * ptr;
ptr = (struct Node * ) malloc (sizeof(struct Node));
// datamızı aktarıyoruz
ptr->data=data;
// eğer ki başta düğüm yok ise
if(head==NULL){
// sondaki düğümümüz yeni eklenecek düğüm olacak ve
head=ptr;
// next'i kendisini gösterecek circular linked list olduğu için
ptr->next=ptr;
}
// başta düğüm var ise
else{
// baştaki düğümü geçici düğümümüze atıyoruz çünkü
temp=head;
// sondaki düğümü bulabilmek için ve while'de sondaki düğümü de temp'e atıyoruz
while(temp->next!=head){
temp=temp->next;
}
// artık yeni ekleyeceğimiz düğümümüz şuan sondaki düğüm olan temp'in next'i yani baştaki düğümü gösterecek
ptr->next=temp->next;
// ve temp düğümümüz sondaki düğüm artık yeni eklenen ptr düğümünü gösterecek çünkü ptr artık son düğüm oldu.
temp->next=ptr;
}}
void bastanElemanSil(){
if(head==NULL){
printf("List is empty!!\n");
}else if(head->next==head){
head=NULL;
free(head);
}else{
//2.düğümümüzü temp'e attık
temp=head;
// son düğümü bulacaz.
while(temp->next!=head){
temp=temp->next;
}
// artık son düğümden sonraki düğüm artık 2.düğümümüzü gösterecek çünkü 2.düğüm artık 1.düğüm olacak
temp->next=head->next;
// 1.düğümü uçurduk bellekten
free(head);
// artık 2.düğümümüzü 1.düğüm yaptık
head=temp->next;
}
}void sondanElemanSil(){
if(head==NULL){
printf("List is empty!!!\n");
}else{
// eğer ki 1 düğüm tek varsa bastanElemanSil fonksiyonunu çağırdık direk
if(head->next==head){
bastanElemanSil();
}
// eğer ki 1'den fazla düğüm var ise :
else{
// baştaki düğümü geçici düğüme attık
temp=head;
// sondan bir önceki düğümü bulduk çünkü artık o bizim son düğümümüzü olacak ve
while(temp->next->next!=head){
temp=temp->next;
}
// son düğümü bellekten uçuruyoruz
free(temp->next);
// sondan bir önceki düğümümüzü temp'e atmıştık while içerisinde ve sonraki düğümü artık baştaki düğümü gösterecek
temp->next=head;
}
}}
void listele(){
if(head==NULL){
printf("List is empty!!\n");
}else{
temp=head;
printf("\n****************************************\n");
while(temp->next!=head){
printf("%d\t",temp->data);
temp=temp->next;
}
printf("%d\t",temp->data);
printf("\n****************************************\n");
}
}
int main(){
int data,choice;
while(1){
printf("1)Basa 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;
}