Pazartesi Ekim 28th, 2019

Bağlı Liste(Linked List)

ile Ebubekir Sezer

Merhaba, Bağlı liste her elemanın ayrı bir nesne olarak tutan dogrusal bir veri yapısıdır. Array’ler static yapıdayken, Bağlı listeler dynamic yapıdadır. Arraylere yeni bir veri eklerken zorluk çekebiliriz ama bağlı liste kullanırsak istediğimiz yere istediğimiz veriyi ekleyebiliriz. Bağlı listelerde eleman sayısı kesin değildir, istediğimiz şekilde bağlı listeye eleman ekleyebilir veya çıkartabiliriz. Bağlı listede elemanın bulunduğu yere node(düğüm) diyoruz.Eğer en son Node’da isek onun next’i NULL’ı göstermelidir. Array yerine Bağlı liste kullanmanın dezavantajları da olabilir, bunlardan biri Arrayler istediğimiz nesneye erişmek için sadece o elemanın nerede olduğunu işaret(point) etmemiz lazım ama bağlı listelerde o elemana ulaşmak için en baş noktandan başlayarak taramamız lazım. Bu yazıda Bağlı liste’ye eleman ekleme ve çıkarma işlemi yapmaya çalışacağım.

Ben C programlama dilini kullanarak Bağlı Liste örneği yapmaya çalışacağım. Projemizi oluşturduktan sonra gerekli kütüphaneleri ekliyoruz ve ayrıca stdlib.h kütüphanesini ekliyoruz ve bu sayede malloc kullanarak hafızada yer oluşturabiliyoruz. Bir node yapısı oluşturup bu yapı içerisinde bir veri ve daha sonra nereyi işaret edeecğini göstereceği aynı tipte bir pointer oluşturuyorum ve main fonksiyonu içerisinde ana kök’ü(root) oluşturuyorum. Bu root’un ne kadar yer tutacağını malloc fonksiyonu ile ayırtıyorum ve data değerini veriyorum. Her zaman node’un next’inde değer olmayacak ise NULL’ı göstermeliyiz.

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


typedef struct node{
	int data;
	node *next;
};

int main(){
	node *root;
	root = (node *)malloc(sizeof(node));
	root->data = 50;
	root->next = NULL;
	printf("%d",root->data);
}

 

 

 

Ekleme işlemini yapmak için node döndüren bir fonksiyon yazıyorum bu fonksiyon içerisinde eğer node boş gelmiş ise onu root olarak atıyorum eğer boş değil ise değerine bakarak büyük veya küçük olarak node’ları birbirine bağlıyorum.

node *insertItem(node *newnode,int newdata){
	node *iter = newnode;
	// If the LinkedList Empty we added a new Item
	if(newnode == NULL){ // LinkList Boş İse
		newnode = (node *)malloc(sizeof(node));
		newnode->next = NULL;
		newnode->data = newdata;
		return newnode;
	}
	//If the data smaller than the newdata we added the left side
	else if(newnode->data < newdata){
		while(iter->next != NULL && iter->next->data < newdata){
			iter = iter->next;
		}
		node *temp = (node *)malloc(sizeof(node));
		temp->next = iter->next;
		iter->next = temp;
		temp->data = newdata;
		return newnode;
	}
	//If the data bigger than the newdata we added the right side
	else{
		node *temp = (node *)malloc(sizeof(node));
		temp->data = newdata;
		temp->next = newnode;
		return temp;
	}
}

Sürekli tekrar tekrar printf yazarak dönmek yerine bir tane fonksiyon yazıyorum ve bu fonksiyon sayesinde bağlı listedeki elemanları ekrana yazdırıyorum.

void showNodes(node *n){
	// Until the item equal NULL we show the datas
	while(n != NULL){
		printf("%d ",n->data);
		n = n->next;
	}
}

Main fonksiyonu içerisinde ise şu kodlar var;

int main(){
	node *root;
	root = NULL;
	root = insertItem(root,100);
	root = insertItem(root,10);
	root = insertItem(root,1060);
	root = insertItem(root,5);
	root = insertItem(root,50);
	root = insertItem(root,60);
	showNodes(root);
}

 

 

 

Ekleme işlemini de yaptıktan sonra sadece silme işlemini yapan fonksiyonu yazmamız gerekiyor. Bu fonksiyonda yine node tipinde bir obje döndürecek. Silinecek dosyayı değerinden alıp silmeye çalışacağız. Silme işlemi yazmamız gereken kod;

node *deleteItem(node *deletedNode,int value){
	node *temp;
	node *iter = deletedNode;
	
	if(deletedNode->data == value){
		temp = deletedNode;
		deleteNode = deletedNode->next;
		free(temp); // This is the function delete item
		return deletedNode;
	}
	
	while(iter->next != NULL && iter->next->data != value){
		iter = iter->next;
	}
	
	if(iter->next == NULL){
		printf("Number NOT Found");
		return deletedNode;
	}
	temp = iter->next;
	iter->next = iter->next->next;
	free(temp);
	return deletedNode;
}

Main fonksiyonunu tekrar düzenlediğimizde;

int main(){
	node *root;
	root = NULL;
	root = insertItem(root,100);
	root = insertItem(root,10);
	root = insertItem(root,1060);
	root = insertItem(root,5);
	root = insertItem(root,50);
	root = insertItem(root,60);
	showNodes(root);
	
	root = deleteItem(root,5);
	root = deleteItem(root,60);
	root = deleteItem(root, 1060);
	showNodes(root);
}

 

 

 

 

Soru ve görüşlerinizi e-mail veya yorum olarak belirtirseniz sevinirim.