Stack(Yığın)

Stack(yığın), aynı türden verilerin bulunduÄŸu lineer(doÄŸrusal) bir veri yapısıdır. Stack, Son Giren İlk Çıkar (Last In First Out - LIFO) ÅŸekilinde çalışır yani stack'a eklenen son ögenin ilk kaldırıldığı anlamına gelir. 



Last In First Out (LIFO):

Bu strateji, son eklenen ögenin ilk çıkarılacağını belirtir. Gerçek hayattan bir örnek olarak üst üste yerleştirilmiş tabak yığını düşünülebilir. En son koyduğumuz tabak en üsttedir ve en üstteki tabağı çıkardığımızda, en son konan tabak ilk çıkar diyebiliriz.


Eğer en alttaki tabağı istiorsak, önce üstteki tüm tabakları çıkartmamız gerekir. Stack(yığın) veri yapısı tam olark böyle çalışır.

Stack LIFO Prensibi

Programlama terimlerinde, bir öğeyi stack'ın üstüne koymaya push, bir öğeyi kaldırmaya ise pop denir.


Görselde, 3. öğe en sonda kalmasına rağmen, ilk olarak kaldırılmıştır.

Stack'ın Temel İşlemleri

Bir stack üzerinde farklı eylemler gerçekleştirmemizi sağlayan bazı temel işlemler vardır.

push: Bir stack'ın üstüne bir eğe ekler
pop: Bir stack'ın tepesinden bir öğeyi kaldırma
IsEmpty: Stack'ın boş olup olmadığını kontrol eder
IsFull: Stack'ın dolu olup olmadığını kontrol eder
peek: Üst öğenin değerini kaldırmadan alma

Stack Türleri

Register Stack(Kayıt Yığını)

Bu tür bir stack aynı zamanda bellek biriminde bulunan bir bellek öğesidir ve yalnızca az miktarda veriyi iÅŸleyebilir. Register stack'nın boyutu belleÄŸe kıyasla çok küçük olduÄŸundan, register stack'nın yüksekliÄŸi her zaman sınırlıdır. 

Memory Stack(Bellek Yığını)

Bu tür bir stack, büyük miktarda bellek verisini işleyebilir. Memort stack'nın yüksekliği, büyük miktarda bellek verisi kapşadığından esnektir.

Stack Uygulaması

1. Dizi Kullanarak

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

// stack'ı temsil edecek bir struct
struct Stack{
int top;
unsigned capacity;
int* array;
};

// verilen kapasitede bir stack oluşturma. Stack boyutu 0 olarak başlatılır
struct Stack* createStack(unsigned capacity){
struct Stack* stack = (struct Stack*) malloc(sizeof(struct Stack));
stack->capacity = capacity;
stack->top = -1;
stack->array = (int*) malloc(stack->capacity*sizeof(int));
return stack;
}

// top son indekse eşit olduğında stack dolu
int isFull(struct Stack* stack){
return stack->top == stack->capacity - 1;
}

// top -1'e eÅŸit olduÄŸunda stack boÅŸtur
int isEmpty(struct Stack* stack){
return stack->top == -1;
}

// Stack'a bir öğe ekleme, top'u 1 artırır
void push(struct Stack* stack,int item){
if(isFull(stack)) return;
stack->array[++stack->top] = item;
printf("%d stack'a eklendi\n",item);
}

// Stack'tan bir öğe kaldırma, top 1 azaltılır.
int pop(struct Stack* stack){
if (isEmpty(stack)) return INT_MIN;
return stack->array[stack->top--];
}

// üst kısmı çıkarmadan stack'ı döndürme
int peek(struct Stack* stack){
if(isEmpty(stack)) return INT_MIN;
return stack->array[stack->top];
}

int main(){
struct Stack* stack = createStack(5);
push(stack,10);
push(stack,40);
push(stack,20);
push(stack,50);

printf("%d stack'tan kaldirildi\n",pop(stack));
return 0;
}
Çıktı:


