5-Bağlı Listeler

You might also like

Download as ppt, pdf, or txt
Download as ppt, pdf, or txt
You are on page 1of 47

BALI LSTELER

Balantl Liste le glili Kavramlar


Balantl listeler zerine yaplan baz tanmlamalar yledir: Balantl Liste (Linked List):Kme elemanlarnn birbirlerine bir balant bilgisi zerinden balanm liste yapsdr. Yaln bir dizide elemanlar birbirini izleyen srada bulunurlarken, balantl listede her elemann veri alanna ek olarak bir balant alan bulunur ve bu alanlar ard arda gelen srada olmayabilirler.Liste Uzunluu (Length of List):Listedeki kaytlarn/dmlerin saysdr. Eer elaman says sfr ise bo liste olarak adlandrlr ve karakteriyle veya {} eklinde gsterilir.Altliste (Sublist):Listenin, genel zellikleri ayn kalmak kouluyla, zerinde hareket edilebilecek belirli bir parasdr. Bo liste de bir altliste olup uzunluu sfrdr. Tek Ynl Balantl Liste (One-Linked Liste):Dmler arasnda tek ynl balant vardr; listenin bandan sonuna doru hareket edilebilir. Ekleme, arama, listeleme gibi ilemlerin karmakl olur.ift Ynl Balantl Liste (Double-Linked List):Dmler arasndaki balant ekilde a)'a grld gibi iki ynldr; bir dm hem bir sonraki hem de bir nceki dm iaret eder. Dolaysyla iki ynl hareket edilebilir. ki iareti deiken kullanlrsa, arama ve listeleme maliyetleri yine O(n) olurken ekleme maliyeti O(1) olur. evrimsel Balantl Liste (Circular Linked List):evrimsel balantl listelerde ekilde b)'de grlecei gibi dmler arasnda evrimsel bir balant vardr; eer elemanl bir balantl listede adm hareket edilirse, yine, listenin balad noktaya dnlr. Karma Balantl Liste (Hybrid Linked List):Allgoritma tasarmn kolaylatrlmas amacyla, eitli balantl listelerin bir araya getirilmesiyle oluturulan listeler karma balantl liste olarak adlandrlr. Gereksinime gre, dier balantl listelerin zellikleri alnr ve yeni bir balantl liste modeli oluturulur; baz durumlarda karma balantl liste graf veri modeline kayabilir.

Balantl liste dizi zerinde tutulacaksa en az iki yesi olan bir topluluk bildirimi yaplmaldr; bir veri, dieri balant bilgisi iindir. Eer birden ok, rnein n tane veri varsa topluluun yesi (n+1) tane olur; iki-ynl balantl listede (n+2) tane olur.

Ekleme lemi
Listeye ekleme ileminde iki nemli nokta vardr: eer liste bo {} ise, daha nce hibir kayt ekleme yaplmamsa yaplacak ilemlerle, listede kayt varsa yaplacak ilemler farkl olur. Aadaki kaba-koddan grlecei gibi nce listenin durumu snanmtr; listede halhazrda eleman varsa yeni ekleme son ile gsterilen elemann arkasna eklenir ve son iaretisi yeni eklenen eleman gsterecek biimde ayarlanr.

Yukardaki kaba-kodun C dilindeki karl aada verilmitir; grlecei gibi her eyden nce listenin ban gsteren iaretinin NULL olup olmadna baklyor; eer NULL'dan farkl ise, yeni eklenecek olan son adl iaretinin belirttii dme yaplr; NULL ise, liste botur ve ilk dm eklemesi yaplmaldr.

Listeleme lemi
Bir balantl liste zerindeki dmlerin ierdii bilgileri listeleme ilemi adm adm yaplr; ilk nce 1. dm ierii gsterilir; daha sonra arkasndan gelen 2.dm, 3.dm eklinde gider. Eer, bir dmn arka ksmnda NULL ile karlalrsa listeleme sonlanr. Aada listeleme iin kaba-kod grlmektedir:

Yukarda verilen kaba-kodun C dilindeki karl Fonksiyon-8.2.'de verilmitir; yazEkrana() adl fonksiyon bu rnek iin, dmdeki iki bilgiyi ekrana yazan bir fonksiyondur. Fonksiyon listeleme yaparsa 0, bo liste ise -1 gnderir. Listeleme ileminin karmakl olur; nk herhangi bir anda tane BLISTE varsa herbirine srayla gidilmelidir.

