1~

Minter Coder's Blog

Veri Yapıları & Algoritmalar Stack (Yığın) 2 - Dynamic

2022-05-25

Dizi yerine bağlı listeleri de ayrıca kullanabiliriz.Bağlı liste belleği dinamik olarak ayırır.Dizideki gibi sadece eleman sayımızın sabit olmasına gerek yok eleman eklersek boyut artar eleman çıkartırsak boyut azalır.

 

Aşağıda C yorumlarla birlikte kodu verilmiştir.

 

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

struct Node {
    int data;
    struct Node * next;
};

struct Node * top=NULL;
struct Node * temp=NULL;

void push(int data){
    struct Node * ptr = (struct Node * ) malloc (sizeof(struct Node));
    ptr->data=data;
    // eğer ki en üstte değer yok ise
    if(top==NULL){
        // ilk elemanımız NULL'ı gösterir
        ptr->next=NULL;
        // en üst elemanımız ilk eleman olmuş olur
        top=ptr;
    }
    // eğer ki eleman var ise
    else{
        // en üste ekleyeceğimiz değer alt değeri gösterir
        ptr->next=top;
        // artık en üstteki değer ptr olur
        top=ptr;
    }
}

void pop(){
    // eğer ki hiç eleman yok ise
    if(top==NULL){
        printf("Stack is empty!!");
    }
    // tek bir eleman var ise
    else if(top->next==NULL){
        top=NULL;
        free(top);
    }
    // birden fazla eleman var ise
    else{
        // top'tan önceki elemanı temp'e ata
        temp=top->next;
        // en üstteki elemanı uçur
        free(top);
        // en üstteki eleman artık top'tan önceki eleman olan temp değerine sahip olur.
        top=temp;
    }
    
}

void listele(){
    if(top==NULL){
        printf("Stack is empty!!");
    }else{
        temp=top;
        printf("\n");
        while(temp->next!=NULL){
            printf("%d\t",temp->data);
            temp=temp->next;
        }
        printf("%d",temp->data);
    }

}

int main(){
    int choice,data;
    while(1){
        printf("1)Eleman Ekle\n");
        printf("2)Eleman Çıkar\n");
        printf("Secim : \n");
        scanf("%d",&choice);
        switch(choice){
            case 1:
            printf("Data : ");
            scanf("%d",&data);
            push(data);
            listele();
            break;
            case 2:
            pop();
            listele();
            break;
        }
        
    }
    
    return 0;    
}