Dizi Kullanmanın Avantajları:

  • Uygulaması kolay.

Dizi Kullanmanın Dezavantajları:

  • Dinamik deÄŸildir, yani çalışma zamanında ihtiyaca göre büyüyüp küçülmez.
  • Stack'ın toplam boyutu önceden tanımlanır.

2. Linked List Kullanarak

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

// stack'ı temsil edecek bir struct
struct StackNode{
int data;
struct StackNode* next;
};

struct StackNode* newNode(int data){
struct StackNode* stackNode = (struct StackNode*) malloc(sizeof(struct StackNode));
stackNode->data = data;
stackNode->next = NULL;
return stackNode;
}

int isEmpty(struct StackNode* root){
return !root;
}

void push(struct StackNode** root, int data){
struct StackNode* stackNode = newNode(data);
stackNode->next = *root;
*root = stackNode;
printf("%d stack'a eklendi\n",data);
}

int pop(struct StackNode** root){
if(isEmpty(*root)) return INT_MIN;
struct StackNode* temp = *root;
*root = (*root)->next;
int popped = temp->data;
free(temp);

return popped;
}

int peek(struct StackNode* root){
if(isEmpty(root)) return INT_MIN;
return root->data;
}

int main(){
struct StackNode* root = NULL;

push(&root,10);
push(&root,40);
push(&root,20);
push(&root,50);

printf("%d stack'tan kaldirildi\n",pop(&root));
printf("En ustteki eleman %d\n", peek(root));

return 0;
}
Çıktı:



Linked List Kullanmanın Avantajları:

  • Dinamiktir, yani çalışma zamanındaki ihtiyaçlara göre büyüyebilir ve küçülebilir.


Linked List Kullanmanın Dezavantajları:

  • Pointer'ların dahil olması nedeniyle ekstra bellek gerektirir.
  • Stack içinde rastgele eriÅŸim mümkün deÄŸildir.


Kaynaklar:
https://www.geeksforgeeks.org/introduction-to-stack-data-structure-and-algorithm-tutorials/
https://www.digitalocean.com/community/tutorials/stack-in-c
https://www.programiz.com/dsa/stack
https://www.tutorialspoint.com/data_structures_algorithms/stack_program_in_c.htm
 EN:
This article, we converted a 2D array to a 1D array in the c programming language. We did this using a for loop.

TR:
Bu yazımızda, c programlama dilinde 2D diziyi 1D diziye dönüştürdük. Bu işlemi for döngüsü kullanarak gerçekleştirdik.
#include <stdio.h>
#define m 3
#define n 4
int main() {
int arr1d[m*n];
int arr[m][n]={{1,3,4,6},
{4,7,8,9},
{3,5,8,1}};
printf("2D arry:\n");
for(int i =0;i<m;i++){
for(int j = 0; j<n; j++){
printf("%d ",arr[i][j]);
}
printf("\n");
}
printf("\n");
printf("1D arry:\n");
for(int i =0;i<m;i++){
for(int j = 0; j<n; j++){
arr1d[i*n+j]=arr[i][j];
}
}
for(int i = 0; i<m*n; i++){
printf("%d ",arr1d[i]);
}
return 0;
}

 Linked List Node Silme

Önceki yazılarımızda linked list ve linked list'te düğüm ekleme konularına deÄŸindik. Bu yazımızın konusu da linked list'ten node(düğüm) silme olacaktır.

Linked list'den düğüm silmek için aşağıdaki adımları takip edeceğiz:

  • Silinecek düğümden önceki düğümü bulun
  • Önceki düğümün next'ini deÄŸiÅŸtirin
  • Silinecek düğüm için free fonksiyonu ile belleÄŸi boÅŸalt
