Respond needs javascript to run. To find out more click here
C++ » Sayfa 3 » Serdar Demir
RSS
 

Archive for the ‘C++’ Category

Veri yapıları ve algoritmalr Yığınlar (Stack) Yığın

21 Eki

Veri yapıları ve algoritmalr Yığınlar (Stack) Yığın örnek uygulama proje

// stack::push/pop

#include

#include

using namespace std;

int main ()

{

stack<int> mystack;

for (int i=0; i<5; ++i) mystack.push(i);

cout << ”Popping out elements…”;

while (!mystack.empty())

{

cout << ” “ << mystack.top();

mystack.pop();

}

cout << endl;

return 0;

}

çıktı:

Popping out elements… 4 3 2 1 0

Örnek 2

// stack::push/pop

#include

#include

using namespace std;

int main ()

{

stack<int> mystack;

for (int i=0; i<5; ++i) mystack.push(i);

cout << ”Popping out elements…”;

while (!mystack.empty())

{

cout << ” “ << mystack.top();

mystack.pop();

}

cout << endl;

return 0;

}

Output: Popping out elements… 4 3 2 1 0
 
1 Comment

Posted in C++

 

Veri yapıları ve algoritmalar-Hazır Dizi (Vector)

21 Eki
// vector::pop_back
#include
#include
using namespace std;
int main ()
{
vector<int> myvector;
int sum (0);
myvector.push_back (100);
myvector.push_back (200);
myvector.push_back (300);
while (!myvector.empty())
{
sum+=myvector.back();
myvector.pop_back();
}
cout << “The elements of myvector summed ” << sum << endl;
return 0;
}
ÇIKTI:
Dizimin elemanlarının toplamı=600
Örnek 2
// vector::push_back
#include
#include
using namespace std;
int main ()
{
vector<int> myvector;
int myint;
cout << “tamsayi giriniz (sonlandırmak için 0):n”;
do {
cin >> myint;
myvector.push_back (myint);
} while (myint);
cout << “myvector kayıtları= ” << (int) myvector.size() << ” numbers.n”;
return 0;
}

Veri yapıları ve algoritmalar-Hazır Dizi (Vector) uygulaması örnek

// vector::pop_back

#include

#include

using namespace std;

int main ()

{

vector<int> myvector;

int sum (0);

myvector.push_back (100);

myvector.push_back (200);

myvector.push_back (300);

while (!myvector.empty())

{

sum+=myvector.back();

myvector.pop_back();

}

cout << “The elements of myvector summed ” << sum << endl;

return 0;

}

ÇIKTI:

Dizimin elemanlarının toplamı=600

Örnek 2

// vector::push_back

#include

#include

using namespace std;

int main ()

{

vector<int> myvector;

int myint;

cout << “tamsayi giriniz (sonlandırmak için 0):n”;

do {

cin >> myint;

myvector.push_back (myint);

} while (myint);

cout << “myvector kayıtları= ” << (int) myvector.size() << ” numbers.n”;

return 0;

}

 
1 Comment

Posted in C++

 

C++ Listeler (List)

