1 Aralık 2012 Cumartesi

BAĞLI LİSTELER(LINKED-LIST)


Bağlı listeler dizilerdeki gibi boyuta bağlı olmayan dinamik bir yapıdır.Dizilerde boyut önemlidir ve  ihtiyaç duyulduğun da  yer açabilirsiniz ama bu hem uğraştırıcı hem de pahalı bir işlemdir.Bunun için boyuttan bağımsız bağlı listelere ihtiyaç duyarız.
Yandaki  şekilden bahsedelim biraz.Head dediğimiz gösterici(pointer) her zaman listenin ilk elemanını gösterir.Ekleme,silme,arama
 gibi işlemleri gerçekleştirirken her zaman headden başlanır.Yandaki her bir düğümde veriler saklanır ve göstericilerle şekildeki gibi birbirine bağlanır.Son düğüm şekildeki gibi kendini yani NULL 'u gösterir.
Gelin bütün işlemleri bir  uygulama yaparak görelim.

//Öncelikle sınıfımızı(class) oluşturalım.


#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;

//1-ELEMAN EKLEMEK

void list::ekle(int sayi)  //sınıfımızın üyesini tanımladık.

{
list *newlist=new list;          //burada eklenecek yeni düğüm için yer açılır.
newlist->data=sayi;            //düğümümüzün elemanı eklenir
newlist->next=0;      
list *p=head;
if(p==0)                           //listede hiç eleman olmamasıdır.
head=newlist;
else
{
while(p->next!=0)
   p=p->next;
p->next=newlist;
}
}

//2-ELEMAN SİLMEK

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

if(p==0)       //liste boş olduğunda uyarı verir.
cout<<"Listede eleman yok"<<endl;
       else if(p->next==0 && p->data==x)           //listede tek eleman vardır ve silmek istenen elemandır
{
delete p; head=0;
}
else if(p==head && p->data==x)   //listedeki ilk eleman silmek istediğiniz elemandır.
{
head=p->next;
delete p;
}
else
{   p=p->next;          
while(p)
{                    
if(p->data==x)
{
       temp->next=p->next;
break;
}
  p=p->next;
  temp=temp->next;
           }
if(p==0)                       // eğer tüm liste dolaşılmış ancak bulunamamışsa uyarı verir.
cout<<"Aradiginiz eleman yok."<<endl;
else
delete p;
}
}

//3-ELEMANLARI LİSTELEMEK

void list::listele()
{
list *p=head;
int i=1;
if(p==0)
cout<<"Liste Bos."<<endl;
else
{
               while(p)
{
cout<<i<<".deger: "<<p->data<<endl;
p=p->next;
i++;
}                        
}
}



//4-ELEMANLARI SAYMAK

int  list::say()
{
int i=0;
list *p=head;
while(p)
{
p=p->next;
i++;
}
return i;
}

//ve son olarak main  kısmı...

int main()
{
list a;
char ch;
int i;
 do
{
cout<<"MENU:"<<endl<<"1-Eklemek icin (E)"<<endl<<"2-Silmek icin (S)"<<endl<<"3-Saymak icin (Y)"<<endl<<"4-Listelemek icin (L)"<<endl
<<"5-Cikis icin (P)"<<endl<<"seciniz..."<<endl<<endl;
cin>>ch;
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 seceneklerden birini  seciniz."<<endl<<endl;
}
}

}while(ch!='P');
system("PAUSE");
return 0;
}












Hiç yorum yok:

Yorum Gönder