Professional Documents
Culture Documents
5-Bağlı Listeler
5-Bağlı Listeler
5-Bağlı Listeler
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.
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); }
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-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.