Belirtilen locationdan düğüm silmek biraz karışık olabilir fakat şöyle düşünebiliriz arkadaşlar örneğin 4 düğüm var 3. düğüm silinecek o zaman bizim 3.düğümü sildikten sonra 4.düğüm 3.düğüm yerine geçer ve 2.düğümümüzün next'i 4.düğümden 3.düğüme geçen node'yi göstermesi gerekir.Aşağıda functionu yazarak yorum satırlarıyla donattım en altta ise önceki derslerle birleştirdiğimiz functionların bütün kodu bulunuyor...
void removeDataFromLocation(int data){
struct node *temp,*ptr;
if(head==NULL){
printf("Linked list is empty");
}else{
// baştaki düğümü geçici düğüme atadık
temp=head;
if(temp->data==data){
removeHeadData();
}
else{
// temp'in önündeki düğümün datası verilen dataya eşit olmadığı sürece döngüye eşit olana kadar gir
while(temp->next->data!=data){
temp=temp->next;
}
// ptr bizim temp'ten sonraki bulduğumuz düğümden sonraki düğümü alır ve bu düğüm silinecek düğümden sonraki düğümdür
ptr=temp->next->next;
// bulunan düğümü uçuruyoruz
free(temp->next);
// artık temp'in nexti bizim bellekten sildiğimiz düğümden sonraki düğümü gösterir
temp->next=ptr;
}
}
}
Kodların birleştirilmiş hali...
#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 removeDataFromLocation(int data){
struct node *temp,*ptr;
if(head==NULL){
printf("Linked list is empty");
}else{
// baştaki düğümü geçici düğüme atadık
temp=head;
if(temp->data==data){
removeHeadData();
}
else{
// temp'in önündeki düğümün datası verilen dataya eşit olmadığı sürece döngüye eşit olana kadar gir
while(temp->next->data!=data){
temp=temp->next;
}
// ptr bizim temp'ten sonraki bulduğumuz düğümden sonraki düğümü alır ve bu düğüm silinecek düğümden sonraki düğümdür
ptr=temp->next->next;
// bulunan düğümü uçuruyoruz
free(temp->next);
// artık temp'in nexti bizim bellekten sildiğimiz düğümden sonraki düğümü gösterir
temp->next=ptr;
}
}
}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)Locationdan Eleman Sil\n7)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: printf("Silinecek data : ");scanf("%d",&location);removeDataFromLocation(location);break;
case 7: display();break;
}
}
return 0;
}