Sondaki node bildiğimiz gibi kendisinden sonraki düğümü NULL olarak gösteririr aşağıda fonksiyonun kendisinin her satırının üstünde o satırın ne iş yaptığı yazmaktadır en altta ise önceki derslerle birleştirdiğimiz kodları toplu olarak atıyorum...Functionumuz ;
void removeLastData(){
struct node * temp;
if(head==NULL){
printf("Linked list bos!!");
}
// ilk düğümümüz boş değilse gir
else{
// 2.düğümümüz null değilse gir
if(head->next!=NULL){
// baştaki düğümü geçici oluşturduğumuz düğüme at
temp=head;
// biz sondan önceki elemanı bulmak için aşağıdaki while conditionunu yazdık
while(temp->next->next!=NULL){
temp=temp->next;
}
// sondan önceki elemanı temp değişkenine üstte while döngüsü içinde bulup atadık , aşağıda ise onu bellekten uçuruyoruz yerini boşaltıyoruz
free(temp->next);
// artık sondan önceki elemanımız son eleman olacağı için next'i de NULL gösterir.
temp->next=NULL;
}else{
// eğer ki 2.düğümümüz NULL yani boş ise , yoksa ilk tek bir eleman vardır onu da yukarıda yazdığımız fonksiyonu çağırarak uçuruyoruz :D
removeHeadData();
}
}
}
Birleştirilmiş kodumuz :
#include<stdio.h>
#include<stdlib.h>struct node{
int data;
struct node * next;
};
// ilk dugumumuz
struct node * head=NULL;void addDataToHead(int data){
struct node * temp,*ptr;
ptr=(struct node *) malloc(sizeof(struct node));
ptr->data=data;
if(head == NULL){
// artik ilk dugum ekledigimiz dugum olacak eger ki liste boş ise
head=ptr;
head->next=NULL;
}else{
// ilk elemanımızı gecici pointerimiza atiyoruz cunku bu artik 2.eleman olacak
temp=head;
// ilk elemanımız artık yeni ekledigimiz eleman ptr olacak
head=ptr;
// artık yeni eklediğimiz elemanın next'i gecici yani bizim önceki head'imiz olacak.
ptr->next=temp;
}}
void addData(int data){
// temp gecici node ilerde kullanacagimiz , ptr ise eklenecek eleman
struct node * temp,*ptr;
// bellekten yerimizi ayırıyoruz
ptr=(struct node *) malloc(sizeof(struct node));
// datamizi yeni ekleyeceğimiz elemana aktariyoruz
ptr->data=data;
// head NULL yani eleman hiç yok ise yeni eklenen elemani atiyoruz
if(head == NULL){
head=ptr;
head->next=NULL;
}
// eğer ki eleman varsa
else{
temp=head;
// en son düğümü buluyoruz
while(temp->next!=NULL){
temp=temp->next;
}
// son eleman yeni eklenen eleman ptr'ı gösterecek
temp->next=ptr;
// ptr son eleman olduğu için NULL gösterecek.
ptr->next=NULL;
}
}void addToLocation(int locationData,int data){
struct node *temp,*ptr;
// bellekte yer ayırıyoruz
ptr=(struct node *) malloc (sizeof(struct node));
// datamızı aktarıyoruz
ptr->data=data;
// eğer ki ilk baştaki elemanın data'sından önce eklenecekse başa eleman eklemek oluyor o yüzden addDataToHead çağrıldı
if(head!=NULL && head->data == locationData){
addDataToHead(data);
}else{
// temp'e ilk düğümü attık
temp=head;
// artık ilk düğümden sonraki diğer düğümlerin datasını kontrol ediyoruz.Eşit olana kadar dön
while(temp->next->data != locationData){
temp=temp->next;
}
// ekleyeceğimiz elemanın next'i de temp ile bulunan elemandan hemen sonraki elemanı gösterir çünkü araya ekledik.
ptr->next=temp->next;
// bulunan eleman ekleyeceğimiz elemandan önce olacağı için next'i de ptr'ı gösterir
temp->next=ptr;
}
}
void removeHeadData()
{
struct node *temp;if(head==NULL){
printf("Linked list bos!!");
}else{
// baş düğümünden sonraki gelen düğüm artık ilk düğüm olacağı için sonraki düğümü(2.sıradaki düğüm 1.sıraya geçecek) ikinci düğümü geçici düğüme at
temp=head->next;
// ilk düğümü uçur/çıkar bellekten
free(head);
// artık ilk eleman geçiçi düğümdeki 2.düğüm olacak head'e ata
head=temp;
}
}void removeLastData(){
struct node * temp;
if(head==NULL){
printf("Linked list bos!!");
}
// ilk düğümümüz boş değilse gir
else{
// 2.düğümümüz null değilse gir
if(head->next!=NULL){
// baştaki düğümü geçici oluşturduğumuz düğüme at
temp=head;
// biz sondan önceki elemanı bulmak için aşağıdaki while conditionunu yazdık
while(temp->next->next!=NULL){
temp=temp->next;
}
// sondan önceki elemanı temp değişkenine üstte while döngüsü içinde bulup atadık , aşağıda ise onu bellekten uçuruyoruz yerini boşaltıyoruz
free(temp->next);
// artık sondan önceki elemanımız son eleman olacağı için next'i de NULL gösterir.
temp->next=NULL;
}else{
// eğer ki 2.düğümümüz NULL yani boş ise , yoksa ilk tek bir eleman vardır onu da yukarıda yazdığımız fonksiyonu çağırarak uçuruyoruz :D
removeHeadData();
}
}
}void display(){
struct node *temp;
if(head == NULL){
printf("List bos!!");
}
else{
temp=head;
printf("\n");
while(temp->next!=NULL){
printf("%d\t",temp->data);
temp=temp->next;
}
printf("%d",temp->data);
}}
int main(){
int choice,data,location;
while(1){
printf("\n1)Sona Ekle\n2)Basa Ekle\n3)Araya Eleman Ekle\n4)Bastan Eleman Sil\n5)Sondan Eleman Sil\n6)Verileri Goruntule\nSeciminizi giriniz : ");
scanf("%d",&choice);
switch(choice){
case 1: printf("Data degerini giriniz : ");scanf("%d",&data);addData(data);break;
case 2: printf("Data degerini giriniz : ");scanf("%d",&data);addDataToHead(data);break;
case 3: printf("Hangi elemandan önce : ");scanf("%d",&location);printf("Datayi giriniz : ");scanf("%d",&data);addToLocation(location,data);break;
case 4: removeHeadData();break;
case 5: removeLastData();break;
case 6: display();break;
}
}
return 0;
}