2. Siyahılardan elementlərin silinməsi.
Biz qeyd etdik ki, siyahılara proqramın icrası boyu istədiymiz zaman istədiyimiz qədər yeni obyekt əlavə edə və siyahıda olan obyektləri silə bilərik.
Gəlin indi də siyahıdan elementlərin silinməsi qaydasını göstərək.
Tutaq ki, bizim 5 obyekti olan aşağıdakı kimi siyahımız var:
Əlbəttə, siyahının aşağısında göstərdiyimiz nömrələrin siyahı ilə heç bir əlaqəsi yoxdur, sadəcə konkret obyektlərə müraciəti asanlaşdırmaq üçün göstərmişik.
Biz bu siyahıdan üçüncü obyekti silmək istəyirik.
Əvvəlcə qrafik şəkildə görəcəyimiz işi təsvir edək, daha sonra müvafiq proqram kodunu daxil edərik.
Bunun üçün ilk olaraq 2-ci obyektin 3-cü obyektə olan istinadın 4-cü obyektə mənimsədirik:
Daha sonra 3-cü obyektin 4-cü obyektə olan istinadın ləğv edirik.
Hal-hazırda biz qarşımıza qoyduğumuz məqsədə nail olmuşuq, artıq siyahıdan 3-cü obyekt kənar edilib və 2-ci obyekt birbaşa 4-cü obyektə birləşib. Amma 3-cü obyekt hələ də yaddaşdadır və əgər o bizə lazım deyilsə, biz onu yaddaşdan silməliyik
İndi isə müvafiq proqram kodunu daxil edək.
Sadəlik üçün siyahı tipi olaraq yuxarıda elan etdiyimiz syh_el tipindən istifadə edək.
Tutaq ki, syh_el * tipindən olan syh dəyişəni elan olunub(siyahının başlanğıcı) və siyahıya 5 element əlavə olunub.
syh_el * tipindən olan p və q dəyişənlərini elan edək.
struct syh_el *p, *q;
p -ni siyahının başlanğıcına mənimsədək.
p = syh;
p -ni siyahının ikinci obyekti üzərinə sürüşdürək.
p = p->novb_el;
q -nü də ikinci obyektə mənimsətməliyik.
Bu bizə ikinci obyektin novb_el həddinə müraciət etməyə imkan verəcək.
Hal-hazırda p ikinci obyektə istinad etdiyindən daha siyahının əvvəldən başlamağa ehtiyac yoxdur və aşağıdakını yazırıq:
q = p;
p -ni siyahının 3-cü obyektinin üzərinə sürüşdürək.
p = p->novb_el;
Siyahının ikinci obyektinin novb_el həddini 4 -cü obyektə mənimsədək:
q->novb_el = p->novb_el;
3-cü obyektin siyahı ilə əlaqəsini ləğv edirik :
p->novb_el = NULL;
Əgər 3-cü obyekt daha lazım deyilsə, onda onu yaddaşdan silirik:
delete p;
Nəhayət, yuxarıda dediklərimizin hamısını icra edən konkret proqram nümunəsi tərtib edək.
Proqram 3.
#include
#include
struct syh_el{
int x;
struct syh_el *novb_el;};
syh_el *siyahi_yarat(struct syh_el *syh, int elem_say);
syh_el *siyahi_sil(struct syh_el *syh, int elem);
void siyahini_cap_et(struct syh_el *);
int main(int argc, char *argv[]){
// istifade edeceyimiz deyishenleri elan edirik
syh_el *menim_syh;
// siyahinin bosh oldugunu bildirmek ucun
menim_syh = NULL;
int say,elem;
std::cout<<"Siyahinin elementlerinin sayini daxil edin \n";
std::cin>>say;
menim_syh = siyahi_yarat(menim_syh,say);
siyahini_cap_et(menim_syh);
std::cout<<"Siayhidan silmek istediyiniz elementin indeksini daxil edin\n";
std::cin>>elem;
menim_syh = siyahi_sil(menim_syh, elem);
siyahini_cap_et(menim_syh);
return 0;
}
syh_el *siyahi_yarat( syh_el *syh, int elem_say){
syh_el *p, *q;
p=syh;
q=syh;
int i,dey;
for (i=1; i<=elem_say; ++i){
std::cout<<"siyahinin "<
std::cin>>dey;
p = new syh_el;
p->x = dey;
p->novb_el = NULL;
if (syh==NULL){
//siyahi boshdur, ilk element
syh=p;
q = p;
p = NULL; }
else {
//siyahida element var
q->novb_el = p;
q = p;
}
}
return syh;
}
void siyahini_cap_et( syh_el *syh){
syh_el *p; int dey;
p = syh;
if (syh == NULL ) {
std::cout<<"Siyahi boshdur \n";
return;
}
std::cout<<"Siyahinin elementleri \n";
while(p!=NULL){
dey = p->x;
std::cout<
p = p->novb_el; // novbeti elemente kec
}
std::cout<<"\n";
}
syh_el *siyahi_sil(syh_el *syh, int elem){
syh_el *p, *q;
p=syh;
int i,dey;
if (syh==NULL)
return NULL; // siyahi boshdur
if (elem==1){
// silmek istediyimiz element ilk elementdir
syh = p->novb_el;
p->novb_el = NULL;
delete p;
return syh;
}
for (i=1; i
if (p==NULL) break;
else
p = p->novb_el;
if (p==NULL){
std::cout<<"Siyahida "<
return syh; }
q=p;
p = p->novb_el;
if (p->novb_el==NULL) {
// silmek istediyimiz element sonuncu elementdir
q->novb_el=NULL;
delete p;
p=NULL;
q=NULL;
return syh;
}
// silmek istediyimiz element araliq elementdir
q->novb_el = p->novb_el;
p->novb_el = NULL;
delete p;
q=NULL;
return syh;
}
Dostları ilə paylaş: |