21 Eki
// list::begin
#include
#include
using namespace std;
int main ()
{
int myints[] = {75,23,65,42,13};
list<int> mylist (myints,myints+5);
list<int>::iterator it;
cout << “listemin icerigi:”;
for ( it=mylist.begin() ; it != mylist.end(); it++ )
cout << ” ” << *it;
cout << endl;
return 0;
}
Ekran çıktısı:
Listemin icerigi: 75 23 65 42 13
ÖRNEK 2
// list::push_back
#include
#include
using namespace std;
int main ()
{
list<int> mylist;
int myint;
cout << “Please enter some integers (enter 0 to end):n”;
do {
cin >> myint;
mylist.push_back (myint);
} while (myint);
cout << “mylist stores ” << (int) mylist.size() << ” numbers.n”;
return 0;
}
Listeler (Lists)
Listelerin Özellikleri
Bilgisayar hafızasında belli bir sırayı takip eden adreslere yerleştirilmiş olan dizi elemanlarına bu adreslerin doğrudan hesaplanmasını sağlayan bir indeks değişkeni yardımıyla doğrudan erişilebilir. Liste elemanları için durum böyle değildir. Onlar bilgisayar hafızasında yanyana olmayan adreslere dağıtılmış olabilirler. Sırayla erişim için ya liste elemanlarının adreslerini saklayan bir adres değişkenleri dizisi (bir pointer array) kullanırız, ya da her liste elemanına bir sonraki elemanın adresini saklayan bir bağlantı (link) ekleriz. Bağlantılı bir liste elemanı kendi sayısal (veya karakter) değerinden başka bir de bir sonraki elemanın yerini bildiren bir adres değeri bulundurmak zorundadır. Her bir elemanı bir sonraki elemanla ilişkilendiren bağlantılarla oluşturulmuş listelere “bağlantılı listeler” (linked lists) diyeceğiz. Bülent Sankur’un Bilişim Sözlüğü (1) bu tür bir veri yapısı için “zincirli liste” terimini kullanıyor. Bir zincirin halkalarına da sıra numarasıyla doğrudan değil de ancak sırayla erişilebildiğine göre bu da mantıklı bir terimdir.
Eğer her bir liste elemanı Şekil 2‑2’deki gibi yalnızca bir sonraki elemanın yerini bildiren tek bir bağlantıya sahipse bu listeyi “tek bağlantılı liste” (singly linked list) diye adlandırabiliriz. Tek bağlantılı bir listede her eleman bir sonrakinin adresini saklar ve bu nedenle elemanlara ancak baştan sona doğru ilerleyen bir sırayla erişmek mümkündür. Tabi en baştaki elemanın nerede olduğunu bilmemiz için ilk elemanın adresini pİLK ile temsil edebileceğimiz bir adres değişkeninde saklamamız gerekir.
Her elemanın hem bir önceki, hem de bir sonraki elemanla bağlandığı bir listeye ise “çifte bağlantılı liste” (doubly linked list) adı verebiliriz. Çifte bağlantılı bir listede (eğer hem ilk, hem de son elemanların adresleri pİLK ve pSON gibi adres değişkenlerinde saklanmışsa) elemanlara hem baştan sona doğru, hem de sondan başa doğru da sırayla erişmek mümkündür.
Listeler ve Dizilerin bir Karşılaştırması
Bir listede sıra numarası verilerek herhangi bir liste elemanına bir kerede erişmemiz söz konusu olmadığı için bir dizi yerine bir liste kullanmak yanlış bir yol gibi gözükebilir. Üstelik bir liste elemanı kendi değerinin yanında bir de sonraki elemana işaret eden bir adres değişkeni içeren bir karmaşık değişken olarak tanımlanmış olmalıdır. C dilinde tamsayı değerli bir bağlantılı liste elemanı “struct” adı verilen değişken yapısıyla aşağıdaki gibi tanımlanabilir:
struct eleman
{
int Deger;
struct eleman *pSonraki;
}
Kısacası, bir liste bilgisayar hafızasında aynı türden aynı sayıda elemana sahip bir diziye göre daha fazla yer kaplar. Bu sorunlu yanlarına rağmen listeleri kullanışlı kılan yönleri esneklikleridir. Liste elemanları bir dizide olduğu gibi sürekli bir hafıza bloku oluşturmak zorunda değildirler. Değişik adreslerde bulunabilirler. Bir dizinin uzunluğu dizi yaratıldığı anda belirlenir ve sabit kalır; bir listenin uzunluğu ise son eleman istenen şekilde belirlenerek kolayca değiştirilebilir. Bir dizinin uzunluğunu değiştirmek için diziyi yeniden yaratmamız gerekir ki o zaman da bilgisayar hafızasında yine sürekli bir blok oluşturacak bir bölge bulmamız gerekir; bir listenin uzunluğunu değiştirmek için tek tek yeni elemanlar yaratabiliriz ve bunların hafızada yanyana olmalarına gerek yoktur. Aşağıdaki kod örneği her bir elemanı tek tek yaratarak N elemanlı bir tek bağlantılı bir liste oluşturuyor:
Kod Örneği 2‑4 Elemanların tek tek yaratılmasıyla tek bağlantılı bir liste oluşturulması
YARAT(pYeniEleman)
pİLK = pYeniEleman
pEleman = pİLK
for(i=2àN)
{
YARAT(pYeniEleman)
pEleman.pSonraki = pYeniEleman
pEleman = pEleman.pSonraki
}
pSON = pEleman
pSON.pSonraki = BOŞ
Yeni eklenecek elemanı yaratacak işlemi YARAT() diye temsil ettiğimiz bir fonksiyon çağrısıylatemsil ettik. Bu tür bir program yazacak bir okuyucumuz kullandığı programlama dilinde bu fonksiyon çağrısı yerine tek bir liste elemanı yaratacak işlem her neyse onu koymalıdır (Örneğin, C++ dilinde new). Yeni eleman yaratacak işlem her neyse bize yeni elemanın bulunduğu adresi verir ki yeni elemanımızın bulunduğu yere erişip gerekli işlemleri yapabilelim. Bu yeni eleman adresini pYeniEleman adlı bir adres değişkeniyle temsil ettik. İlk yaratılan yeni eleman adresini ayrıca pİLK adres değişkenine aktardık ki daha sonra listeyi baştan sona taramamız gerekirse listenin nerede başladığını hatırlayabilelim. Bundan sonra ikinci, üçüncü, … yeni elemanları yaratmamız gerekecekti. Bu işlemler için aynı komutları takrar tekrar yazmak yerine tekrarlanacak bir komutlar dizisi oluşturup bir döngü bloku içine yerleştirdik. O an üzerinde çalıştığımız ilk eleman adresini pEleman adlı adres değişkenine sakladık. Döngünün ilk komutu yine yani bir elaman yaratıp adresini pYeniEleman adlı adres değişkeninde sakladı. Bir önceki elemanın adresi ise pEleman’da saklıydı. Bir önceki eleman için sonraki eleman adresinin pYeniEleman’da olduğunu belirttik. Döngünün bir sonraki adımına geçmeden pEleman’a bu adımda yaratılan yeni elemanın adresini aktardık. Döngü bitiminde de son yarılmış olan elemanın adresi pSon adres değişkenine aktarıldı. Tek bağlantılı bir listede son eleman adresini saklamak zorunlu değildir ama sona eleman eklemek gerektiren bir durumda yararlı olabilir. Önemli olan bu son elemandan sonraki bir eleman olmadığı için son eleman için pSonraki adlı üye adres değişkenini BOŞ ile işaretlemektir.
Listelerle İlgili Özel İşlemler
·         Ara Elemanlara Erişim
Biraz önce açıkladığımız gibi ancak en baştaki liste elemanına doğrudan erişilebilir. Aradaki bir liste elemanına erişmek için baştan başlayarak o elemandan önceki bütün elemanları geçmek zorunda kalırız. Yapay dilimizle yazdığımız aşağıdaki kod tek bağlantılı bir listenin n’inci elemanına 25 değeri atama işinin nasıl yapılacağını gösteriyor:
Kod Örneği 2‑5 Tek bağlantılı bir listenin bir elemanına değer aktarılması
i = 1
pEleman = pİLK
while(i < n)
{
pEleman = pEleman.pSonraki
i++
}
pEleman.Değer = 25
Bu örneğimizde de yine gerçek programlama dillerinin çoğunda kullanılan while döngüsü kullanıyoruz. Bu örnekte while(i < n) ifadesi döngünün “i değeri n’den küçük iken” devam edeceğini belirtiyor. İndeks değişkeni i’nin değerinin her adımda bir arttırılacağını göstermek içinse kolay anlaşılır olduğu için C ve C++ gibi dillerde kullanılan ++ operatörünü kullanıyoruz.
Liste elemanının sayısal değeri için pEleman.Değer ifadesini kullandık. Bu örnekte her elemanın tek bir sayısal değeri vardı, ama gerçek bir programda elaman tek bir sayısal değer yerine bir öğrenci veya çalışanın bilgileri gibi bir çok üye değişkenden oluşan bir karmaşık değişken de taşıyabilir.
·
Ara Eleman Ekleme
Bir bağlantılı listede araya yeni bir eleman sokmamız gerektiğinde bu işi –ideal anlamda- tek bir adımla gerçekleştirebiliriz; tek yapacağımız şey yeni elemanın gireceği yerden bir önceki ve bir sonraki elemanda gerekli bağlantıları değiştirmektir. Ama yukarıda belirttiğimiz gibi ara elemanlara doğrudan erişim mümkün olmadığı için bu bağlantıları değiştirmeden önce yeni elemanın gireceği konuma erişecek bir döngü yazmamız gerekir:
Kod Örneği 2‑6 Tek bağlantılı bir listeye yeni bir eleman eklenmesi
i = 1
pEleman = pİLK
while(i < n-1)
{
pEleman = pEleman.pSonraki
i++
}
YARAT(pYeniEleman)
pYeniEleman.pSonraki = pEleman.pSonraki
pEleman.pSonraki = pYeniEleman
Bu örnekte önce bir döngü kullanarak (n-1)’inci elemana eriştik. (n-1)’inci elemana ait pSonraki üyesindeki adresi yeni elemanın pSonraki üyesine aktardık. Böylece yeni eleman kendisinden sonraki eleman olarak daha önceden n’inci sırada olan elemanı gördü. Son olarak da (n-1)’inci elemanın pSonraki üyesini yeni elemanın adresini gösterecek şekilde değiştirdik. Böylece bağlantılar yeni eleman listeye n’inci sırada girecek şekilde değiştirildi. Şekil 2‑3’de dört elemanlı bir listeye yeni bir elemanın eklenmesi grafik olarak gösterilmiştir. Yalnız bir noktayı vurgulamalıyız: Yeni eklenen elemanı yeni yaratılıyormuş gibi gösterdik ama öyle olmak zorunda değildir. Listedeki elemanlarla aynı cinsten olan mevcut bir elemanın adresini pYeniEleman’a aktarmış ve ondan sonra bu ekleme işlemini yapmış olabilirdik. O zaman eleman yaratma işlemi yapmazdık.
·         Ara Eleman Silme
Bir bağlantılı listede aradaki bir elemanlardan birini silmek için de tek yapacağımız şey silinecek elemandan bir önceki ve bir sonraki elemanda gerekli bağlantıları değiştirmektir. Tabi bu işlemleri ancak silinecek elemanın konumuna erişecek bir döngüden sonra yapabiliriz:
Kod Örneği 2‑7 Tek bağlantılı bir listeden bir eleman silinmesi
i = 1
pEleman = pİLK
while(i < n-1)
{
pEleman = pEleman.pSonraki
i++
}
pSilinecekEleman = pEleman.pSonraki
pEleman.pSonraki = pSilinecekEleman.pSonraki
SİL(pSilinecekEleman)
Döngü bitiminde pEleman (n-1)’inci elemanın adresini taşıyordu. Ondan sonraki eleman olan n’inci elemanın adresini pSilinecekEleman diya özel bir adres değişkeninde sakladık. Silinecek olan n’inci elemandan sonra gelen elemanın adresini (n-1)’inci elemanın içerdiği pSonraki adres değişkenine aktardık. Böylece (n-1)’inci eleman kendisinden sonraki eleman olarak artık daha önceden (n+1)’inci sırada olan elemanı görecektir. Yaptığımız son işlem de silinecek elemanın silinmesi oldu. Bunu yine yazılı olarak temsil ettik. Gerçek bir program uygulamasında bu işin nasıl yapılacağı kullanılan programlama diline bağlıdır. Duruma göre listeden çıkartılan elemanın silinmesi de gerekmeyebilir.

