Linked List Araya Eleman Ekleme - (Bağlı Listeler araya eleman ekleme)

Bağlı Listeler Araya Eleman Ekleme

Tek Yönlü bağlı listelerde bir diğer ekleme işlemi de araya eleman ekleme işlemidir. Ara demek, başa ya da sona değil de, bu ikisinin dışındaki herhangi bir yere eleman ekleme manasına gelir.

Linked List Araya Eleman Ekleme C Kodu

void arayaEkle(int veri, int deger)
{
    struct node* araya = NULL;
    araya = (struct node*)malloc(sizeof(struct node));
    araya->data = veri;
    struct node* t = NULL;
    t=start;

    while(t->next->data!=deger)
    {
        t = t->next;
    }
    struct node* eskidegerim;
    eskidegerim = t->next;
    t->next = araya;
    araya->next = eskidegerim;

}


Gördüğünüz üzere fonksiyon iki parametre alıyor. Birincisi verimiz, ikinci parametre ise yeni eklenecek sayimizin hangi sayının önüne geleceği. Şöyle anlatayım;

34 ==> 11 ==> 21 ==> 67 ==> 12

Eğer arayaEkle(15,21) değerini gönderirsek, 15 sayısını 21'in olduğu yere ekler.

34 ==> 11 ==> 15 ==> 21 ==> 67 ==> 12

Adım Adım Linked List Araya Eleman Ekleme Anlatımı


struct node* araya = NULL; //bu satırda yeni ekleyeceğimiz düğümü oluşturduk

araya = (struct node*)malloc(sizeof(struct node)); //Yeni oluşturduğumuz düğüm için yer ayırdık

 araya->data = veri; //değerimizi girdik, ama next göstericisini girmedik, çünkü yeri henüz belli değil

struct node* t = NULL; //start değerini tutacağım bir node oluşturdum

t=start; //t'ye startı atadık


 while(t->next->data!=deger)
    {
        t = t->next;
    }

While döngüsü içindeki kritik nokta t->data yerine t->next->data yazmamız, yani her zaman bir öndeki düğümün datasına bakacak. Önüne eklediğimiz değeri bulunca döngüden çıkacak. Sonuç olarak verdiğimiz sayının bir önceki değerini t değerini atamış olacağız

struct node* eskidegerim; // biz şimdi belirttiğimiz sayının önüne düğümü ekleyeceğimiz için eski değeri bir düğümde tutmamız gerekiyor.

eskidegerim = t->next; // bulduğumuz değeri tutmuş olduk

t->next = araya; //yeni sayıyı ekledik

araya->next = eskidegerim; //Yeni sayıdan sonrasını eskidegere atadık. Böylece araya yerleştirmiş olduk.

Bağlı Liste Araya Eleman Ekleme C Kodu


#include<stdio.h>
#include<stdlib.h>

// *************************************
// *************************************
// *************************************
// ****Algoritma Uzmanı*****************
// *************************************
// *************************************
// **algoritmauzmani.blogspot.com*******
// *************************************
// *************************************
// *************************************


//dugum olusturuyoruz
struct node
{
    int data; //düğüm içerisindeki değeri taşıyacak
    struct node *next; // sonraki düğümü gösteren pointer değeri
};

struct node* start = NULL;  // başlangıç düğümü için özel start düğümü
struct node* temp = NULL;  //  Elimizdeki değeri tutmak için geçici olarak kullanacağımız düğüm
struct node* q = NULL;    //   Son düğümü bulmak için kullanacağımız düğüm


// Bu fonksiyon sayesinde sona düğüm ekliyoruz.
void sonaEkle(int veri)
{
    temp = (struct node*)malloc(sizeof(struct node)); // temp düğümü için alan oluşturduk
    temp->data = veri; // Temp düğümüne fonksiyondan aldığımız data değişkenini atadık
    temp->next = NULL; // Temp Düğümü sonraki hiçbir düğümü işaret etmeyecek.

    if(start == NULL) //Eğer Start düğümü NULL ise
        start = temp; //start düğümüne temp düğümünü atıyoruz.
    else
    {
        // Burası tamamen algoritmauzmanı.com adresinde anlattığımız Linked List Traversal işlemi
        q = start;
        while(q->next!=NULL)
        {
            q = q->next;
        }
        q->next = temp; // Son düğümü buluyoruz, onun next pointerına başta oluşturduğumuz temp değerini atıyoruz. Çünkü bu sona atama işlemi.
    }

}

void basaEkle(int veri)
{
    struct node* bas=NULL;
    bas = (struct node*)malloc(sizeof(struct node));
    bas->data = veri;
    bas->next = start;
    start = bas;
}
//Araya Eleman Ekleme Fonksiyonu (aslında düğüm ekleme fonksiyonu)
void arayaEkle(int veri, int deger)
{
    struct node* araya = NULL; //araya eklenecek düğümü oluşturduk (struct olarak)
    araya = (struct node*)malloc(sizeof(struct node)); //araya eklenecek düğüme yer ayırdık
    araya->data = veri;//fonksiyondan aldığımız veri parametresini girdik
    struct node* t = NULL;//t diye bir düğüm daha oluşturduk, buna start değerini atayacağız çünkü orjinal start değerini bozmak istemeyiz
    t=start;//t düğümüne start düğümünü atadık

    while(t->next->data!=deger)//t->next ifadesi x düğümü ise x->data değeri "deger" parametremize eşit olmadığı sürece döngümüz dönecek
    {
        t = t->next; //traverse yapıyoruz
    }
    struct node* eskidegerim; // deger sayısına sahip düğümü elimizde tutmak için bu düğümü oluşturdum
    eskidegerim = t->next; // t->next, önüne ekleyeceğimiz düğümdür
    t->next = araya; //yeni eklediğimiz sayıyı t->next ifadesine atıyoruz.
    araya->next = eskidegerim; //eski degeri bir kaydırmış olduk bu ifadeyle.

    /*
        Daha İyi Anlamanız için **** www.AlgoritmaUzmani.com ****

        15 => 29 => 16 => 77 => 81
        arayaekle(5,77)   5 sayısı 77'nin önüne eklenecek demektir... Yani şöyle olacak 15 => 29 => 16 => 5 => 77 => 81
        araya->data = 5 olur
        t=start demek, t=15'in tutulduğu düğüm demektir. (15 demek değildir)
        t->next->data ifadesi, ilk adımda 29'a karşılık gelir, traverse etmeye buradan başlar.
        Traverse işlemi sonucu 16 sayısının düğümüne gelinir, 77'ye geçilmez, yani t değeri 16'nın tutulduğu düğüm olur
        eskidegerim değişkeni bu senaryoda 77 değerinin tutulduğu düğümdür
        t->next değişkenine 5 değerinin tutulduğu düğüm atanır
        5 düğümünün işaret ettiği düğüm ise eskidegerim yani 77 olur

        Lütfen daha fazlasi icin www.algoritmauzmani.com sitesini ziyaret edin
    */

}

//ekrana linked list elemanlarımızı yazdıran fonksiyon
void yazdir()
{
    q = start;
    while(q->next!=NULL)
    {
        printf("==>%d", q->data);
        q = q->next;
    }
        printf("=>%d", temp->data); //while döngüsüyle elemanları bastırırken son elemanı basmaz, bu yüzden temp değerini ayrı bastırıyorum.
}



int main()
{

    int i, adet, deger, deger1, deger2;
    printf("kac adet bagli liste elemani gireceksiniz?"); //Kullanıcıdan kaç adet değer gireceğini alıyoruz
    scanf("%d", &adet);

    for(i=0; i<adet; i++)
    {
        printf("\n %d. sayiyi girin .... ", i+1);
        scanf("%d", &deger);
        sonaEkle(deger);
    }
    printf("\n");
    yazdir();

    printf("\n basa eklemek istediginizi deger?...");
    scanf("%d", &deger);
    basaEkle(deger);
    yazdir();

    printf("\n araya eklemek istediginizi deger?...");
    scanf("%d", &deger1);
    printf("\n Hangi sayinin onune ekleyeceksiniz?...");
    scanf("%d", &deger2);
    arayaEkle(deger1,deger2);
    yazdir();
    printf("\n ***** www.AlgoritmaUzmani.com *******\n");
    return 0;
}
 

Etiketler: , , ,