Balantl listeyi listeleme ( tek ynl)

Balantl listede arama ( tek ynl)

Yukardaki kaba-kodda grld gibi, nce silinen aranmaktadr; silinmesi istenen ve bir nceki dmn adresleri bulunmakta ve silinmesi istenen aradan karlmaktadr. Dikkat edilirse silinmesi istenen halhazrda ilk dm ise ayr, aradan bir dm ise ayr kod yrtlmektedir. Dm silindikten sonra igal ettii bellek alan serbest braklr.

/* Listeden bir dm silme */ BLISTE *sil(int silinecek) { BLISTE *p, *bironceki; p=ilk; bironceki=NULL; while(p) { /* silinecek olan aranyor... */ if(silinecek==p->bilgi) break; bironceki=p; p=p->arka; } /* silinecek listede varsa o ve bir nceki bulundu */ if(p!=NULL) { if(bironceki==NULL) { /* silinecek olan birinci dm! */ if(ilk==son) { /* listede yalnzca 1 dm varsa */ ilk=NULL; son=NULL; } else ilk=ilk->arka; } else { /* silinecek olan aradan bir dm */ bironceki->arka=p->arka; if(bironceki->arka==NULL) son=bironceki; /*silinen son dm */ } free(p); /* alan serbest braklyor */ return p; /* NULL'dan farkl adres gnderiliyor */ } else return NULL; /* silinmek istenen listede yok */ }

#include <stdio.h> #include <stdlib.h> #include <conio.h> /* Listedeki dmlerin veri yaps tanmlamas */ typedef struct topluluk { int bilgi; char mesaj[100]; struct topluluk *arka; }BLISTE; /* Listenin ilk ve son dm adreslerinin tutan iaretileri */ BLISTE *ilk=NULL, *son=NULL; /* Fonksiyon bildirimleri */ BLISTE *ara(int); BLISTE *sil(int); BLISTE *okuKlavye(); void yazEkrana(BLISTE *);

/* Ana Program*/ main() { BLISTE *eklenecek, *ki; int bilgi, sonuc; char secim; while(1) { puts("\nEkleme\nListeleme\nArama\nSilme\nk\nSeiminiz?"); secim=getchar(); switch(secim) { case 'E': eklenecek=okuKlavye(); if(eklenecek!=NULL) ekle(eklenecek); else puts("Ekleme iin Bellek Dolu\n"); break; case 'L': sonuc=listele(); if(sonuc==-1) puts("Bo Liste !"); break; case 'A': puts("Aranan:"); scanf("%d", &bilgi); ki=ara(bilgi); if(ki==NULL) puts("Aranan Bulunamad"); else yazEkrana(ki); break; case 'S': puts("Silinecek:"); scanf("%d", &bilgi); ki=sil(bilgi); if(ki!=NULL) puts("Silindi..."); else puts("Silinmek istenen yok!"); break; case '': case '': case 'c': case 'C': puts ("Hoakal!"); exit(0); default: puts("Yanl Seim!!!\n"); } /* switch'in */ } /* while dngsnn */ } /* ana programn */

/* Kayt ekleme fonksiyonu */ int ekle(BLISTE *ki) { if(ilk!=NULL) { son->arka=ki; son=ki; son->arka=NULL; } else { /* ilk kayt ise buras yrtlr */ ilk=ki; son=ilk; ilk->arka=NULL; } return 0; } /* Listedeki tm kaytlar listeleme */ int listele() { BLISTE *p; p=ilk; /* Listenin balang adresi p'ye alnyor */ if(p==NULL) return -1; /* bo liste */ while(p) { /* NULL olana kadar dnlr */ yazEkrana(p); p=p->arka; } return 0; /* listeleme yapld anlamnda */ } /* Liste zerinde bir kayt arama */ BLISTE *ara(int aranan) { BLISTE *p; p=ilk;

while(p) { if(p->bilgi==aranan) /* aranan m ? */ return p; /* evet ise adresini gnder */ p=p->arka; /* hayr ise bir sonrakine ge */ }
return NULL; /* bulunamam ise NULL gnder */ }

/* Listeden bir kayt silme */ BLISTE *sil(int silinecek) { BLISTE *p, *bironceki; p=ilk; bironceki=NULL; while(p) { /* silinecek olan aranyor... */ if(silinecek==p->bilgi) break; bironceki=p; p=p->arka; } /* silinecek listede varsa o ve bir nceki bulundu */ if(p!=NULL) { if(bironceki==NULL) { /* silinecek olan birinci dm! */ if(ilk==son) { /* listede yalnzca 1 dm varsa */ ilk=NULL; son=NULL; } else ilk=ilk->arka; } else { /* silinecek olan aradan bir dm */ bironceki->arka=p->arka; if(bironceki->arka==NULL) son=bironceki; /*silinen son dm */ } free(p); /* alan serbest braklyor */ return p; /* NULL'dan farkl adres gnderiliyor */ } else return NULL; /* silinmek istenen listede yok */ } /* Bir kayt bilgisini ekrana yazar */ void yazEkrana(BLISTE *yazilacak) { printf("bilgi:%d, mesaj:%s\n",yazilacak->bilgi, yazilacak->mesaj); }

Dizi zerinde balantl listeye dm ekleme

Listenin ban ve sonunu tutacak ilk2 ve son2 adl deikenler de aadaki gibi bildirilir. BLISTE2 *ilk2=NULL, *son2=NULL ki-ynl balant liste zerinde ekleme, silme gibi ilemler yaplrken hem arka hem de n balantlar kurulmaldr. Tek ynl de yalnzca arka balant olduu iin daha yaln gerekletirilmitir. ki ynl balantda zellikle silme ilemi kolayca yaplr. nk balantlarn koparlp yeniden kurulmas iin, liste zerinde iki ynl hareket edilebilir.

ki Ynl Listeye Ekleme lemi


ki-ynl listeye ekleme yaplrken hem n hem arkada olan dmlere balant kurulmaldr. Dm eklerken dikkat edilmesi gereken nemli nokta ilk ekleme ileminin farkl olmasdr. Aadaki ekilde ekleme ilemi ilk dm iin ve daha sonraki dmler iin ayr ayr gsterilmitir. Bu ii kotaracak bir C fonksiyonu ise Fonksiyon-6.9.'da verildii gibi olabilir. Yukardaki fonksiyon kendisine gelen adresi, eklenecek dmn bellekte tutulduu adres olarak kabul edip iki-ynl balantl listeye ekler. Grlecei gibi ilk nce liste zerinde halhazrda dm olup olmad snanmtr. Eer dm varsa hemen if deyiminden sonraki satrlar, dm yok ise, bunun ilk ekleme olduu varsaylarak else'den sonraki satrlar yrtlr

ki Ynl Listede Listeleme lemi


ki ynl listede listeleme en basit ilemlerden birisidir. Listeleme ilemi en yaln ilemlerden birisidir; listenin bandan balanarak sonuna kadar dolalarak liste zerindeki dmler listelenir. Bu ilem zaman karmakl O(n) olur. Bu fonksiyonda ilk yaplan kontrol listenin bo olup olmadnn snanmasdr; eer liste bo ise arana "liste bo" anlamnda -1 says gnderilir. Liste bo deilse, while ile kurulan evrimin iine girilir. Liste zerinde dolalrken de dm verileri ileme sokulur; burada dm bilgileri goster(p) adl fonksiyona gnderilmitir. Listeleme ilemi bittikten sonra, baarl oldu anlamnda 0 says gnderilmitir.

ki Ynl Listede Arama lemi


Arama ilemi liste bandan balanp sonuna kadar dmler zerinde dolalarak aranan bilginin o dmde olup olmadna baklr. Arama ileminde, yapsal bakmdan listelemeye benzer; liste bandan balanp sonuna kadar dmler zerinde dolalarak aranan bilginin o dmde olup olmadna baklr. Fonksiyon-6.9.'de arama iini kotaracak C fonksiyonu verilmitir. Grlecei gibi while ile kurulan dng ierisinde bir karlatrma yaplmakta ve bulunursa ilgili dmn bellek adresi gnderilmektedir. Bu fonksiyon, aranan listede birka tane varsa, onlar arasndan nce olann bulur.

ki Ynl Listede Silme/ Listeden karma lemi

ki-yn balantl listeden dm silme/koparma ilemi aadaki ekilde gsterildii gibi yaplr. Eer koparlan ilk dmse, listenin ban tutan ilk2 adl iaretinin ierii de deitirilmelidir. Aradaki bir dmse, hemen nndeki ve arkasndaki u dmlerle balants koparlmal ve daha sonra bu iki u dm kendi aralarnda balanmaldr.

You might also like