Veriyapıları ve algoritmalarda listeler önemli bir yer tutar.

// list::begin

#include

#include

using namespace std;

int main ()

{

int myints[] = {75,23,65,42,13};

list<int> mylist (myints,myints+5);

list<int>::iterator it;

cout << “listemin icerigi:”;

for ( it=mylist.begin() ; it != mylist.end(); it++ )

cout << ” ” << *it;

cout << endl;

return 0;

}

Ekran çıktısı:

Listemin icerigi: 75 23 65 42 13

ÖRNEK 2

// list::push_back

#include

#include

using namespace std;

int main ()

{

list<int> mylist;

int myint;

cout << “Please enter some integers (enter 0 to end):n”;

do {

cin >> myint;

mylist.push_back (myint);

} while (myint);

cout << “mylist stores ” << (int) mylist.size() << ” numbers.n”;

return 0;

}

Listeler (Lists)

Listelerin Özellikleri

Bilgisayar hafızasında belli bir sırayı takip eden adreslere yerleştirilmiş olan dizi elemanlarına bu adreslerin doğrudan hesaplanmasını sağlayan bir indeks değişkeni yardımıyla doğrudan erişilebilir. Liste elemanları için durum böyle değildir. Onlar bilgisayar hafızasında yanyana olmayan adreslere dağıtılmış olabilirler. Sırayla erişim için ya liste elemanlarının adreslerini saklayan bir adres değişkenleri dizisi (bir pointer array) kullanırız, ya da her liste elemanına bir sonraki elemanın adresini saklayan bir bağlantı (link) ekleriz. Bağlantılı bir liste elemanı kendi sayısal (veya karakter) değerinden başka bir de bir sonraki elemanın yerini bildiren bir adres değeri bulundurmak zorundadır. Her bir elemanı bir sonraki elemanla ilişkilendiren bağlantılarla oluşturulmuş listelere “bağlantılı listeler” (linked lists) diyeceğiz. Bülent Sankur’un Bilişim Sözlüğü (1) bu tür bir veri yapısı için “zincirli liste” terimini kullanıyor. Bir zincirin halkalarına da sıra numarasıyla doğrudan değil de ancak sırayla erişilebildiğine göre bu da mantıklı bir terimdir.

