struct Zanjir
{
int element;
Zanjir * keyingi;
};
Программа матни:
#include
struct Zanjir { int element; Zanjir * keyingi;};
Zanjir * Element_Joylash(Zanjir * z, int yangi_elem)
{
Zanjir * yangi=new Zanjir;
yangi->element=yangi_elem;
yangi->keyingi=0;
if(z)
// рўйхат бўш эмас
{
Zanjir * temp=z;
while(temp->keyingi)
temp=temp->keyingi;// рўйхатнинг охирги элементини
// топиш
temp->keyingi=yangi;// янги элементни рўйхат
// охирига қўшиш
}
else z=yangi;
// рўйхат бўш
return z;
// рўйхат боши адресини қайтариш
}
Zanjir * Element_Uchirish(Zanjir * z, int del_elem)
{
if(z)
{
Zanjir * temp=z;
Zanjir * oldingi=0; // жорий элементдан олдинги
// элементга кўрсаткич
while (temp)
{
72
if (temp->element==del_elem)
{
if(oldingi)
//ўчириладиган элемент биринчи эмас
{
// ўчириладиган элементдан олдинги элементни
// кейинги элементга улаш
oldingi->keyingi = temp->keyingi;
delete temp;
// элементни ўчириш
temp=oldingi->keyingi;
}
else
{
// ўчириладиган элемент рўйхат бошида
z=z->keyingi;
delete temp;
temp=z;
}
}
else // элемент ўчириладиган сонга тенг эмас
{
oldingi=temp;
temp=temp->keyingi;
}
}
}
return z;
}
void Zanjir_Ekranga(Zanjir * z)
{
cout<<"Zanjir elementlari:"<
Zanjir * temp=z;
while(temp)
{
cout<element<<' ';
temp=temp->keyingi;
}
cout<
}
Zanjir * Zanjirni_Uchirish(Zanjir * z)
{
Zanjir * temp=z;
while(z)
{
z=z->keyingi;
delete temp;
}
return z;
}
int main()
{
Zanjir * zanjir=0;
73
int son, del_element;
do
{
cout<<”\nSonni kiriting (0-jaryon tugatish): “;
cin>>son;
if(son) zanjir=Element_Joylash(zanjir,son);
} while (son);
Zanjir_Ekranga(zanjir);
cout<<"\nO’chiriladigan elementni kiriting: ";
cin>>del_element;
zanjir= Element_Uchirish(zanjir,del_element);
Zanjir_Ekranga(zanjir);
Zanjir = Zanjirni_Uchirish(zanjir);
return 0;
}
Programmaning bosh funktsiyasida chiziqli ro'yxat hosil qilish uchun Zanjir turidagi zanjir
o'zgaruvchisi aniqlangan bo'lib, unga bo'sh ko'rsatkich qiymati 0 berilgan (uning ekvivalenti -
NULL). Keyin takrorlash operatori tanasida klaviaturadan butun son o'qiladi va Element_Joylash()
funktsiyasini chaqirish orqali bu son ro'yxatga oxiriga qo'shiladi. Funktsiya yangi hosil bo'lgan
ro'yxat boshining adresini yana zanjir o'zgaruvchisiga qaytaradi. Agar klaviaturadan 0 soni kiritilsa
ro'yxatni hosil qilish jarayoni tugaydi. Faraz qilaylik quyidagi sonlar ketma-ketligi kiritilgan bo'lsin:
1,2,3,3,5,0. U holda hosil bo'lgan ro'yxat quyidagi ko'rinishda bo'ladi
Beshta sondan tashkil topgan chiziqli ro'yxat
Hosil bo'lgan ro'yxatni ko'rish uchun Zanjir_Ekranga() funktsiyasi chaqiriladi va ekranda
ro'yxat elementlari chop etiladi. Ro'yxat ustida amal sifatida berilgan son bilan ustma-ust tushadigan
elementlarni o'chirish masalasi qaralgan. Buning uchun o'chiriladigan son del_element
o'zgaruvchiga o'qiladi va u Element_Uchirish() funktsiyasi chaqirilishida argument sifatida
uzatiladi. Funktsiya bu son bilan ustma-ust tushadigan ro'yxat elementlarini o'chiradi (agar bunday
element mavjud bo'lsa) va o'zgargan ro'yxat boshining adresi-ni zanjir o'zgaruvchisiga qaytarib
beradi. Masalan, ro'yxatdan 3 soni bilan ustma-ust tushadigan elementlar o'chirilgandan keyin u
quyidagi ko'rinishga ega bo'ladi.
Ro'yxatdan 3 sonini o'chirilgandan keyingi ko'rinish
O'zgargan ro'yxat elementlari ekranga chop etiladi. Programma oxirida, Zanjirni_Uchirish()
funktsiyasini chaqirish orqali ro'yxat uchun dinamik ravishda ajratilgan xotira bo'shatiladi (garchi
bu ishning programma tugashi paytida bajarilishining ma'nosi yo'q).
Dinamik strukturalarda o'zgartirishlar (ro'yxatga element qo'shish yoki o'chirish) nisbatan kam
amallarda bajarilishi, ular vositasida masalalarni samarali echishning asoslaridan biri hisoblanadi.
74
Do'stlaringiz bilan baham: |