Linked list'in her düğümü(node) malloc() kullanılarak dinamik olarak tahsis edildiğinden, silinecek olan düğüm için ayrılan belleği boşaltmak için free() fonksiyonu kullanılır.

Kod:

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

// linked list düğümü
struct Node{
int data;
struct Node* next;
};

// linked list düğüm ekleme
void push(struct Node** head_ref,int new_data){
struct Node* new_node = (struct Node*) malloc(sizeof (struct Node));
new_node->data = new_data;
new_node->next = (*head_ref);
(*head_ref) = new_node;
}

// linked list düğüm silme
void deleteNode(struct Node** head_ref,int key){
struct Node *temp = *head_ref,*prev;
// Eğer ilk düğüm silinecek olan key'i tutuyorsa
if(temp != NULL && temp->data == key){
*head_ref = temp->next;
free(temp);
return;
}
// silinecek olan düğüm aranır
while (temp != NULL && temp->data != key){
prev=temp;
temp=temp->next;
}
// EÄŸer linked list'de key yoksa
if (temp == NULL){
return;
}
// düğümün linked list'teki bağlantısını kaldır
prev->next = temp->next;
free(temp); // free memory
}

void printList(struct Node* node){
while (node!=NULL){
printf("%d ",node->data);
node = node->next;
}
}
int main() {
// boş linked list başlatılır
struct Node* head = NULL;
//linked list'e düğüm eklenir
push(&head,3);
push(&head,6);
push(&head,4);
push(&head,2);
printf("Linked list:\n ");
printList(head);
// linked list'ten düğüm silinir
deleteNode(&head,4);
printf("\n4 silindikten sonra linked list: \n");
printList(head);
return 0;
}
Çıktı:
Linked list:
 2 4 6 3
4 silindikten sonra linked list:
2 6 3


C programlama ile ilgili olan diğer konulara aşağıdaki linkten ulaşabilirsiniz:

Kaynaklar:
https://www.geeksforgeeks.org/c-program-for-deleting-a-node-in-a-linked-list/
https://www.geeksforgeeks.org/linked-list-set-3-deleting-node/
https://www.programiz.com/dsa/linked-list-operations
https://www.log2base2.com/data-structures/linked-list/deleting-a-node-in-linked-list.html


 Bu örnekte C programlama dilinde, kullanıcıdan alınan sayının tek sayımı yoksa çift sayı mı olduÄŸunu bulan programı yazdık:




#include <stdio.h>

void tekcift(int x){
    if(x%2==0){
        printf("Cift");
    }
    else
        printf("Tek");
}

int main() {
    int sayi;
    printf("Sayi giriniz: ");
    scanf("%d",&sayi);

    tekcift(sayi);

    return 0;
}

---------

#include <stdio.h>

int main() {
    int sayi;
    printf("Sayi giriniz: ");
    scanf("%d",&sayi);

    if(sayi%2==0){
        printf("Cift");
    }
    else
        printf("Tek");
    return 0;
}

Linked List Node Ekleme

 Bir önceki yazımızda linked list oluÅŸturmayı öğrendik. Bu yazıda linked list'e node(düğüm) ekleme iÅŸlemine deÄŸineceÄŸiz. 

Bir linked list'e düğm eklemenin 3 yöntemi vardır:

  • Linked List'in başına
  • Linked List'in sonuna
  • Linked List'de belirli bir düğümden sonra 

1. Linked List'in Başına Node (düğüm) Ekleme


Eklenen yeni düğüm linked list'in başına eklenir ve yeni eklenen düğüm linked list'in head(başı) olur. Örneğin linked list'in elemanları 1, 2, 3 vardır. Bu linked list'in başına 0'ı eklersek; 0, 1, 2, 3 olur. Liste'nin başına düğüm ekleyen fonksiyon push() olarak adlandıralım. push() fonksiyonu parametre olarak linked list'in head(baş) pointer'ını ve yeni düğüm değerini almalıdır. Çünkü, push() fonksiyonu yeni düğümü head ile değiştirmelidir.


