2 Aralık 2012 Pazar

LİNKED LİST ( BAĞLI LİSTELER ) C++

         Aynı class yapısına ait verilerin  bellek te bir pointer ( gösterici ) yardımıyla birbirlerine    
 bağlanmasıyla oluşan veri yapısına sıralı liste denir. 
Genel özellik bakımından Bağlı listeler ;
*Liste içindeki elemanların her biri aslında birer nesnedir.
*Her nesne 2 kısımdan oluşur. Data kısmı ve sıranın tutulduğu bir pointer.
*Bağlı listeyi bellekte tutmak için her zaman bir başlangıç pointer ( head ) gerekmektedir ve liste
 her zaman bu pointer’dan başlar.
*Data kısmı uygulamanın gereklerine göre istenilen her tipte olabilir. String, float, double, int gibi
değerlerden bir ve ye birkaçını anı anda içerebilir.
*Nesnelerin her biri kendi içinde bağlantı bilgisi içeren kendi türünden bir ya da birden fazla
pointer’ sahiptirler.
*Pointer’ lar herhangi bir nesnenin kendisinden önce ve kendisinden sonra hangi nesne geldiğinin
bilgisini tutar. 
*Bağlı listelerdeki son pointer “ NULL ” dur hiçbir yeri point etmez.
*Bağlı liste herhangi bir veriye göre sıralanabilir ya da serbest olarak  linked list halinde
bulunabilir.
*  Bağlı listeden istenildiği gibi nesne ekleyip nesne çıkartabiliriz.
*Bağlı listeler sıralı listelerdir ama bellekte sıralı olarak bulunmazlar. Birbirlerine sanal olarak
 bağlıdırlar .
* Hafızayı dinamik olarak kullanırlar, nesne silindiğinde hafızadaki yeri hemen boşaltılır. Nesne
eklenirken de sadece eklenecek nesne kadar yer açılır.

-- Genel olarak şekil üzerinde göstermek gerekirse bu şekilde bir yapıya  sahiptir:






Programlama kısmına gelince bağlı listelerde eleman ekleme, eleman silme, eleman arama,
listeleme gibi birçok fonksiyon kullanılabilir.  
Öncelikle kodlar c++’ta olduğu için nesnelerimizin datasını ve  next pointer’ını tutacak bir class
 tanımlamalıyız.

CLASS YAPISI:


#include<iostream>
using namespace std;


class list
{
int data; 
list *next;
  
public:
list(){};
void ekle(int);
void sil(int);
void listele();
int say();
};
list *head;        // bu listedeki tüm elemanlara erişeceğimiz head pointer  tanımlamasıdır ve global olarak tanımlamamız gerekir.



EKLE FONKSİYONU:


void list::ekle(int sayi)
{
list *newlist=new list;     // eklenecek nense için yer açılır.
newlist->data=sayi;         // data ve next pointer lar atanır.
newlist->next=0;
list *p=head;             // listede dolaşıcak bir pointer tanımlanır.
if(p==0) 
head=newlist;
else
{
while(p->next!=0)
  p=p->next;
p->next=newlist;    // en sona gelindiğinde eleman eklenmiş olur.

}
}

SİL FONKSİYONU : 


void list::sil(int x){
list *p=head;
list *temp=p;

if(p==0)
cout<<"listede eleman yok"<<endl;   

else if(p->next==0 && p->data==x)    // bir tane eleman var ve onun silindiği yer.
{
delete p; head=0;                            
}
else if(p==head && p->data==x)       // birçok eleman var ve baştakinin silindiği.
{
head=p->next;
delete p;
}
else
{   p=p->next;                      // diğer durumların siindiği yer .
while(p)
{                       
if(p->data==x) 
{
       temp->next=p->next;
break;
}
  p=p->next;
  temp=temp->next;

}
if(p==0)
cout<<"aradiginiz eleman yok."<<endl;
else
delete p;
}
}


LİSTELE FONKSİYONU: 


void list::listele()
{
list *p=head;
int i=1;
if(p==0)
cout<<"liste boss."<<endl;
else      
{
while(p)        // NULL elemana kadar gidip ekrana yazdırılıyor.
{
cout<<i<<".deger: "<<p->data<<endl;
p=p->next;
i++;
}                           
}
}


SAY FONKSİYONU : 


int  list::say()
{
int i=0;
list *p=head;
while(p)      // NULL elemena kadar gidip sayıyı geri döndürüyor.
{
p=p->next;
i++;
}
return i;
}


MAİN : 

int main()
{
list a;
char ch;
int i;
 while(1)
{
cout<<"********************************"<<endl<<"Eklemek icin  ---->E"<<endl<<"Silmek icin ------>S"<<endl<<"Saymak icin ------>Y"<<endl<<"Listelemek icin -->L"<<endl
<<"Cikis icin ------->C"<<endl<<"********************************"<<endl<<endl;
cin>>ch;
if (ch=='C')break;
switch(ch)
{
case 'E':
{
cout<<"eklemek istediginiz veriyi giriniz."<<endl<<endl;
cin>>i;
a.ekle(i);
break;
}
case 'S':
{
cout<<"silmek istediginiz veriyi giriniz."<<endl<<endl;
cin>>i;
a.sil(i);
break;
}
case'Y':
{
cout<<"listedeki sayi: "<<a.say()<<endl<<endl;
break;
}
case 'L':
{
a.listele();
break;
}
case'P':
break;
default:
{
cout<<"lutfen menudeki secenekleri seciniz."<<endl<<endl;
}
}
}
system("PAUSE");
return 0;
}


** Programın çıktısı ise şu şekildedir.






1 yorum:

  1. hocam bir az daha aciklama yapsaniz daha iyi olurdu bence ama emege saygi

    YanıtlaSil