Skip to content

Instantly share code, notes, and snippets.

@oguzhanvarsak
Last active June 4, 2024 15:44
Show Gist options
  • Save oguzhanvarsak/6626d07578bf87c97b75a0da287e02dc to your computer and use it in GitHub Desktop.
Save oguzhanvarsak/6626d07578bf87c97b75a0da287e02dc to your computer and use it in GitHub Desktop.
Circular Doubly Linked List - Dairesel Çift Yönlü Bağlı Liste
/*
*************** RAPOR ***************
Onceki odevde ogrendigim gibi C++'da main() fonksiyonunu diger fonksiyonlar içerisinden cagirilamayacagindan tamamen C'ye gecmeye karar verdim.
Cogu kodu Doubly Linked List kodumdan aldim ve kullandim.
Silme isleminde tam cozemedigim bir durumdan dolayi tamamlayamadim. Kod sadece silinen degeri en sona atiyor. O kisim biraz karisikti bu yuzden bu sekilde biraktim.
Bu sefer node olusturmak icin ayri bir fonksiyon olusturdum. Arama ve Silme icin her olusturdugumda bir deger arttirdim.
Bu sayede DLL odevinde kullandigim while(temp->next != NULL) dongude en sona gelindiginde basa donme durumundan kurtulmak istedim.
Yeni bir for dongu kullanimi ogrendim, bu sekilde daha guzel gorundugunu dusundugumden cogunlukla for dongulerini o sekilde kullandım.
for (temp = head, i = 0;i < number;i++,temp = temp->next)
> temp'i head'e esitle, i 0'dan itibaren number degerinden kucukse i'yi arttir ve sonraki node'a ilerle.
*/
#include <stdio.h>
#include <stdlib.h>
void ekle(); // Veri eklemek için tanimlanan fonksiyon.
void siraliGoster(); // Verileri sirasiyla göstermek için tanimlanan fonksiyon.
void terstenGoster(); // Verileri terst sirayla göstermek için tanimlanan fonksiyon.
void ara(); // Verileri liste içerisinde aramak için tanimlanan fonksiyon.
void sil(); // Verileri listeden silmek için tanimlanan fonksiyon.
struct node { // Node yapisini içeren yigin.
int data; // Node içerisinde saklanacak veri.
struct node *next; // Siradaki node'un adresini tutacak pointer.
struct node *prev; // Önceki node'un adresini tutacak pointer.
};
typedef struct node n; // n node'u tanimlaniyor.
n* node_olustur(int);
n *new, *temp, *prev; // Program içerisinde gerektiğinde geçici olarak kullanılacak pointer'lar tanımlanıyor.
n *head = NULL, *tail = NULL; // Ilk ve son node'lari temsil edecek pointer'lar tanimlaniyor.
int number = 0; // Her yeni node eklendiginde artacak degisken. Bu sayede dongulerde ihtiyac oldugu kadar ilerleme yapilacak ve son node'a ulasilabilecek.
void anamenu() {
char giris;
system("cls");
printf("Circular Doubly Linked List - Dairesel Cift Yonlu Bagli Liste\n");
printf("1> Yeni veri ekleme\n");
printf("2> Girilen verileri duzden listeleme\n");
printf("3> Girilen verileri tersten listeleme\n");
printf("4> Eklenmis veriler icinde arama\n");
printf("5> Eklenmis verilerden veri silme\n");
printf("6> Cikis\n");
printf("\n> ");
giris = getchar();
switch (giris) {
case '1':
ekle();
break;
case '2':
siraliGoster();
break;
case '3':
terstenGoster();
break;
case '4':
ara();
break;
case '5':
sil();
break;
case '6':
exit(0);
}
return anamenu();
}
n* node_olustur(int deger) {
number++;
new = (n *)malloc(sizeof(n));
new->data = deger;
new->next = NULL;
new->prev = NULL;
return new;
}
void ekle() { // *** YENI DEGER EKLEME FONKSIYONU *** //
int deger;
printf("Eklenecek deger > "); // Kullanicidan deger aliniyor.
scanf("%d", &deger); // Alinan deger degiskene atiliyor.
new = node_olustur(deger); // Gelen deger ile yeni node olusturuluyor.
if (head == tail && head == NULL) { // Eger head node'u son node ya da NULL ise;
head = tail = new; // Head ve Tail yeni olusturulan node degerini aliyor
head->next = tail->next = NULL; // Iki node'un da sonraki node bilgileri NULL ataniyor
head->prev = tail->prev = NULL; // Iki node'un da onceki node bilgileri NULL ataniyor
} else { // Eger head node'u son node ya da NULL degil ise;
tail->next = new; // Yeni olusturulan node tail'in sonrasına yani en sona geciyor.
new->prev = tail; // Yeni node'un oncesinde tail oldugu bilgisi ataniyor.
tail = new; // Yeni node tail olarak tanimlaniyor.
tail->next = head; // Yeni tail'in sonrasinda head oldugu bilgisi ataniyor.
head->prev = tail; // Head'e oncesinde yeni tail'in oldugu bilgisi ataniyor.
}
printf("Deger listeye eklendi!\n\n");
system("pause"); // Kullanicinin herhangi bir giris yapmasi bekleniyor.
anamenu(); // Ana Menü'ye dönülüyor.
}
void siraliGoster() { // *** DEGERLERI SIRASIYLA GÖSTEREN FONKSIYON *** //
int i;
printf("Sirali Liste : ");
if (head == tail && head == NULL) { // Eger head node'u son node ya da NULL ise;
printf("\nListe bos!"); // Döngüden çikiliyor ve ekrana listenin bos oldugu yazdiriliyor. Çünkü bu durum saglandiginda ortada bir liste olmadigi anlamina geliyor.
system("pause"); // Kullanicinin herhangi bir giris yapmasi bekleniyor.
anamenu(); // Ana Menü'ye dönülüyor.
} else { // Eger head node'u son node ya da NULL degil ise;
for (temp = head, i = 0;i < number;i++,temp = temp->next) { // Head'den baslayip i degiskeni number degiskeninden kucuk oldugu surece bir sonraki node'a geciliyor.
printf("%d<=", temp->data); // Node'un içindeki veri yazdiriliyor.
}
}
printf("\n\n");
system("pause"); // Kullanicinin herhangi bir giris yapmasi bekleniyor.
anamenu(); // Ana Menü'ye dönülüyor.
}
void terstenGoster() { // *** DEGERLERI TERSTEN SIRAYLA GÖSTEREN FONKSIYON *** //
int i;
printf("Tersten Liste : ");
if (head == tail && head == NULL) { // Eger head node'u son node ya da NULL ise;
printf("\nListe bos!"); // Döngüden çikiliyor ve ekrana listenin bos oldugu yazdiriliyor. Çünkü bu durum saglandiginda ortada bir liste olmadigi anlamina geliyor.
system("pause"); // Kullanicinin herhangi bir giris yapmasi bekleniyor.
anamenu(); // Ana Menü'ye dönülüyor.
} else { // Eger head node'u son node ya da NULL degil ise;
for (temp = tail, i = 0;i < number;i++,temp = temp->prev) { // Tail'den baslayip i degiskeni number degiskeninden kucuk oldugu surece bir onceki node'a geciliyor.
printf("%d<=", temp->data); // Node'un içindeki veri yazdiriliyor.
}
}
printf("\n\n");
system("pause"); // Kullanicinin herhangi bir giris yapmasi bekleniyor.
anamenu(); // Ana Menü'ye dönülüyor.
}
void ara() {
int deger, count=0, i, f=0;
printf("Aranacak deger > "); // Kullanicidan deger aliniyor.
scanf("%d",&deger); // Alinan deger degiskene atiliyor.
if (head == tail && head == NULL) { // Eger head node'u son node ya da NULL ise;
printf("\nListe bos!"); // Döngüden çikiliyor ve ekrana listenin bos oldugu yazdiriliyor. Çünkü bu durum saglandiginda ortada bir liste olmadigi anlamina geliyor.
system("pause"); // Kullanicinin herhangi bir giris yapmasi bekleniyor.
anamenu(); // Ana Menü'ye dönülüyor.
} else { // Eger head node'u son node ya da NULL degil ise;
for (temp = head,i = 0;i < number;i++,temp = temp->next) { // Head'den baslayip i degiskeni number degiskeninden kucuk oldugu surece bir sonraki node'a geciliyor.
count++;
if (temp->data == deger) {
printf("\nSu sirada bulundu : %d ",i+1); // Degerin bulundugu sira yazdiriliyor.
f = 1;
system("pause"); // Kullanicinin herhangi bir giris yapmasi bekleniyor.
break; // Ve döngüden çikiliyor.
}
}
if (f == 0) {
printf("\nDeger bulunamadi!"); // Aranan degerin listede bulunmadigi yazdiriliyor.
system("pause"); // Kullanicinin herhangi bir giris yapmasi bekleniyor.
anamenu(); // Ana Menü'ye dönülüyor.
}
}
}
void sil() {
int deger, i=0;
printf ("Silinecek deger > "); // Kullanicidan deger aliniyor.
scanf ("%d", &deger); // Alinan deger degiskene atiliyor.
struct node* current = head; // Degerin aramasina ilk node'dan baslanacagi için current node'una head kopyalaniyor.
if (head == tail && head == NULL) { // Eger head node'u son node ya da NULL ise;
printf("\nListe bos!\n"); // Döngüden çikiliyor ve ekrana listenin bos oldugu yazdiriliyor. Çünkü bu durum saglandiginda ortada bir liste olmadigi anlamina geliyor.
system("pause"); // Kullanicinin herhangi bir giris yapmasi bekleniyor.
anamenu(); // Ana Menü'ye dönülüyor.
}
while (current->data != deger) { // Tutulan node'un veri degeri, kullanicidan alinan degere esit olmadigi sürece;
if (current->next == NULL) { // Eger tail'a ulasana kadar herhangi bir eslesme saglanmadiysa;
printf("\nDeger bulunamadi!"); // Aranan degerin listede bulunmadigi yazdiriliyor.
system("pause"); // Kullanicinin herhangi bir giris yapmasi bekleniyor.
anamenu(); // Döngüden çikiliyor. Çünkü listede bu deger bulunmuyor.
} else { // Eger tail'a ulasilmadiysa;
current = current->next; // Siradaki node'a geçiliyor.
}
}
// Yukaridaki döngüde eslesme bulundu ve silme islemine geçilecek.
if(current == head) { // Eger degerin bulundugu node head ise;
head->prev = tail;
head = head->next; // Head, kendisinden sonra bulunan node ile degistiriliyor ve listeden ayrilmis oluyor.
} else { // Ancak, degerin bulundugu node head'e esit degil ise;
current->prev->next = current->next; // Degerin bulundugu node'un öncesindeki node içerisinde bulunan sonraki degeri, degeri içeren node'un sonraki degeri ile degistiriliyor. (1->next = 3)
printf("\nDeger silindi!"); // Bu sayede degerin bulundugu node atlanmis oluyor ve node siliniyor ve durum yazdiriliyor.
i++; // Kontrol degiskeni arttiriliyor. Deger hiç bulunamazsa degisken bu durumu ögrenmek için kullanilacak.
system("pause"); // Kullanicinin herhangi bir giris yapmasi bekleniyor.
anamenu(); // Ana Menü'ye dönülüyor.
}
if(current == tail) { // Eger deger tail node'unda bulunduysa;
tail->next = head;
tail = current->prev; // Tail'in öncesindeki node tail degeri olarak ataniyor. Böylelikle silme islemi gerçeklesiyor.
} else { // Ancak, degerin bulundugu node tail'a esit degil ise;
current->next->prev = current->prev; // Degerin bulundugu node'un sonrasindaki node içerisinde bulunan önceki degeri, degeri içeren node'un önceki degeri ile degistiriliyor. (3->prev = 1)
printf("\nDeger silindi!"); // Bu sayede degerin bulundugu node atlanmis oluyor ve node siliniyor ve durum yazdiriliyor.
i++; // Kontrol degiskeni arttiriliyor. Deger hiç bulunamazsa degisken bu durumu ögrenmek için kullanilacak.
system("pause"); // Kullanicinin herhangi bir giris yapmasi bekleniyor.
anamenu(); // Ana Menü'ye dönülüyor.
}
if(i > 0) { // Eger bütün node'lar tamamlandiginda i degiskeni 0'dan ise, bu durumda aranan deger listede bulunamadi sonucu çikiyor.
printf("\nDeger bulunamadi!"); // Aranan degerin listede bulunmadigi yazdiriliyor.
system("pause"); // Kullanicinin herhangi bir giris yapmasi bekleniyor.
anamenu(); // Ana Menü'ye dönülüyor.
}
return;
}
int main() {
anamenu();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment