Skip to content

Instantly share code, notes, and snippets.

@oguzhanvarsak
Last active November 1, 2020 16:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save oguzhanvarsak/8fd343434bf12248adb7d82f59168966 to your computer and use it in GitHub Desktop.
Save oguzhanvarsak/8fd343434bf12248adb7d82f59168966 to your computer and use it in GitHub Desktop.
Doubly Linked List - Çift Yönlü Bağlı Liste
/*
*************** RAPOR ***************
C++'da main() fonksiyonunu diğer fonksiyonlar içerisinden çağıramayacağımı öğrendim.
Bu yüzden istenen switch-case yapısını main() içerisinde hazırlamak yerine anamenu() isimli fonksiyonu tanımlayıp onun içerisinde hazırladım.
Çünkü programın işlemler tamamlandıktan sonra tekrardan ana menüye dönülecek şekilde çalışmasını istedim.
Bu şekilde ana menüye istediğim zaman dönüş yapıp tekrardan kullanıcı girdisi alabildim.
Diğer fonksiyonları başlangıçta tanımlayıp sonradan açıklamalarını yazmam gerekti çünkü anamenu() içerisinde kullanmam için fonksiyonların anamenu()
fonksiyonunun kendisinden önce tanımlanması gerekiyordu. Aynı kısıtlamadan dolayı anamenu() fonksiyonunu ise diğer fonksiyonlardan önce tanımladım.
Sonuç olarak böyle bir kod yapısı ortaya çıktı.
Switch-Case yapısına default değeri koymadım çünkü anlamadığım bir sebepten dolayı ne olursa olsun program ana menüye döndüğünde default değeri
kendiliğinden çalıştırılıyordu.
52. sayırda scanf() kullandım fakat bir türlü istediğim sonucu elde edemedim. Girdiyi kaydeymek için bu şekilde bir yöntem öğrendim ve bunu kullandım.
İLk başlarda printf() yerine cout kullanmaya çalıştım fakat C'ye daha alışık olduğum için sonradan printf()'e döndüm.
Listeyi hazırlarken bir hata yapmış olmalıyım ki listem ters şekilde hazırlanıyor. Ama çözüm bulamadım ve bu şekilde bıraktım.
Ekrana yazdırırken ters yazdırma için düzü; düz yazdırma için normal listeyi yazdıracaktım ama kodun hazırlandığı şekilde yazdırılması
gerektiğine karar verdim.
*/
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
void ekle(); // Veri eklemek için tanımlanan fonksiyon.
void siraliGoster(); // Verileri sırasıyla göstermek için tanımlanan fonksiyon.
void terstenGoster(); // Verileri terst sırayla göstermek için tanımlanan fonksiyon.
void arama(); // Verileri liste içerisinde aramak için tanımlanan fonksiyon.
void sil(); // Verileri listeden silmek için tanımlanan fonksiyon.
typedef struct node { // Node yapısını içeren yığın.
int data; // Node içerisinde saklanacak veri.
struct node *next; // Sıradaki node'un adresini tutacak pointer.
struct node *prev; // Önceki node'un adresini tutacak pointer.
};
struct node *head=NULL, *tail=NULL; // İlk ve son node'ları temsil edecek pointer'lar tanımlanıyor.
void anamenu() {
char giris;
system("cls");
printf("Doubly Linked List - Cift Yonlu Baglı 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 içinde 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':
arama();
break;
case '5':
sil();
break;
case '6':
exit(0);
}
return anamenu();
}
void ekle () { // *** YENI DEĞER EKLEME FONKSİYONU *** //
int deger;
printf("Eklenecek deger > "); // Kullanıcıdan değer alınıyor.
scanf("%d",&deger); // Alınan değer değişkene atılıyor.
struct node *temp;
temp = (node*) malloc(sizeof(node)*1); // Node için bellekten yer ayırıyoruz.
temp->data = deger; // Kullanıcıdan alınan değer node'un data kısmına alınıyor.
if (head == NULL) { // Listenin başındaki değer NULL ise, listenin boş olduğu anlamına geliyor.
tail = temp; // Listede herhangi bir değer bulunmadığını öğrenirsek listenin son node'unu yeni oluşturduğumuz node olarak atıyoruz.
} else {
head->prev = temp; // Eğer head bir değere sahipse yeni oluşturduğumuz node'un head'in öncesine atılmasını sağlıyoruz.
}
temp->next=head; // Yeni node'a sonrasındaki node'un head olduğu bilgisini veriyoruz.
head=temp; // Yeni node'u head yapıyoruz.
cout << "Deger listeye eklendi!\n\n";
system("pause"); // Kullanıcının herhangi bir giriş yapması bekleniyor.
anamenu(); // Ana Menü'ye dönülüyor.
}
void siraliGoster(){ // *** DEĞERLERİ SIRASIYLA GÖSTEREN FONKSİYON *** //
struct node *temp;
temp = head; // Geçici node'a head kopyalanıyor.
cout << "Sirali liste : ";
while(temp != NULL) { // Node NULL olmadığı sürece;
cout<< temp->data << "=>"; // Node'un içindeki veri yazdırılıyor.
temp = temp->next; // Elimizdeki node'un sonrasındaki node şuanki node'a kopyalanıyor.
}
cout << "\n\n";
system("pause"); // Kullanıcının herhangi bir giriş yapması bekleniyor.
anamenu(); // Ana Menü'ye dönülüyor.
}
void terstenGoster(){ // *** DEĞERLERİ TERSTEN SIRAYLA GÖSTEREN FONKSİYON *** //
struct node* temp;
temp = tail; // Geçici node'a tail kopyalanıyor.
cout << "Tersten liste : ";
while (temp != NULL) { // Node NULL olmadığı sürece;
cout << temp->data << "<="; // Node'un içindeki veri yazdırılıyor.
temp = temp->prev; // Elimizdeki node'un öncesindeki node şuanki node'a kopyalanıyor.
}
cout << "\n\n";
system("pause"); // Kullanıcının herhangi bir giriş yapması bekleniyor.
anamenu(); // Ana Menü'ye dönülüyor.
}
void arama() {
struct node *temp;
int deger, i=0, j;
temp = head; // Geçici node'a head kopyalanıyor.
if(head == NULL) {
printf("\nListe bos!"); // Döngüden çıkılıyor ve ekrana listenin boş olduğu yazdırılıyor. Çünkü bu durum sağlandığında ortada bir liste olmadığı anlamına geliyor.
system("pause"); // Kullanıcının herhangi bir giriş yapması bekleniyor.
anamenu(); // Ana Menü'ye dönülüyor.
} else {
printf("Aranacak deger > "); // Kullanıcıdan değer alınıyor.
scanf("%d",&deger); // Alınan değer değişkene atılıyor.
while (temp != NULL) { // Node NULL olmadığı sürece;
if(temp->data == deger) { // Eger tutulan node'un veri değeri, kullanıcıdan alınan değere eşit ise;
printf("\nSu sirada bulundu : %d ",i+1); // Değerin bulunduğu sıra yazdırılıyor.
j = 0; // Kontrol değişkeni 0'a eşitleniyor. Değer hiç bulunamasaydı değişken bu durumu öğrenmek için kullanılacaktı.
system("pause"); // Kullanıcının herhangi bir giriş yapması bekleniyor.
break; // Ve döngüden çıkılıyor.
} else { // Eğer değer bulunamadıysa;
j = 1; // Kontrol değişkeni 1'e eşitleniyor. Değer hiç bulunamazsa değişken bu durumu öğrenmek için kullanılacak.
}
i++; // Değerin bulunduğu node'un sırasını öğrenmek için i değişkeni 0'dan başlayarak her kontrolde 1 arttırılıyor.
temp = temp->next; // Sıradaki node'a geçiliyor.
}
if(j == 1) { // Eğer bütün node'lar tamamlandığında j değişkeni 1 ise, bu durumda aranan değer listede bulunamadı sonucu çıkıyor.
printf("\nDeger bulunamadi!"); // Aranan değerin listede bulunmadığı yazdırılıyor.
system("pause"); // Kullanıcının herhangi bir giriş yapması bekleniyor.
anamenu(); // Ana Menü'ye dönülüyor.
}
}
}
void sil() { // *** DEĞERLERİ SİLEN FONKSİYON *** //
int deger, i=0;
printf ("Silinecek deger > "); // Kullanıcıdan değer alınıyor.
scanf ("%d", &deger); // Alınan değer değişkene atılıyor.
struct node* current = head; // Değerin aramasına ilk node'dan başlanacağı için current node'una head kopyalanıyor.
if (head == NULL) { // Eğer head NULL ise;
printf("\nListe bos!\n"); // Döngüden çıkılıyor ve ekrana listenin boş olduğu yazdırılıyor. Çünkü bu durum sağlandığında ortada bir liste olmadığı anlamına geliyor.
system("pause"); // Kullanıcının herhangi bir giriş yapması bekleniyor.
anamenu(); // Ana Menü'ye dönülüyor.
}
while (current->data != deger) { // Tutulan node'un veri değeri, kullanıcıdan alınan değere eşit olmadığı sürece;
if (current->next == NULL) { // Eğer tail'a ulaşana kadar herhangi bir eşleşme sağlanmadıysa;
printf("\nDeger bulunamadi!");// Aranan değerin listede bulunmadığı yazdırılıyor.
system("pause"); // Kullanıcının herhangi bir giriş yapması bekleniyor.
anamenu(); // Döngüden çıkılıyor. Çünkü listede bu değer bulunmuyor.
} else { // Eğer tail'a ulaşılmadıysa;
current = current->next; // Sıradaki node'a geçiliyor.
}
}
// Yukarıdaki döngüde eşleşme bulundu ve silme işlemine geçilecek.
if(current == head) { // Eğer değerin bulunduğu node head ise;
head = head->next; // Head, kendisinden sonra bulunan node ile değiştiriliyor ve listeden ayrılmış oluyor.
} else { // Ancak, değerin bulunduğu node head'e eşit değil ise;
current->prev->next = current->next; // Değerin bulunduğu node'un öncesindeki node içerisinde bulunan sonraki değeri, değeri içeren node'un sonraki değeri ile değiştiriliyor. (1->next = 3)
cout << "\nDeger silindi!\n"; // Bu sayede değerin bulunduğu node atlanmış oluyor ve node siliniyor ve durum yazdırılıyor.
i++; // Kontrol değişkeni arttırılıyor. Değer hiç bulunamazsa değişken bu durumu öğrenmek için kullanılacak.
system("pause"); // Kullanıcının herhangi bir giriş yapması bekleniyor.
anamenu(); // Ana Menü'ye dönülüyor.
}
if(current == tail) { // Eğer değer tail node'unda bulunduysa;
tail = current->prev; // Tail'in öncesindeki node tail değeri olarak atanıyor. Böylelikle silme işlemi gerçekleşiyor.
} else { // Ancak, değerin bulunduğu node tail'a eşit değil ise;
current->next->prev = current->prev; // Değerin bulunduğu node'un sonrasındaki node içerisinde bulunan önceki değeri, değeri içeren node'un önceki değeri ile değiştiriliyor. (3->prev = 1)
cout << "\nDeger silindi!\n"; // Bu sayede değerin bulunduğu node atlanmış oluyor ve node siliniyor ve durum yazdırılıyor.
i++; // Kontrol değişkeni arttırılıyor. Değer hiç bulunamazsa değişken bu durumu öğrenmek için kullanılacak.
system("pause"); // Kullanıcının herhangi bir giriş yapması bekleniyor.
anamenu(); // Ana Menü'ye dönülüyor.
}
if(i > 0) { // Eğer bütün node'lar tamamlandığında i değişkeni 0'dan ise, bu durumda aranan değer listede bulunamadı sonucu çıkıyor.
printf("\nDeger bulunamadi!"); // Aranan değerin listede bulunmadığı yazdırılıyor.
system("pause"); // Kullanıcının herhangi bir giriş yapması 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