Eğer her bir liste elemanı Şekil 2‑2’deki gibi yalnızca bir sonraki elemanın yerini bildiren tek bir bağlantıya sahipse bu listeyi “tek bağlantılı liste” (singly linked list) diye adlandırabiliriz. Tek bağlantılı bir listede her eleman bir sonrakinin adresini saklar ve bu nedenle elemanlara ancak baştan sona doğru ilerleyen bir sırayla erişmek mümkündür. Tabi en baştaki elemanın nerede olduğunu bilmemiz için ilk elemanın adresini pİLK ile temsil edebileceğimiz bir adres değişkeninde saklamamız gerekir.

Her elemanın hem bir önceki, hem de bir sonraki elemanla bağlandığı bir listeye ise “çifte bağlantılı liste” (doubly linked list) adı verebiliriz. Çifte bağlantılı bir listede (eğer hem ilk, hem de son elemanların adresleri pİLK ve pSON gibi adres değişkenlerinde saklanmışsa) elemanlara hem baştan sona doğru, hem de sondan başa doğru da sırayla erişmek mümkündür.

Listeler ve Dizilerin bir Karşılaştırması

Bir listede sıra numarası verilerek herhangi bir liste elemanına bir kerede erişmemiz söz konusu olmadığı için bir dizi yerine bir liste kullanmak yanlış bir yol gibi gözükebilir. Üstelik bir liste elemanı kendi değerinin yanında bir de sonraki elemana işaret eden bir adres değişkeni içeren bir karmaşık değişken olarak tanımlanmış olmalıdır. C dilinde tamsayı değerli bir bağlantılı liste elemanı “struct” adı verilen değişken yapısıyla aşağıdaki gibi tanımlanabilir:

