Задача этой книги дать краткое и четкое изложение языка С++ в соответствии со стандар том iso/iec 14882. Она предназначена для студентов, изучающих язык «с нуля»



Download 2 Mb.
bet72/232
Sana29.03.2022
Hajmi2 Mb.
#516205
TuriЗадача
1   ...   68   69   70   71   72   73   74   75   ...   232
Bog'liq
Т. А. Павловская C C . Программирование на языке высокого уровня

Линейные списки


Caìûé ïðîñòîé ñïîñîá ñâяçaòü ìíîæåñòâî ýëåìåíòîâ — ñäåëaòü òaê, ÷òîáû êaæ- äûé ýëåìåíò ñîäåðæaë ññûëêó ía ñëåäóþùèé. Òaêîé ñïèñîê íaçûâaåòñя îäíîía- ïðaâëåííûì (îäíîñâяçíûì). Åñëè äîáaâèòü â êaæäûé ýëåìåíò âòîðóþ ññûëêó — ía ïðåäûäóùèé ýëåìåíò, ïîëó÷èòñя äâóíaïðaâëåííûñ ñïèñîn (äâóñâяçíûñ), åñëè ïîñëåäíèé ýëåìåíò ñâяçaòü óêaçaòåëåì ñ ïåðâûì, ïîëó÷èòñя nîëüöåâîñ ñïèñîn.
Êaæäûé ýëåìåíò ñïèñêa ñîäåðæèò nëþ÷, èäåíòèôèöèðóþùèé ýòîò ýëåìåíò. Êëþ÷ îáû÷íî áûâaåò ëèáî öåëûì ÷èñëîì, ëèáî ñòðîêîé è яâëяåòñя ÷añòüþ ïîëя äaí- íûõ.  êa÷åñòâå êëþ÷a â ïðîöåññå ðaáîòû ñî ñïèñêîì ìîãóò âûñòóïaòü ðaçíûå
÷añòè ïîëя äaííûõ. Íaïðèìåð, åñëè ñîçäaåòñя ëèíåéíûé ñïèñîê èç çaïèñåé, ñî- äåðæaùèõ ôaìèëèþ, ãîä ðîæäåíèя, ñòaæ ðaáîòû è ïîë, ëþáaя ÷añòü çaïèñè ìî- æåò âûñòóïaòü â êa÷åñòâå êëþ÷a: ïðè óïîðяäî÷èâaíèè ñïèñêa ïî aëôaâèòó êëþ-
÷îì áóäåò ôaìèëèя, a ïðè ïîèñêå, ê ïðèìåðó, âåòåðaíîâ òðóäa êëþ÷îì áóäåò ñòaæ. Êëþ÷è ðaçíûõ ýëåìåíòîâ ñïèñêa ìîãóò ñîâïaäaòü.
Íaä ñïèñêaìè ìîæíî âûïîëíяòü ñëåäóþùèå îïåðaöèè:

  • ía÷aëüíîå ôîðìèðîâaíèå ñïèñêa (ñîçäaíèå ïåðâîãî ýëåìåíòa);

  • äîáaâëåíèå ýëåìåíòa â êîíåö ñïèñêa;

  • ÷òåíèå ýëåìåíòa ñ çaäaííûì êëþ÷îì;

  • âñòaâêa ýëåìåíòa â çaäaííîå ìåñòî ñïèñêa (äî èëè ïîñëå ýëåìåíòa ñ çaäaííûì êëþ÷îì);

  • óäaëåíèå ýëåìåíòa ñ çaäaííûì êëþ÷îì;

  • óïîðяäî÷èâaíèå ñïèñêa ïî êëþ÷ó.

Ðaññìîòðèì äâóíaïðaâëåííûé ëèíåéíûé ñïèñîê. Äëя ôîðìèðîâaíèя ñïèñêa è ðaáîòû ñ íèì òðåáóåòñя èìåòü ïî êðaéíåé ìåðå îäèí óêaçaòåëü — ía ía÷aëî ñïèñ- êa. Óäîáíî çaâåñòè åùå îäèí óêaçaòåëü — ía êîíåö ñïèñêa. Äëя ïðîñòîòû äîïóñ- òèì, ÷òî ñïèñîê cîñòîèò èç öåëûõ ÷èñåë, òî åñòü îïèñaíèå ýëåìåíòa ñïèñêa âûãëя- äèò ñëåäóþùèì îáðaçîì:

struCt NOde{ int d;


NOde *next; NOde *prev;
};
Íèæå ïðèâåäåía ïðîãðaììa, êîòîðaя ôîðìèðóåò ñïèñîê èç 5 ÷èñåë, äîáaâëяåò
÷èñëî â ñïèñîê, óäaëяåò ÷èñëî èç ñïèñêa è âûâîäèò ñïèñîê ía ýêðaí. Óêaçaòåëü ía ía÷aëî ñïèñêa îáîçía÷åí pbeg, ía êîíåö ñïèñêa — pend, âñïîìîãaòåëüíûå óêaça- òåëè — pv è pkey.
inClude struCt NOde{
int d;
NOde *next;
NOde *prev;
};
//------------------------------------------------
NOde * first(int d);
vOid add(NOde **pend, int d);
NOde * find(NOde * COnst pbeg, int i);
bOOl remOve(NOde **pbeg, NOde **pend, int key);
NOde * insert(NOde * COnst pbeg, NOde **pend, int key, int d);
//------------------------------------------------
int main(){
NOde *pbeg = first(1); // Ôîðìèðîâaíèå ïåðâîãî ýëåìåíòa ñïèñêa NOde *pend = pbeg; // Cïèñîê çaêaí÷èâaåòñя, åäâa ía÷aâøèñü
// Äîáaâëåíèå â êîíåö ñïèñêa ÷åòûðåõ ýëåìåíòîâ 2, 3, 4, è 5: fOr (inti= 2; i<6; i++)add(&pend, i);
// Âñòaâêa ýëåìåíòa 200 ïîñëå ýëåìåíòa 2: insert(pbeg, &pend, 2, 200);
// Óäaëåíèå ýëåìåíòa 5:
if(!remOve (&pbeg, &pend, 5))COut << "íå íaéäåí"; NOde *pv= pbeg;
while (pv){ // âûâîä ñïèñêa ía ýêðaí COut << pv->d << ' ';
pv= pv->next;
}
return 0;
}
//------------------------------------------------
// Ôîðìèðîâaíèå ïåðâîãî ýëåìåíòa NOde * first(int d){
NOde *pv= new NOde;
pv->d = d; pv->next = 0; pv->prev = 0; return pv;
}
//------------------------------------------------

// Äîáaâëåíèå â êîíåö ñïèñêa vOid add(NOde **pend, int d){


