Bağlı liste (linked list) yardım

  • Konuyu başlatan Konuyu başlatan cnak
  • Başlangıç tarihi Başlangıç tarihi

cnak

Öğrenci
Katılım
20 Ekim 2010
Mesajlar
14
Reaksiyon puanı
0
Puanları
0
bağlı listeyle ilgili bilgi almak istiyorum fakat elimdeki kitapta bu konu yok.internette de öğretici yazılar ve örnekler bulamadım malum anlaşılması da zor bir konu.mesela elimde bir metin var ve kelimeleri bağlı listeye atmak istiyorum bunu yapmak için ne düşünmeliyim nasıl bir yol izlemeliyim.bağlı listelerin kullanımından bahsedermisiniz.
 
Katılım
31 Aralık 2007
Mesajlar
17,485
Reaksiyon puanı
189
Puanları
243
Pff çok gıcık bir konu. Anlat anlat bitmez. Bir sürü çeşidi var. Aklımda kalan çok az şey var ama onu da tarif etsem sanırım yanlış bilgi vermiş olurum. Ama işin hammallığından başka bir şey değil linked listler. Kullanacağını hiç sanmam...
 

yildirim234

Öğrenci
Katılım
24 Kasım 2010
Mesajlar
4
Reaksiyon puanı
0
Puanları
0
bağlı listede her eleman kendinden sonraki elemanın dizideki yerini gösteren bilgiye sahiptir. Çift yönlü listede ise, her eleman kendinden önceki ve sonraki elemanları gösterir. Linked List'e hamallık diyen, hiç kullanılmaz diyen insan bence börekçi salonu açsın daha iyi, bıraksın teknoloji işlerini. Dosyalama sistemleri tamamen bu linked list mantığına göre kuruludur. İşletim sisteminde processler işlemciye dispatch edilmeden tutulduğu listeler linked listtir. Hangi dilde uygulama geliştiriyorsan söylersen linked list örnek kodu verebilirim.

Not: Sürekli SDN'i takip ederim ama üye olmamıştım hiç. Aşırı saçma şeylerden bahsedenler görmüştüm de bu kadarına da dayanamayıp yorum yaptım, hatam varsa affola.
 
Katılım
31 Aralık 2007
Mesajlar
17,485
Reaksiyon puanı
189
Puanları
243
bağlı listede her eleman kendinden sonraki elemanın dizideki yerini gösteren bilgiye sahiptir. Çift yönlü listede ise, her eleman kendinden önceki ve sonraki elemanları gösterir. Linked List'e hamallık diyen, hiç kullanılmaz diyen insan bence börekçi salonu açsın daha iyi, bıraksın teknoloji işlerini. Dosyalama sistemleri tamamen bu linked list mantığına göre kuruludur. İşletim sisteminde processler işlemciye dispatch edilmeden tutulduğu listeler linked listtir. Hangi dilde uygulama geliştiriyorsan söylersen linked list örnek kodu verebilirim.

Not: Sürekli SDN'i takip ederim ama üye olmamıştım hiç. Aşırı saçma şeylerden bahsedenler görmüştüm de bu kadarına da dayanamayıp yorum yaptım, hatam varsa affola.

Yahu işin hammallığı tabi. Kim linked list hazırlamak için kasar ki. Zaten frameworkler ile her şey basite indirgendi. Gerekli bir şey olduğunu biliyorum ama bu kadar da geriye gitmeye gerek yok. Frameworkler ile zaten herşeyi otomatik yapabiliyorsun...
 

aeki

Öğrenci
Katılım
24 Kasım 2010
Mesajlar
1
Reaksiyon puanı
0
Puanları
0
yildirim234 eline sağlık
millet 2ghz 1gb ram li makinalara kod yazarak kendini programcı saydığından:) framework yapar tabi:)
 

yildirim234

Öğrenci
Katılım
24 Kasım 2010
Mesajlar
4
Reaksiyon puanı
0
Puanları
0
Programlama biliyor musun bilmiyorum ama framework kelimesini bildiğin kesin, aferin sana. Bir veri yapısını kullanman için bir kütüphane sana gerekli fonksiyonları, constructerları ve diğer araçları sunabilir, tekerleği yeniden keşfetmekten de iyidir, kullanılırsa çok da güzel olur. Ancak hiç bir veri yapısını bilmeden kullanamazsın. Ne olduğunu öğrenmek için oturur bir incelersin neymiş ne değilmiş, sonra kendin implemente edersin. Sonra nerde ihtiyacın olursa ister o kütüphaneyi kullanırsın ister başkasını.

