Linked List

Kategori: C , 04 Temmuz 2019 , JanFranco


Linked list denen veri yapısında, her bir obje, bir sonraki objeyi işaret eder. Yani veri yapısındaki tüm objeler, nesneler, veriler sırayla bağlıdır. Bu yazımızda normal bir linked list implemente edeceğiz ancak farklı linked list türleri de mevcut. İlk olarak bir struct oluşturalım. Bu struct'ta bir öğrenci numarası, bir öğrenci ismi ve bir öğrenci soyismi olsun. Bir de bir sonraki objeyi göstereceğimiz için bir next pointer olsun:


struct node{
    int no;
    char *name;
    char *surname;
    struct node *next;
};
Listeye veri eklemek için bir fonksiyon yazalım. Fonksiyon parametre olarak no, isim, soyisim ve listenin head objesini alacak. Fonksiyonda bir s objesi oluşturalım ve parametre olarak verilen değerleri s objesinde tutalım. Daha sonra head objesini gösterecek bir pointer tanımlayalım ve bu pointerın gösterdiği objenin next objesi NULL değilse, bir sonraki objeyi gösterelim. Göstereceğimiz objenin bir sonraki objesi yani next objesi NULL ise devam etmeyi keselim ve NULL olan next objesine, s objesini göster diyelim:

struct node *add_to_list(struct node *head, int no, char *name, char *surname){
    struct node *s = malloc(sizeof(struct node));
    s->no = no;
    s->name = name;
    s->surname = surname;
    s->next = NULL;

    struct node *t = head;

    if(t == NULL){
        return s;
    }

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

    t->next = s;
    return s;
};
Listeden obje silmek için bir fonksiyon yazalım. Ekleme fonksiyonundan farklı olarak prev adında bir pointer tanımlayalım. Listenin sonuna giderken prev pointer'ı t objesini göstersin. Bu şekilde yaparsak, t her bir döngüde bir sonraki objeyi gösterirken, prev pointer'ı t objesinin bir öncesini gösterecek. Gösterdiğimiz objenin no değeri, parametre olarak gönderilen no değerine eşit olduğunda, prev objesinin next değeri, t objesinin next değerini gösterecek ve aradaki t objesi bellekten silinecektir:

void delete_from_list(struct node *head, int no){
    struct node *t = head;
    struct node *prev;

    if(t != NULL && t->no == no){
        head = t->next;
    }

    while(t != NULL){
        prev = t;
        t = t->next;
        if(t->no == no){
            break;
        }
    }

    prev->next = t->next;
    free(t);
}
Listede eleman arayan ve bulduğunda elemanı döndüren bir fonksiyon yazalım:

struct node *search_in_the_list(struct node *head, int no){
    struct node *t = head;
    while(t != NULL){
        if(t->no == no){
            return t;
        }
        t = t->next;
    }

    return NULL;
};
Listedeki objeleri ekrana bastıracak bir fonksiyon yazalım:

void display_the_list(struct node *head){
    struct node *t = head;
    while(t != NULL){
        printf("NO = %d\nNAME = %s\nSURNAME = %s\n\n", t->no, t->name, t->surname);
        t = t->next;
    }
}
Bu fonksiyonları main fonksiyonunda kullanalım. İlk olarak head pointer'ı tanımlayalım ve değerini NULL yapalım. Daha sonra bu head pointer'ı ilk elemanı göstersin. Daha sonra listeye eleman eklemeye devam edelim:

int main() {
    struct node *head = NULL;

    head = add_to_list(head, 1, "Jan", "Franco");
    add_to_list(head, 2, "Jane", "Franco");
    add_to_list(head, 3, "John", "Silver");
    add_to_list(head, 4, "Captain", "Flint");
    display_the_list(head);

    struct node *searched = NULL;
    searched = search_in_the_list(head, 13);
    if(searched != NULL){
        printf("Student FOUND!\nNO = %d\nNAME = %s\nSURNAME = %s\n\n", searched->no, searched->name, searched->surname);
    }
    else{
        printf("Student NOT FOUND!\n\n");
    }

    delete_from_list(head, 3);
    display_the_list(head);

    return 0;
}
Kodların tamamı:

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

struct node{
    int no;
    char *name;
    char *surname;
    struct node *next;
};

struct node *add_to_list(struct node *head, int no, char *name, char *surname){
    struct node *s = malloc(sizeof(struct node));
    s->no = no;
    s->name = name;
    s->surname = surname;
    s->next = NULL;

    struct node *t = head;

    if(t == NULL){
        return s;
    }

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

    t->next = s;
    return s;
};

void delete_from_list(struct node *head, int no){
    struct node *t = head;
    struct node *prev;

    if(t != NULL && t->no == no){
        head = t->next;
    }

    while(t != NULL){
        prev = t;
        t = t->next;
        if(t->no == no){
            break;
        }
    }

    prev->next = t->next;
    free(t);
}

struct node *search_in_the_list(struct node *head, int no){
    struct node *t = head;
    while(t != NULL){
        if(t->no == no){
            return t;
        }
        t = t->next;
    }

    return NULL;
};

void display_the_list(struct node *head){
    struct node *t = head;
    while(t != NULL){
        printf("NO = %d\nNAME = %s\nSURNAME = %s\n\n", t->no, t->name, t->surname);
        t = t->next;
    }
}

int main() {
    struct node *head = NULL;

    head = add_to_list(head, 1, "Jan", "Franco");
    add_to_list(head, 2, "Jane", "Franco");
    add_to_list(head, 3, "John", "Silver");
    add_to_list(head, 4, "Captain", "Flint");
    display_the_list(head);

    struct node *searched = NULL;
    searched = search_in_the_list(head, 13);
    if(searched != NULL){
        printf("Student FOUND!\nNO = %d\nNAME = %s\nSURNAME = %s\n\n", searched->no, searched->name, searched->surname);
    }
    else{
        printf("Student NOT FOUND!\n\n");
    }

    delete_from_list(head, 3);
    display_the_list(head);

    return 0;
}


Sonraki Yazı: Stack
Yorumlar

Henüz bir yorum bulunmuyor.
Yorum bırakın