NOde *pv= new NOde;
pv->d = d; pv->next = 0; pv->prev = *pend; (*pend)->next = pv;
*pend = pv;
}
//------------------------------------------------
// Ïîèñê ýëåìåíòa ïî êëþ÷ó
NOde * find(NOde * COnst pbeg, int d){ NOde *pv= pbeg;
while (pv){
if(pv->d == d)break; pv= pv->next;
}
return pv;
}
//------------------------------------------------
// Óäaëåíèå ýëåìåíòa
bOOl remOve(NOde **pbeg, NOde **pend, int key){
if(NOde *pkey = find(*pbeg, key)){ // 1 if (pkey == *pbeg){ // 2
*pbeg = (*pbeg)->next; (*pbeg)->prev= 0;}
else if (pkey == *pend){ // 3
*pend = (*pend)->prev; (*pend)->next = 0;}
else{ // 4
(pkey->prev)->next = pkey->next; (pkey->next)->prev= pkey->prev;}
delete pkey;
return true; // 5
}
return false; // 6
}
//------------------------------------------------
// Âñòaâêa ýëåìåíòa
NOde * insert(NOde * COnst pbeg, NOde **pend, int key, int d){ if(NOde *pkey = find(pbeg, key)){
NOde *pv= new NOde; pv->d = d;
// 1 - óñòaíîâëåíèå ñâяçè íîâîãî óçëa ñ ïîñëåäóþùèì: pv->next = pkey->next;
// 2 - óñòaíîâëåíèå ñâяçè íîâîãî óçëa ñ ïðåäûäóùèì: pv->prev = pkey;
// 3 - óñòaíîâëåíèå ñâяçè ïðåäûäóùåãî óçëa ñ íîâûì: pkey->next = pv;

// 4 - óñòaíîâëåíèå ñâяçè ïîñëåäóþùåãî óçëa ñ íîâûì: if( pkey != *pend) (pv->next)->prev = pv;


// Îáíîâëåíèå óêaçaòåëя ía êîíåö ñïèñêa,
// åñëè óçåë âñòaâëяåòñя â êîíåö: else *pend = pv;
return pv;
}
return 0;
}
Ðåçóëüòaò ðaáîòû ïðîãðaììû:
12 20034
Âñå ïaðaìåòðû, íå èçìåíяåìûå âíóòðè ôóíêöèé, äîëæíû ïåðåäaâaòüñя ñ ìîäè- ôèêaòîðîì COnst. Óêaçaòåëè, êîòîðûå ìîãóò èçìåíèòüñя (íaïðèìåð, ïðè óäaëå- íèè èç ñïèñêa ïîñëåäíåãî ýëåìåíòa óêaçaòåëü ía êîíåö ñïèñêa òðåáóåòñя ñêîð- ðåêòèðîâaòü), ïåðåäaþòñя ïî aäðåñó.
Ðaññìîòðèì ïîäðîáíåå ôóínöèþ óäaëåíèя ýëåìåíòa èç ñïèñna remOve. Åå ïaðaìåò- ðaìè яâëяþòñя óêaçaòåëè ía ía÷aëî è êîíåö ñïèñêa è êëþ÷ ýëåìåíòa, ïîäëåæaùå- ãî óäaëåíèþ.  ñòðîêå 1 âûäåëяåòñя ïaìяòü ïîä ëîêaëüíûé óêaçaòåëü pkey, êî- òîðîìó ïðèñâaèâaåòñя ðåçóëüòaò âûïîëíåíèя ôóíêöèè íaõîæäåíèя ýëåìåíòa ïî êëþ÷ó find. Ýòa ôóíêöèя âîçâðaùaåò óêaçaòåëü ía ýëåìåíò â ñëó÷aå óñïåøíîãî ïîèñêa è 0, åñëè ýëåìåíòa ñ òaêèì êëþ÷îì â ñïèñêå íåò. Åñëè pkey ïîëó÷aåò íåíó- ëåâîå çía÷åíèå, óñëîâèå â îïåðaòîðå if ñòaíîâèòñя èñòèííûì (ýëåìåíò ñóùåñòâó- åò), è óïðaâëåíèå ïåðåäaåòñя îïåðaòîðó 2, åñëè íåò — âûïîëíяåòñя âîçâðaò èç ôóíêöèè ñî çía÷åíèåì false (îïåðaòîð 6).
Óäaëåíèå èç ñïèñêa ïðîèñõîäèò ïî-ðaçíîìó â çaâèñèìîñòè îò òîãî, íaõîäèòñя ýëåìåíò â ía÷aëå ñïèñêa, â ñåðåäèíå èëè â êîíöå.  îïåðaòîðå 2 ïðîâåðяåòñя, ía- õîäèòñя ëè óäaëяåìûé ýëåìåíò â ía÷aëå ñïèñêa — â ýòîì ñëó÷aå ñëåäóåò ñêîððåê- òèðîâaòü óêaçaòåëü pbeg ía ía÷aëî ñïèñêa òaê, ÷òîáû îí óêaçûâaë ía ñëåäóþùèé ýëåìåíò â ñïèñêå, aäðåñ êîòîðîãî íaõîäèòñя â ïîëå next ïåðâîãî ýëåìåíòa. Íîâûé ía÷aëüíûé ýëåìåíò ñïèñêa äîëæåí èìåòü â ñâîåì ïîëå óêaçaòåëя ía ïðåäûäóùèé ýëåìåíò çía÷åíèå 0.
Åñëè óäaëяåìûé ýëåìåíò íaõîäèòñя â êîíöå ñïèñêa (îïåðaòîð 3), òðåáóåòñя ñìå- ñòèòü óêaçaòåëü pend êîíöa ñïèñêa ía ïðåäûäóùèé ýëåìåíò, aäðåñ êîòîðîãî ìîæ- íî ïîëó÷èòü èç ïîëя prev ïîñëåäíåãî ýëåìåíòa. Êðîìå òîãî, íóæíî îáíóëèòü äëя íîâîãî ïîñëåäíåãî ýëåìåíòa óêaçaòåëü ía ñëåäóþùèé ýëåìåíò. Åñëè óäaëåíèå ïðîèñõîäèò èç ñåðåäèíû ñïèñêa, òî åäèíñòâåííîå, ÷òî íaäî ñäåëaòü, — îáåñïå÷èòü äâóñòîðîííþþ ñâяçü ïðåäûäóùåãî è ïîñëåäóþùåãî ýëåìåíòîâ. Ïîñëå êîððåêòè- ðîâêè óêaçaòåëåé ïaìяòü èç-ïîä ýëåìåíòa îñâîáîæäaåòñя, è ôóíêöèя âîçâðaùaåò çía÷åíèå true.
Ðaáîòa ôóínöèè âñòaânè ýëåìåíòa â ñïèñîê ïðîèëëþñòðèðîâaía ía ðèñ. 3.2. Íî- ìåða îêîëî ñòðåëîê ñîîòâåòñòâóþò íîìåðaì îïåðaòîðîâ â êîììåíòaðèяõ.
Cîðòèðîâêa ñâяçaííîãî ñïèñêa çaêëþ÷aåòñя â èçìåíåíèè ñâяçåé ìåæäó ýëåìåíòa- ìè. Àëãîðèòì ñîñòîèò â òîì, ÷òî èñõîäíûé ñïèñîê ïðîñìaòðèâaåòñя, è êaæäûé ýëå- ìåíò âñòaâëяåòñя â íîâûé ñïèñîê ía ìåñòî, îïðåäåëяåìîå çía÷åíèåì åãî êëþ÷a.


pkey pkey->next



Download 2 Mb.

Do'stlaringiz bilan baham:
1   ...   68   69   70   71   72   73   74   75   ...   232




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish