Bağlı Liste Eleman Ekleme ve Çıkarma İşlemleri C kodu

linked list hazır c kodu
c ile ilgili bir resim
Bu yazıda size kocaman bir proje sunuyoruz. İçerisinde Linked List Temel İşlemler konularına dair her şey var. Neler mi var?

Linked List Sona Eleman Ekleme C Kodu
Linked List Başa Eleman Ekleme C Kodu
Linked List Araya Eleman Ekleme C Kodu
Linked List Baştan Eleman Silme C Kodu
Linked List Aradan Eleman Silme C Kodu
Linked List Sondan Eleman Silme C Kodu.

Tüm Bunların yanında yazdırma işlemleri için linked list elemanlarını ekrana yazdıran c kodu ve menü işlemlerini halleden bir menü fonksiyonu bulunuyor. Bununla da bitmiyor, her satıra (neredeyse!) yorum satırı ekliyoruz. Temel amacımız size kod vermek değil, kodun nasıl yazıldığını anlamanızı sağlamak.

Unutmayın! Algoritma Uzmanı asla sağdan soldan kod araklayıp size sunmaz. Kodlarımızı kendimiz yazıyor, o kodla ilişkili olan her işlemin makalesini zaten yazıyoruz. Algoritmanın anlaşılması temel hedefimiz.

Linked List Eleman Ekleme ve Silme İşlemi C Kodu


 

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

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


// Linked List Dugumlerimiz asagidaki struct yapisini kullanacaktir
struct node
{
    int data;
    struct node *next;
};
// start degeri baslangic dugumu icindir
// temp degeri gecici olarak kullanacagimiz dugumler icindir
// q start degerini atamak icin sonradan kullanacagim dugumdur
struct node* start = NULL;
struct node* temp = NULL;
struct node* q = NULL;


// Linked List elemanlarinin sonuna veri ekler. Gonderilen parametre deger olarak eklenir
void sonaEkle(int veri)
{
    //fonksiyona gonderilen verinin tutulacagi dugumu olusturduk.
    temp = (struct node*)malloc(sizeof(struct node));
    temp->data = veri;
    //sona ekleme islemi yapacagimiz icin NULL verdik
    temp->next = NULL;

    //Eger Dugume ilk kez eleman ekliyorsak, ilk ekledigimiz dugum start degeri olur
    if(start == NULL)
        start = temp;
    else
    {
        // Linked List Traverse işlemi yapılmış, son düğüm bulunmuştur. Son düğümün önüne yeni düğüm eklenmiştir.
        q = start;
        while(q->next!=NULL)
        {
            q = q->next;
        }
        q->next = temp;
    }

}

// Linked List Başa Eleman Ekleme Fonksiyonudur. Gönderilen Veriyi Başa Ekler
void basaEkle(int veri)
{
    // Basa eklenecek düğüm için node oluşturduk
    struct node* bas=NULL;
    bas = (struct node*)malloc(sizeof(struct node));
    bas->data = veri;
    // Basa Ekleme işleminde ilk eleman ikinci eleman olacaktır.
    bas->next = start;
    start = bas;
}

// Linked List Araya Eleman Ekleme Fonksiyonu 2 parametre alır.
// İlk Parametre eklenecek değer.
// İkinci Parametre ise hangi değerin önüne ekleneceği bilgisidir.
void arayaEkle(int veri, int deger)
{
    //ekleyeceğimiz veri için düğüm oluşturduk
    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;

    /*
        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()
{
    if(start==NULL)
        printf("\nHenuz hic deger girmemissiniz Lutfen 1 degerini secip, deger giriniz\n");
    else
    {
         q = start;
        printf("==>%d", q->data);
        while(q->next!=NULL)
        {

            q = q->next;
            printf("==>%d", q->data);
        }
        printf("\n");
    }
}

// Linked List Sondan Eleman Silen Fonksiyon
void sonSil()
{

    struct node* starticin = (struct node*)malloc(sizeof(struct node));
    starticin = start;
    //starticin degeri sondan bir önceki düğüme eşitlenir
    while(starticin->next->next!=NULL)
    {
        starticin = starticin->next;
    }
    //Sondan bir önceki düğümün next değeri NULL yapılınca son düğüm listeden çıkarılır
    starticin->next = NULL;


}

// Girilen sayıyı siler. Ama unutmayın, sadece aradan silme işlemi yapar.
// Eğer ilk veya son veriyi girerseniz program patlar. Kontrol işlemleri eklenmeli!
void verileniSil(int verilen)
{
    // Başlangıç değerini tutacağımız node (starticin)
    // silinecek düğümden bir önceki düğümü tutacak node (prev)
    // silinecek düğümden bir sonraki düğümü tutacak node (next)
    struct node* starticin = (struct node*)malloc(sizeof(struct node));
    struct node* prev = (struct node*)malloc(sizeof(struct node));
    struct node* next = (struct node*)malloc(sizeof(struct node));
    starticin = start;

    //döngü sonucu verilen değerin tutulduğu düğümden bir önceki düğüm starticin değeri haline gelecek
    while(starticin->next->data!=verilen)
    {
        starticin = starticin->next;
    }
    prev = starticin;
    next = starticin->next->next;
    // Aşağıdaki işlem aradan düğüm çıkartıyor. Bir önceki düğüm artık bir sonraki düğüme işaret ediyor.
    prev->next = next;
    // 1 => 3 => 5  3 düğümü çıkarılırsa 1=>5 olur. Yani prev->data 1 && next->data 5 && starticin->next->data 3
}

// bu fonksiyon baştan eleman siler
void bastanSil()
{
    //ikinci eleman için düğüm oluşturduk
    struct node* birinciolacak = (struct node*)malloc(sizeof(struct node));
    //oluşturduğumuz düğüme start->next değerini atadık. Bu durumda artık ikinci düğüm oldu
    birinciolacak = start->next;
    //start düğümünün kapladığı alanı hafızadan sildik
    free(start);
    //artık start değeri ikinci düğüm oldu. eski ilk değer listeden çıkarıldı.
    start = birinciolacak;


}

//bu fonksiyon sitede ilgili konuya gidebilmeniz icin yazıldı...
void algoritmaUzmani();
// menü için ayrı fonksiyon yazdım. Switch case biliyorsunuz diye umuyorum.
void menu()
{
    int secim,deger;
    while(1==1)
    {
        printf("\n *************** Algoritma Uzmani *****************");
        printf("\n ************www.Algoritma Uzmani.com**************");
        printf("\nYapmak istediginiz islemi secin\n");
        printf("\n1- linked liste eleman ekle(sona eleman ekle\n");
        printf("\n2- linked list basa eleman ekle\n");
        printf("\n3- linked list araya eleman ekle\n");
        printf("\n4- linked list sondan eleman sil(sona eleman ekle\n");
        printf("\n5- linked list aradan eleman sil\n");
        printf("\n6- linked list bastan eleman sil\n");;
        printf("\n7- Konuya Git\n");
        yazdir();
        scanf("%d", &secim);

        switch(secim)
        {
            case 1:
                printf("\nHangi sayiyi eklemek istiyorsunuz? ...");
                scanf("%d", &secim);
                sonaEkle(secim);
                break;
            case 2:
                printf("\nHangi sayiyi eklemek istiyorsunuz? (basa) ...");
                scanf("%d", &secim);
                basaEkle(secim);
                break;
            case 3:
                printf("\nHangi sayiyi eklemek istiyorsunuz? (araya) ...");
                scanf("%d", &secim);
                printf("\nHangi sayinin onune eklemek istiyorsunuz? (araya) ...");
                scanf("%d", &deger);
                arayaEkle(secim,deger);
                break;
            case 4:
                sonSil();
                yazdir();
                break;
            case 5:
                printf("\nHangi sayiyi silmek istiyorsunuz? ...");
                scanf("%d", &secim);
                verileniSil(secim);
                break;
            case 6:
                bastanSil();
                break;
 
            case 7:
                algoritmaUzmani();
                break;

        }
    }
}

// main fonksiyonunda yalnızca menu fonksiyonunu çağırdım. Gerisini menu fonksiyonu hallediyor zaten.
int main()
{
    menu();
    return 0;
}

//sadece ilgili konuya erişim fonksiyonu. diger kodlar ile ilgisi yok
void algoritmaUzmani()
{
     system("C:\\Progra~2\\Google\\Chrome\\Application\\chrome.exe http://www.algoritmauzmani.com/2016/09/linked-list-islemleri.html");
     printf("\n Eger asagida sistem yolu hatasi aliyorsaniz bunu onemsemeyin");
     if(system)
     {
          system("C:\\Progra~1\\Google\\Chrome\\Application\\chrome.exe http://www.algoritmauzmani.com/2016/09/linked-list-islemleri.html");
          if(system)
            system("C:\\Progra~2\\Mozill~1\\firefox.exe http://www.algoritmauzmani.com/2016/09/linked-list-islemleri.html");
            if(system)
                system("C:\\Progra~1\\Mozill~1\\firefox.exe http://www.algoritmauzmani.com/2016/09/linked-list-islemleri.html");
     }
}



Etiketler: , , ,