Veri Yapıları etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Veri Yapıları etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

28 Aralık 2012 Cuma

YIĞIN ( STACK ) C++

       Veri  yapılarının  önemli  kısımalarından  biri de yığın yapısıdır. Yığın  yani stack yapısı  bircok programlama  mantığında  kullanılmaktadır.  Çalışma şekli  gayet  basittir LİFO  ( Last İn First Out ) mantığına  gore  çalışır  yani  son  giren   eleman  ilk önce  kullanılır. Farklı bir şekilde  ifade  edicek  olursakta  kova  mantığını  kullanabiliriz  yani  kovaya  verilerimizi  attığımızı  düşünelm  verileri  alırkende en  son atılan  ilk  önce alınıcaktır.  Programlama  mantığında  ise  bu  işlemler  push ( eleman itme ) pop ( elemen çekme ) diye  belirtilen iki komutla gerçekleşir.
            Bu konu hakkında bir c++ kodu ile bilgi vermek gerekirse, boyutunu kendimin belirlediği ve integer eleman eklenip silindiği basit yapılı bir programla örnek vermek istedim .
Eklemek , saymak, getirmek, listelemek ve çıkmak komutlarının bulunduğu programın çalışma prensibini şekil üzerinde göstericeğm .




1.      durumda  elemnların eklendiğini görüyoruz. 2.   durumda  ise yığın mantığı gereği
eleman slime işleminde en üstteki elemanı alıyoruz. 3.  durumda  ise tekrardan eleman silindiğinde yine en üstteki elemanın silindiğini görüyoruz.

Program çıktısi ise şu şekildedir :





Programın kodları :  


#include<iostream>

using namespace std ;


class yigin {

private:
       int rear;
       int data;
       int *dizi;
       int size;

public:
       yigin(int);
       void ekle(int);
       int say();
       void listele();
       void getir();

};


yigin::yigin(int boy)
{
       rear=0;
       size=boy;
       dizi = new int [boy];
}

void yigin::ekle(int x)
{
       if(rear==size)
              cout<<"yiginda yeterli alan yoktur..."<<endl;
       else
       {
       dizi[rear]=x;
       rear=rear+1;
      
       }
}

int yigin::say()
{
       return rear  ;
}

void yigin::getir()
{
       if(rear== 0)
              cout<<"yiginda eleman yoktur.."<<endl;
       else
       {
              cout<<"ilk elemen :"<<dizi[rear-1]<<endl;
              rear=rear-1;
       }
}

void yigin::listele()
{
       if(rear==0)
              cout<<"yigin bos ..."<<endl;
       else
       {int i;
              for(i=0;i<rear;i++)
                     cout<<i+1<<". eleman : "<<dizi[i]<<endl;
       }
}

int main (){
      
       char y;
       int x,a;
       cout<<"kuyrugun boyutunu giriniz: "<<endl;
       cin>>x;
       yigin anil(x);
      

       while(1){
              cout<<"Eklemek    --> E"<<endl<< "Saymak     --> S "<<endl<< "Getirmek   --> G"<<endl<<"Listelemek --> L"<<endl<<"cikmak     --> C"<<endl;
              cin>>y;
              if(y=='C')break;
       switch ( y ){

       case 'E':
              { cout<<"eklemek istediginiz sayiyi giriniz:";
              cin>>a;
              anil.ekle(a);}break;

       case'S': cout<<"kuyrugun boyu --> "<<anil.say()<<endl; break;

       case'G': anil.getir(); break;

       case'L': anil.listele(); break;
             

       default: cout<<"yanlis bir harf girdiniz."; break;
      
       }

       }

       system("PAUSE");
       return 0;

}


Bu şekildedir. Iyi çalışmalar J


16 Aralık 2012 Pazar

KUYRUK ( QUEUE ) C++

            Veri yapıları’nın ( Data Structures  )  önemli kısımlarından biridir. Adından da anlaşılacağı gibi çalışma sistemini gülük hayattaki herhangi bir kuyruğa benzetebiliriz.  Gerçek hayatta kuyruğa ilk giren kişi ilk çıkar aynı mantık veri yapılarında da vardır. İlk giren ilk çıkar mantığıyla çalışır yani FİFO ( First in first our ) .

            basit yapılı bir programda göstermek gerekirse ( C++  ):




#include<iostream>

using namespace std;

class queue
{
       int f;
       int r;
       int size;
       int *a;
       int p;
public:
       queue(int sayi):size(sayi+1)
       {
           a= new int [size];
              f=0;
              r=0;
              p=0;
             
       };
       int say();
       void ekle(int);
       void listele();
       void getir();
};


void queue::ekle(int sayi)
{
      
      
       if(f==(r+1)%(size))
       {
              cout<<"Bos yer yok"<<endl;
      
       }
       else
       {
              a[r]=sayi;
              r=(r+1)%(size); p++;
       }
}

void queue::listele()
{
       int i,x=1;
       for(i=f;i<p;i++,x++)
              cout<<x<<".eleman"<<a[i%size]<<endl;
}

void queue:: getir()
{
       if(f==r)
              {cout<<"Kuyruk bos"<<endl;
       }
       else
       {
              cout<<"ilk eleman : "<<a[f]<<endl;
              a[f]=0;
              f=(f+1)%(size);}

}
int queue::say()
{
       if((r-f)<0)
              return -(r-f);
       else
              return r-f;
}


int main()
{
       char y;
       int x,a;
       cout<<"kuyrugun boyutunu giriniz: "<<endl;
       cin>>x;
       queue anil(x);
      

      

       while(1){
              cout<<"Eklemek    --> E"<<endl<< "Saymak     --> S "<<endl<< "Getirmek   --> G"<<endl<<"Listelemek --> L"<<endl<<"cikmak     --> C"<<endl;
              cin>>y;
              if(y=='C')break;
       switch ( y ){

       case 'E':
              { cout<<"eklemek istediginiz sayiyi giriniz:";
              cin>>a;
              anil.ekle(a);}break;

       case'S': cout<<"kuyrugun boyu --> "<<anil.say()<<endl; break;

       case'G': anil.getir(); break;

       case'L': anil.listele(); break;
             

       default: cout<<"yanlis bir harf girdiniz."; break;
      
       }

       }

       system("PAUSE");
       return 0;
}


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.