struct eleman

{

int Deger;

struct eleman *pSonraki;

}

Kısacası, bir liste bilgisayar hafızasında aynı türden aynı sayıda elemana sahip bir diziye göre daha fazla yer kaplar. Bu sorunlu yanlarına rağmen listeleri kullanışlı kılan yönleri esneklikleridir. Liste elemanları bir dizide olduğu gibi sürekli bir hafıza bloku oluşturmak zorunda değildirler. Değişik adreslerde bulunabilirler. Bir dizinin uzunluğu dizi yaratıldığı anda belirlenir ve sabit kalır; bir listenin uzunluğu ise son eleman istenen şekilde belirlenerek kolayca değiştirilebilir. Bir dizinin uzunluğunu değiştirmek için diziyi yeniden yaratmamız gerekir ki o zaman da bilgisayar hafızasında yine sürekli bir blok oluşturacak bir bölge bulmamız gerekir; bir listenin uzunluğunu değiştirmek için tek tek yeni elemanlar yaratabiliriz ve bunların hafızada yanyana olmalarına gerek yoktur. Aşağıdaki kod örneği her bir elemanı tek tek yaratarak N elemanlı bir tek bağlantılı bir liste oluşturuyor:

Kod Örneği 2‑4 Elemanların tek tek yaratılmasıyla tek bağlantılı bir liste oluşturulması

YARAT(pYeniEleman)

pİLK = pYeniEleman

pEleman = pİLK

for(i=2àN)

{

YARAT(pYeniEleman)

pEleman.pSonraki = pYeniEleman

pEleman = pEleman.pSonraki

}

pSON = pEleman

pSON.pSonraki = BOŞ

Yeni eklenecek elemanı yaratacak işlemi YARAT() diye temsil ettiğimiz bir fonksiyon çağrısıylatemsil ettik. Bu tür bir program yazacak bir okuyucumuz kullandığı programlama dilinde bu fonksiyon çağrısı yerine tek bir liste elemanı yaratacak işlem her neyse onu koymalıdır (Örneğin, C++ dilinde new). Yeni eleman yaratacak işlem her neyse bize yeni elemanın bulunduğu adresi verir ki yeni elemanımızın bulunduğu yere erişip gerekli işlemleri yapabilelim. Bu yeni eleman adresini pYeniEleman adlı bir adres değişkeniyle temsil ettik. İlk yaratılan yeni eleman adresini ayrıca pİLK adres değişkenine aktardık ki daha sonra listeyi baştan sona taramamız gerekirse listenin nerede başladığını hatırlayabilelim. Bundan sonra ikinci, üçüncü, … yeni elemanları yaratmamız gerekecekti. Bu işlemler için aynı komutları takrar tekrar yazmak yerine tekrarlanacak bir komutlar dizisi oluşturup bir döngü bloku içine yerleştirdik. O an üzerinde çalıştığımız ilk eleman adresini pEleman adlı adres değişkenine sakladık. Döngünün ilk komutu yine yani bir elaman yaratıp adresini pYeniEleman adlı adres değişkeninde sakladı. Bir önceki elemanın adresi ise pEleman’da saklıydı. Bir önceki eleman için sonraki eleman adresinin pYeniEleman’da olduğunu belirttik. Döngünün bir sonraki adımına geçmeden pEleman’a bu adımda yaratılan yeni elemanın adresini aktardık. Döngü bitiminde de son yarılmış olan elemanın adresi pSon adres değişkenine aktarıldı. Tek bağlantılı bir listede son eleman adresini saklamak zorunlu değildir ama sona eleman eklemek gerektiren bir durumda yararlı olabilir. Önemli olan bu son elemandan sonraki bir eleman olmadığı için son eleman için pSonraki adlı üye adres değişkenini BOŞ ile işaretlemektir.

Listelerle İlgili Özel İşlemler

·         Ara Elemanlara Erişim

Biraz önce açıkladığımız gibi ancak en baştaki liste elemanına doğrudan erişilebilir. Aradaki bir liste elemanına erişmek için baştan başlayarak o elemandan önceki bütün elemanları geçmek zorunda kalırız. Yapay dilimizle yazdığımız aşağıdaki kod tek bağlantılı bir listenin n’inci elemanına 25 değeri atama işinin nasıl yapılacağını gösteriyor:

Kod Örneği 2‑5 Tek bağlantılı bir listenin bir elemanına değer aktarılması

i = 1

pEleman = pİLK

while(i < n)

{

pEleman = pEleman.pSonraki

i++

}

pEleman.Değer = 25

Bu örneğimizde de yine gerçek programlama dillerinin çoğunda kullanılan while döngüsü kullanıyoruz. Bu örnekte while(i < n) ifadesi döngünün “i değeri n’den küçük iken” devam edeceğini belirtiyor. İndeks değişkeni i’nin değerinin her adımda bir arttırılacağını göstermek içinse kolay anlaşılır olduğu için C ve C++ gibi dillerde kullanılan ++ operatörünü kullanıyoruz.

