![]() |
| c ile ilgili bir resim |
#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", °er);
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: bağlı liste c kodu, bağlı liste hazır c kodu, linked list c kodu, linked list hazır c kodu