#include <stdio.h>
#include <stdlib.h>
// bir linked list düğümü
struct Node{
int data;
struct Node* next;
};

// bu fonksiyon, verilen düğümden başlayarak linked list'in içeriğini yazdırır
void printList(struct Node* n){
while(n != NULL){
printf(" %d",n->data);
n = n->next;
}
}

void push(struct Node** head_ref,int new_data){
// yeni düğümü allocade etmek
struct Node* new_node = (struct Node*) malloc(sizeof (struct Node));
// yeni deÄŸeri al
new_node->data = new_data;
// yeni düğümü head yapmak
new_node->next = (*head_ref);
// yeni düğüme point etmek için head;
(*head_ref) = new_node;
}

int main() {
struct Node* head = NULL;
struct Node* second = NULL;
struct Node* third = NULL;

// yığında 3 düğüm ayırmak
head = (struct Node*) malloc(sizeof (struct Node));
second = (struct Node*) malloc(sizeof (struct Node));
third =(struct Node*) malloc(sizeof (struct Node));

head->data = 1; // ilk düğüme değer atandı
head->next =second; // ilk düğümü, ikinci düğüme bağladık

second->data = 2; // ikinci düğüme değer atandı
second->next = third; // ikinci düğümü, üçüncü düğüme bağladık

third->data =3; // üçüncü düğüme değer atandı
third->next = NULL;

// fonksiyonu çağıralım
push(&head,0);
printList(head);

return 0;
}

Çıktı:

0 1 2 3

2. Linked List'de Belirli Bir Node(düğüm) Sonra Node(düğüm) Ekleme


Bize bir düğüm için pointer verilir ve yeni düğüm, verilen düğümden sonra eklenir. Ã–rneÄŸin linked list'in elemanları 1, 2, 3 vardır. Linked list'te 2'den sonra 5 deÄŸerini ekleriz ve sonuç 1, 2, 5, 3 olur. Belirli bir düğümden sonra düğüm eklemek için:

  • İlk olarak verilen düğümün NULL olup olmadığı kontrol edilir
  • Yeni düğüm atanır
  • Veriler yeni düğüme atanır
  • Yeni düğümün next'ini sonraki düğüme point etmelidir. Önceki düğümün nexti'i yeni düğüme point etmelidir.


#include <stdio.h>
#include <stdlib.h>
// bir linked list düğümü
struct Node{
int data;
struct Node* next;
};

// bu fonksiyon, verilen düğümden başlayarak linked list'in içeriğini yazdırır
void printList(struct Node* n){
while(n != NULL){
printf(" %d",n->data);
n = n->next;
}
}

// bir düğümden sonra düğüm ekleme
void insertAfter(struct Node* prev_node, int new_data){
// verilen düğüm kontrol edilir
if(prev_node == NULL){
printf("Verilen node NULL olamaz");
return;
}
// yeni düğüm allocate edilir
struct Node* new_node = (struct Node*) malloc(sizeof (struct Node));
// yeni değer alınır
new_node->data=new_data;
// yeni düğümün next'i, önceki düğümün next'i yapılır
new_node->next = prev_node->next;
// önceli düğümün next'i, yeni düğüm yapılır
prev_node->next= new_node;
}
int main() {
struct Node* head = NULL;
struct Node* second = NULL;
struct Node* third = NULL;

// yığında 3 düğüm ayırmak
head = (struct Node*) malloc(sizeof (struct Node));
second = (struct Node*) malloc(sizeof (struct Node));
third =(struct Node*) malloc(sizeof (struct Node));

head->data = 1; // ilk düğüme değer atandı
head->next =second; // ilk düğümü, ikinci düğüme bağladık

second->data = 2; // ikinci düğüme değer atandı
second->next = third; // ikinci düğümü, üçüncü düğüme bağladık

third->data =3; // üçüncü düğüme değer atandı
third->next = NULL;

// fonksiyonu çağıralım
insertAfter(head->next,5);
printList(head);

return 0;
}