Liste elemanının sayısal değeri için pEleman.Değer ifadesini kullandık. Bu örnekte her elemanın tek bir sayısal değeri vardı, ama gerçek bir programda elaman tek bir sayısal değer yerine bir öğrenci veya çalışanın bilgileri gibi bir çok üye değişkenden oluşan bir karmaşık değişken de taşıyabilir.

·

Ara Eleman Ekleme

Bir bağlantılı listede araya yeni bir eleman sokmamız gerektiğinde bu işi –ideal anlamda- tek bir adımla gerçekleştirebiliriz; tek yapacağımız şey yeni elemanın gireceği yerden bir önceki ve bir sonraki elemanda gerekli bağlantıları değiştirmektir. Ama yukarıda belirttiğimiz gibi ara elemanlara doğrudan erişim mümkün olmadığı için bu bağlantıları değiştirmeden önce yeni elemanın gireceği konuma erişecek bir döngü yazmamız gerekir:

Kod Örneği 2‑6 Tek bağlantılı bir listeye yeni bir eleman eklenmesi

i = 1

pEleman = pİLK

while(i < n-1)

{

pEleman = pEleman.pSonraki

i++

}

YARAT(pYeniEleman)

pYeniEleman.pSonraki = pEleman.pSonraki

pEleman.pSonraki = pYeniEleman

Bu örnekte önce bir döngü kullanarak (n-1)’inci elemana eriştik. (n-1)’inci elemana ait pSonraki üyesindeki adresi yeni elemanın pSonraki üyesine aktardık. Böylece yeni eleman kendisinden sonraki eleman olarak daha önceden n’inci sırada olan elemanı gördü. Son olarak da (n-1)’inci elemanın pSonraki üyesini yeni elemanın adresini gösterecek şekilde değiştirdik. Böylece bağlantılar yeni eleman listeye n’inci sırada girecek şekilde değiştirildi. Şekil 2‑3’de dört elemanlı bir listeye yeni bir elemanın eklenmesi grafik olarak gösterilmiştir. Yalnız bir noktayı vurgulamalıyız: Yeni eklenen elemanı yeni yaratılıyormuş gibi gösterdik ama öyle olmak zorunda değildir. Listedeki elemanlarla aynı cinsten olan mevcut bir elemanın adresini pYeniEleman’a aktarmış ve ondan sonra bu ekleme işlemini yapmış olabilirdik. O zaman eleman yaratma işlemi yapmazdık.

·         Ara Eleman Silme

Bir bağlantılı listede aradaki bir elemanlardan birini silmek için de tek yapacağımız şey silinecek elemandan bir önceki ve bir sonraki elemanda gerekli bağlantıları değiştirmektir. Tabi bu işlemleri ancak silinecek elemanın konumuna erişecek bir döngüden sonra yapabiliriz:

Kod Örneği 2‑7 Tek bağlantılı bir listeden bir eleman silinmesi

i = 1

pEleman = pİLK

while(i < n-1)

{

pEleman = pEleman.pSonraki

i++

}

pSilinecekEleman = pEleman.pSonraki

pEleman.pSonraki = pSilinecekEleman.pSonraki

SİL(pSilinecekEleman)

Döngü bitiminde pEleman (n-1)’inci elemanın adresini taşıyordu. Ondan sonraki eleman olan n’inci elemanın adresini pSilinecekEleman diya özel bir adres değişkeninde sakladık. Silinecek olan n’inci elemandan sonra gelen elemanın adresini (n-1)’inci elemanın içerdiği pSonraki adres değişkenine aktardık. Böylece (n-1)’inci eleman kendisinden sonraki eleman olarak artık daha önceden (n+1)’inci sırada olan elemanı görecektir. Yaptığımız son işlem de silinecek elemanın silinmesi oldu. Bunu yine yazılı olarak temsil ettik. Gerçek bir program uygulamasında bu işin nasıl yapılacağı kullanılan programlama diline bağlıdır. Duruma göre listeden çıkartılan elemanın silinmesi de gerekmeyebilir.

 
5 Comments

Posted in C++