Ama gidip de 4 mhz hızında bi mikrocontrollerda çalışırsan, bir işletim sistemi yazarsan veya buna benzer alt seviye işler yaparsan o framework para etmez ona göre. Sana önerim ilk önce "bilgisayar nedir" konulu makaleler okuyarak bu işlere başlayabilirsin.
 
Katılım
31 Aralık 2007
Mesajlar
17,485
Reaksiyon puanı
189
Puanları
243
Oturup işletim sistemi yazacak yada alt seviye bir iş yapacak değilim. Linked listleri de veri yerleştirme çıkartma yöntemlerini de bilirim. O kadar geri gitmeye emin ol gerek yok. İşin fantezisinden öteye gitmezsiniz. Günümüz compilerları zaten arrayleri gayet kullanışlı hale getirdi. Yeni dillerin üzerine frameworkler kullanılarak her şey daha pratik hale getirildi.

Bu saldırgan tavrından da vazgeç. Kimin neyi ne kadar bildiğini asla bilemezsin :) Klavye başından konuşmak kolaydır :)
 

t(>_<t)

Öğrenci
Katılım
3 Ekim 2009
Mesajlar
44
Reaksiyon puanı
3
Puanları
0
Merhaba mesela şöyle bir yapı oluşturduğunuzu varsayalım :
struct List
{
int val;
struct List * next;
};
typedef struct List Node;
Node *curr, *head;

Bu yapı içinde tuttuğunuz 2 şey var.
1. val adında bir integer.
2. List yapısı türünde next adında bir pointer.
Belki tam karşılığı olmasa bile;
atiyorum int a = 5; kodunda, hafızada 4 bytelik bir yer açılır içinede 5 yazılır.
sonra bu a denen şeye, hafızada 4 bytelık açılan yerin adresi atanir.
Burdada siz bu yukarıdaki yapıyı çağirdiğinizda,
hafızada içinde tuttuğunuz şeylerin boyutu kadar bir yer açılacak.
Sonra hafızada yer açılan adres oluşturduğunuz şeye atanacak.

Örnek vermek gerekirse:
curr = (Node *) malloc (sizeof(Node));
sizeof(Node) : List yapısı için gereken boyutu belirtir
malloc(int boyut) : hafızada, boyut kadar yer açar.
Node * : List tipinde bir pointer olduğunu belirtir.

Yani :
Node tipindeki curr adlı pointer a
1 - Node Yapısının Boyutu Belirlenir
2 - Bu Boyutta Hafızada Bir Yer Açılır
3 - Yer Açılan Adres Değeri Pointer'a Atanır
4 - Bu Adres curr'e eşitlenir

Linked listin temeli ihtiyacınıza göre belirlediğiniz bir yapıyı oluşturup,
İçine belli değerler girip, next pointerında başka Bir Node un adresini göstermektir.

Örneğin:
--------------
#include <stdio.h>
#include <stdlib.h>
// Yapinin Olusturulmasi
struct List
{
int val; // int degeri
struct List * next; // List yapsini gosteren Pointer
};
typedef struct List Node; // Node Adini Vererek Bu Yapiyi Olustur
Node *curr, *head; // Bu Yapiyi gosteren curr ve head adinda degiskenler olustur

void listeninBasinaNodeEkle(int deger)
{
// Yeni Bir Node Yarat
Node* tmp = (Node *)malloc(sizeof(Node));
// Node'un degerini Belirle
tmp->val = deger;
// Node'un Bir Sonraki Gosterdigi Nodeu head olarak Ayarla
tmp->next = head;
// head'i eklenen Node yap
head = tmp;
}

void listeninSonunaNodeEkle(int deger)
{
// Su Anki Nodeun Degerini Belirle
curr->val = deger;
// Yeni Bir Node Yarat
Node *tmp = (Node*)malloc(sizeof(Node));
// Node'un Bir Sonraki Gosterdigi Node'u NULL Olarak Ayarla
tmp->next = NULL;
// Su Andaki Node'un Bir Sonraki Gosterdigi Node'u Ayarla
curr->next = tmp;
// Su Andaki Node'u Ayarla
curr = tmp;
}