Çıktı:

 1 2 5 3

3. Linked List'in Sonuna Node Ekleme


Yeni düğüm, linked list'in sonuna eklenir. Ã–rneÄŸin linked list'in elemanları 1, 2, 3 vardır. Bu linked list'i sonuna 4 ekleriz ve sonuç 1, 2, 3, 4 olur.



#include <stdio.h>
#include <stdlib.h>
// bir linked list düğümü
struct Node{
int data;
struct Node* next;
};

// bu fonksiyon, verilen düğümden başlayarak linked list'in içeriğini yazdırır
void printList(struct Node* n){
while(n != NULL){
printf(" %d",n->data);
n = n->next;
}
}
// sona düğüm eklemek
void append(struct Node** head_ref, int new_data){
// yeni düğüm allocate edilir
struct Node* new_node = (struct Node*) malloc(sizeof (struct Node));
struct Node *last = *head_ref;

// yeni değer alınır
new_node->data = new_data;
// bu düğüm son düğüm olduğu için, next'i NULL yapılır
new_node->next = NULL;
// Eğer linked list boş ise yeni düğüm head yapılır
if(*head_ref == NULL){
*head_ref = new_node;
return;
}
// Linked list boş değilse son düğüme geçiş yapılır
while (last->next != NULL){
last = last->next;
}
// son düğümün next'i yeni düğüm yapılır
last->next = new_node;
return;
}

int main() {
struct Node* head = NULL;
struct Node* second = NULL;
struct Node* third = NULL;

// yığında 3 düğüm ayırmak
head = (struct Node*) malloc(sizeof (struct Node));
second = (struct Node*) malloc(sizeof (struct Node));
third =(struct Node*) malloc(sizeof (struct Node));

head->data = 1; // ilk düğüme değer atandı
head->next =second; // ilk düğümü, ikinci düğüme bağladık

second->data = 2; // ikinci düğüme değer atandı
second->next = third; // ikinci düğümü, üçüncü düğüme bağladık

third->data =3; // üçüncü düğüme değer atandı
third->next = NULL;

// fonksiyonu çağıralım
append(&head,4);
printList(head);

return 0;
}

Çıktı:
 1 2 3 4



C programlama ile ilgili olan diğer konulara aşağıdaki linkten ulaşabilirsiniz:

Kaynaklar
https://www.codesdope.com/blog/article/inserting-a-new-node-in-a-linked-list-in-c/
https://www.geeksforgeeks.org/linked-list-set-2-inserting-a-node/
https://www.programiz.com/dsa/linked-list-operations

 Linked Lists (BaÄŸlı listeler), uygulanması için pointer (iÅŸaretçi) kullanan dinamik veri yapısının en iyi ve en basit örneÄŸidir ve yazılım dünyasında önemli yeri olan veri yapılarından biridir. Dizilerde olduÄŸu baÅŸta kaç tane elemanın olduÄŸunu belirtmek gerekmemektedir. Dizilerde yapılan eleman ekleme, silme iÅŸlemleri ve araya eleman ekleme iÅŸlemleri yapılabilir. 

Ancak, pointer'ları anlamak linked list nasıl çalıştığını anlamak için çok önemlidir. Pointer konusu ile ilgili kafanızda soru iÅŸaretleri varsa pointer ile ilgili yazımızı inceleyebilirsiniz. 


Linked list'ler, dizideki herhangi bir noktadan gerektiği büyüyüp küçülebilen bir dizi işlevi görür.

Linked list'lerin dizilere göre bazı avantajları vardır:

1- Dizilerde eleman ekleme, silme gibi iÅŸlemler linked list'lere göre performans açısından daha maliyetlidir. Linked list'lerde ise bu iÅŸlem sadece basit bir pointer iÅŸlemi ile yapılır ve kaydırma iÅŸlemlerine ihtiyaç kalmaz. Bu sayede performanstan kazanç saÄŸlanır. 

2- Linked list'ler dinamik veri yapılarıdır. Dizi tanımlaması yapılırken en başta veri boyutunu belirtmemiz gerekirken, linked list'lerde ise bu boyutu eleman ekleme ile artırabilir, eleman silme işlemleri ile boyutu küçültebiliriz.

Linked list'lerin dezavantajları:

1- Rastgele eriÅŸim yoktur. Dizideki n'inci öğeye, o öğeye kadar tüm öğeler üzerinde yineleme yapılmadan ulaÅŸmak imkansızdır. Bu, listenin en başından baÅŸlamamız ve istenen öğeye ulaÅŸana kadar listede kaç kez ilerlediÄŸinizi saymanız gerektiÄŸi anlamına gelir. 

2- Linked list'ler sadece veriyi değil, veri ile birlikte bir sonraki düğüme işaret eden pointer'ları da tuttuğu için dizilere göre hafızada daha fazla yer kaplar


Linked List (Bağlı Listeler) Nedir?


BaÄŸlı liste, her node (düğüm) bir deÄŸer ve bir iÅŸaretçi içeren, dinamik olarak ayrılmış düğümler kümesidir. Pointer her zaman listenin bir sonraki üyesini iÅŸaret eder. Pointer NULL ise, listedeki son düğümdür. 



Kısaca şöyle diyebiliriz; bağlı liste içerisinde bellek üzerinde tanımlanan elemanlar pointer yardımı ile birbirini takıp eden vagonlar gibi çalışır. Kendinden sonraki gelecek olan düğümün adresini tutar. Bu sayede, her düğüm kendinden sonraki gelecek olan düğümün yerini bilir. Bu özellikleri sayesinde, bellekte sıralanış şekli açısından esneklik sağlar.

Linked List Türleri


Simple Linked List: Bu tür linked list'de, listeyi yalnızca bir yönde hareket edebilir veya hareket ettirebilirsiniz.

Doubly Linked List: Bu tür linked list'de, listeyi her iki yönde de hareket ettirebilir veya çaprazlanabilir(ileri ve geri).

Circular Linked List: Bu tür linked list'de, baÄŸlantılı listenin son düğümü, bir sonraki iÅŸaretçisinde baÄŸlantılı listenin ilk/baÅŸ düğümünün baÄŸlantısını içerir ve ilk/baÅŸ düğüm, baÄŸlı listenin son düğümünün baÄŸlantısını kendi içinde içerir. 

Linked List'lerin Temsili


Linked list, linked list'in ilk düğümüne bir işaretçi ile temsil edilir. İlk düğüm, linked list'in başı olarak adlandırılır. Linked list boşsa, başlığın değeri NULL'u gösterir.

Listedeki her düğüm en az iki bölümden oluşur:
  • Bir veri öğesi(tamsayı, diziler veya herhangi bir veri türü).
  • Bir sonraki düğüme iÅŸaretçi(veya referans)(bu düğümü diÄŸerine baÄŸlar) veya baÅŸka bir düğüm adresi.
C'de yapıları(structures) kullanarak bir düğümü temsil edebiliriz. Aşağıda tamsayı verileriyle bağlantılı bir liste düğümü örneği verilmiştir.

// bir linked list düğümü
struct Node{
int data;
struct Node* next;
};
3 düğümlü basit bit linked list'in oluşturulması:

#include <stdio.h>
#include <stdlib.h>
// bir linked list düğümü
struct Node{
int data;
struct Node* next;
};


int main() {
struct Node* head = NULL;
struct Node* second = NULL;
struct Node* third = NULL;

// yığında 3 düğüm ayırmak
head = (struct Node*) malloc(sizeof (struct Node));
second = (struct Node*) malloc(sizeof (struct Node));
third =(struct Node*) malloc(sizeof (struct Node));

/* dinamik olarak 3 blok tahsis edilmiÅŸtir
* Bu üç bloğa head, second ve third olarak işaretçilerimiz var
*
head second third
| | |
| | |
+---+-----+ +----+----+ +----+----+
| # | # | | # | # | | # | # |
+---+-----+ +----+----+ +----+----+
Herhangi bir rastgele deÄŸeri temsil eder.
Veriler rastgele çünkü henüz bir şey atamadık.
*/

head->data = 1; // ilk düğüme değer atandı
head->next =second; // ilk düğümü, ikinci düğüme bağladık

/* veriler, ilk bloğun data kısmına atanmıştır.
* ve bloğun sonraki işaretçisi ikinciyi gösterir.
* yani ikisi de bağlı
head second third
| | |
| | |
+---+---+ +----+----+ +-----+----+
| 1 | o----->| # | # | | # | # |
+---+---+ +----+----+ +-----+----+
*/

second->data = 2; // ikinci düğüme değer atandı
second->next = third; // ikinci düğümü, üçüncü düğüme bağladık

/* veriler, ikinci bloğun data kısmına atanmıştır.
* ve ikinci bloğun bir işaretçisi üçüncü bloğa işaret eder.
* yani üç blok da birbirine bağlı.

head second third
| | |
| | |
+---+---+ +---+---+ +----+----+
| 1 | o----->| 2 | o-----> | # | # |
+---+---+ +---+---+ +----+----+
*/

third->data =3; // üçüncü düğüme değer atandı
third->next = NULL;

/* veriler, üçüncü bloğun data kısmına atanmıştır.
* ve üçüncü bloğun bir sonraki işaretçisi,
* linked list'in burada bittiğini belirtmek için NULL yapılır.
*
* Linked list'imiz hazır
head
|
|
+---+---+ +---+---+ +----+------+
| 1 | o----->| 2 | o-----> | 3 | NULL |
+---+---+ +---+---+ +----+------+

Tüm listeye temsil ulaşmak için yalnızca head'in yeterli olduğunu unutmayın.

*/
return 0;
}

Şimdi oluşturduğumuz listeyi dolaşalım ve her düğümün verilerini ekrana yazdıralım. Geçişler için ve düğüm verilerini yazdıran genel amaçlı bir printList() fonksiyonu yazalım.

#include <stdio.h>
#include <stdlib.h>
// bir linked list düğümü
struct Node{
int data;
struct Node* next;
};

// bu fonksiyon, verilen düğümden başlayarak linked list'in içeriğini yazdırır
void printList(struct Node* n){
while(n != NULL){
printf(" %d",n->data);
n = n->next;
}
}

int main() {
struct Node* head = NULL;
struct Node* second = NULL;
struct Node* third = NULL;

// yığında 3 düğüm ayırmak
head = (struct Node*) malloc(sizeof (struct Node));
second = (struct Node*) malloc(sizeof (struct Node));
third =(struct Node*) malloc(sizeof (struct Node));

head->data = 1; // ilk düğüme değer atandı
head->next =second; // ilk düğümü, ikinci düğüme bağladık

second->data = 2; // ikinci düğüme değer atandı
second->next = third; // ikinci düğümü, üçüncü düğüme bağladık

third->data =3; // üçüncü düğüme değer atandı
third->next = NULL;

// fonksiyonu çağıralım
printList(head);

return 0;
}

Çıktı:

 1 2 3



C programlama ile ilgili olan diğer konulara aşağıdaki linkten ulaşabilirsiniz:


Kaynaklar:

https://www.learn-c.org/en/Linked_lists
programiz.com/dsa/linked-list
https://www.edureka.co/blog/linked-list-n-c/
https://www.geeksforgeeks.org/linked-list-set-1-introduction/
https://www.studytonight.com/data-structures/linked-list-vs-array