void listeyiBas()
{
// Ilk Node'a don
curr = head;
// Listenin Sonuna Kadar Git
while (curr->next != NULL)
{
// Node'un Degerini Bas
printf("%d ",curr->val);
// Node'u Ilerlet
curr = curr->next;
}
printf("\n");
}

void ara(int deger)
{
// Ilk Node'a Don
curr = head;
// Pozisyon Degeri
int pos = -1;
// Bulunma Degeri
int found = 0;
// Listenin Sonuna Kadar Git
while(curr->next != NULL)
{
//Poziyonu Ata
++pos;
if (curr->val == deger)
{
printf("%d %d Pozisyonunda Bulundu\n",deger, pos);
found = 1;
}
curr = curr->next;
}
// Eger Deger Bulunamadiysa
if (found == 0) printf("%d Listede Bulunamadi\n",deger);
}

// Olusturdugumuz Yapida Sadece Sonraki Node'u
// Tuttugumuz Icin, Geri Donus Yapamayiz :)
// Bunun Icin Recursive Fonksiyon Kullanip
// Ilk Bastan En Sona Kadar Gidip,
// Geriye Donuk Bir Bicimde Degerleri Bastirmamiz Lazim
void listeyiTerstenBas(Node * baslangic)
{
if(baslangic->next != NULL)
{
listeyiTerstenBas(baslangic->next);
printf("%d ",baslangic->val);
}
}

int main()
{
// Hafızada Yapı İçin Yer Ac
// Bu Yerin Adresini curr'e eşitle
curr = (Node *)malloc(sizeof(Node));
// curr'un Gosterdigi Yeri NULL'a esitle
curr->next = NULL;
// head'i curr'e esitle
head = curr;
// Listenin Basina Node Eklemek
// 1
// 2 1
// 3 1 2 Seklinde Olan Birsey
listeninBasinaNodeEkle(1);
listeninBasinaNodeEkle(2);
listeninBasinaNodeEkle(3);
// Listenin Sonuna Node Eklemek
// Su Anki Liste 3 1 2
// 10 Eklendikten Sonraki Hali : 3 1 2 10
// 20 Eklendikten Sonraki Hali : 3 1 2 10 20
listeninSonunaNodeEkle(10);
listeninSonunaNodeEkle(20);
// Listeyi Ekrana Bas
listeyiBas();
// Listede Deger Ara : 3
ara(3);
// Listede Deger Ara : 121
ara(35);
// Listeyi Tersten Bas
listeyiTerstenBas(head);
// 20 10 2 1 3
return 0;
}

Kodtaki bosluklar falan yok oldu, ama hala olmasi gerektigi gibi, umarim faydali olur ^^
 

nomak81

Öğrenci
Katılım
24 Kasım 2010
Mesajlar
1
Reaksiyon puanı
0
Puanları
0
Bende yıldırım arkadaş gibi şimdi üye oldum, bi nevi gülmek için :) Belki aeki de öyle yaptı :)
cnak arkadaş sen olumsuz şeylerden örnek alma, işe yaramaz falan bunları geç. Mantığını kap kullanırsın kullanmazsın sonra sana kalmış, elinde olsun bir bilgi. Bir arkadaş kod vermiş yararlı duruyor, tek yönlü listeyi çözdüğünde çift yönlüsüde basit gelicektir. Tabi bunları öğrenmeden önce struct ve pointer larıda bilmen gerekmekte. Bunlar içinde gereksiz diyeceklerdir ama sen aldırma :) Pointer ı kullanmıyorum şuan ve para kazanabiliyorum, ama bilmeden de işleri ilerletemiyorsun;)
 

cnak

Öğrenci
Katılım
20 Ekim 2010
Mesajlar
14
Reaksiyon puanı
0
Puanları
0
t(>_<t) çok teşekkür ederim kodunu incelicem faydalı olacaktır umarım.

---------- Post added at 15:45 ---------- Previous post was at 15:43 ----------

yıldırım c dilinde çalışıyorum örnek kodlar gönderirsen sevinirim.ayrıca desteğin için sağol.programlama açısından en kilit konulardan birisi bence.nomak tavsiyelerin için sağol
 

mjsamet

Asistan
Katılım
22 Aralık 2009
Mesajlar
149
Reaksiyon puanı
1
Puanları
0
Linked Listi kullanmasan da ne olduğunu ve mantığını bilmek eminim sana fayda sağlayacaktır. Farklı bakış açıları sunacaktır sana....
 
Üst