Ðaññìîòðèì ïðîöåññ ñîçäaíèя øaáëîía êëañña ía ïðèìåðå.  ðaçäåëå «Ëèíåéíûå ñïèñêè» (ñ. 115) áûë îïèñ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ññìîòðèì íåïaðaìåòðèçîâaííóþ âåðñèþ êëañña «ñïèñîê».
Cïèñîê ñîñòîèò èç óçëîâ, ñâяçaííûõ ìåæäó ñîáîé ñ ïîìîùüþ óêaçaòåëåé. Êaæ- äûé óçåë õðaíèò öåëîå ÷èñëî, яâëяþùååñя êëþ÷îì ñïèñêa. Îïèøåì âñïîìîãa- òåëüíûé êëaññ äëя ïðåäñòaâëåíèя îäíîãî óçëa ñïèñêa:
Class NOde{ publiC:
int d; // Äaííûå
NOde *next; // Óêaçaòåëü ía ïîñëåäóþùèé óçåë
NOde *prev; // Óêaçaòåëü ía ïðåäûäóùèé óçåë NOde(int dat = 0){ // Êîíñòðóêòîð
d = dat; next = 0; prev= 0;
}
};
Ïîñêîëüêó ýòîò êëaññ áóäåò îïèñaí âíóòðè êëañña, ïðåäñòaâëяþùåãî ñïèñîê, ïîëя äëя ïðîñòîòû äîñòóïa èç âíåøíåãî êëañña ñäåëaíû äîñòóïíûìè (publiC). Ýòî ïîçâîëяåò îáîéòèñü áåç ôóíêöèé äîñòóïa è èçìåíåíèя ïîëåé. Íaçîâåì êëaññ ñïèñêa List:
Class List{ Class NOde{
…
};
NOde *pbeg, *pend; // Óêaçaòåëè ía ía÷aëî è êîíåö ñïèñêa publiC:
List(){pbeg = 0; pend = 0;} // Êîíñòðóêòîð
~List(); // Äåñòðóêòîð
vOid add(int d); // Äîáaâëåíèå óçëa â êîíåö ñïèñêa NOde * find(int i); // Ïîèñê óçëa ïî êëþ÷ó
// Âñòaâêa óçëa d ïîñëå óçëa ñ êëþ÷îì key:
NOde * insert(int key, int d);
bOOl remOve(int key); // Óäaëåíèå óçëa
vOid print(); // Ïå÷aòü ñïèñêa â ïðяìîì íaïðaâëåíèè vOid print_baCk(); // Ïå÷aòü ñïèñêa â îáðaòíîì íaïðaâëåíèè
};
Ðaññìîòðèì ðåaëèçaöèþ ìåòîäîâ êëañña. Ìåòîä add âûäåëяåò ïaìяòü ïîä íîâûé îáúåêò òèïa NOde è ïðèñîåäèíяåò åãî ê ñïèñêó, îáíîâëяя óêaçaòåëè ía åãî ía÷aëî è êîíåö:
vOid List::add(int d){
NOde *pv= new NOde(d); // Âûäåëåíèå ïaìяòè ïîä íîâûé óçåë if (pbeg == 0)pbeg = pend = pv; // Ïåðâûé óçåë ñïèñêa
else{
// Câяçûâaíèå íîâîãî óçëa ñ ïðåäûäóùèì:
pv->prev = pend; pend->next = pv;
pend = pv;} // Îáíîâëåíèå óêaçaòåëя ía êîíåö ñïèñêa
}
Ïðè æåëaíèè ïîëó÷èòü îòñîðòèðîâaííûé ñïèñîê ýòîò ìåòîä ìîæíî çaìåíèòü ía ìåòîä, aíaëîãè÷íûé ôóíêöèè ôîðìèðîâaíèя îòñîðòèðîâaííîãî ñïèñêa add_sOrt, ïðèâåäåííîé â ðaçäåëå «Ëèíåéíûå ñïèñêè» ía ñ. 119.
Ìåòîä find âûïîëíяåò ïîèñê óçëa ñ çaäaííûì êëþ÷îì è âîçâðaùaåò óêaçaòåëü ía íåãî â ñëó÷aå óñïåøíîãî ïîèñêa è 0 â ñëó÷aå îòñóòñòâèя òaêîãî óçëa â ñïèñêå:
NOde * List::find( int d ){ NOde *pv= pbeg;
while (pv){
if(pv->d == d)break; pv= pv->next;
}
return pv;
}
Ìåòîä insert âñòaâëяåò â ñïèñîê óçåë ïîñëå óçëa ñ êëþ÷îì key è âîçâðaùaåò óêa- çaòåëü ía âñòaâëåííûé óçåë. Åñëè òaêîãî óçëa â ñïèñêå íåò, âñòaâêa íå âûïîëíя- åòñя è âîçâðaùaåòñя çía÷åíèå 0:
NOde * List::insert(int key, int d){
if(NOde *pkey = find(key)){ // Ïîèñê óçëa ñ êëþ÷îì key
// Âûäåëåíèå ïaìяòè ïîä íîâûé óçåë è åãî èíèöèaëèçaöèя: NOde *pv= new NOde(d);
// Óñòaíîâëåíèå ñâяçè íîâîãî óçëa ñ ïîñëåäóþùèì: pv->next = pkey->next;
// Óñòaíîâëåíèå ñâяçè íîâîãî óçëa ñ ïðåäûäóùèì: pv->prev = pkey;
// Óñòaíîâëåíèå ñâяçè ïðåäûäóùåãî óçëa ñ íîâûì: pkey->next = pv;
// Óñòaíîâëåíèå ñâяçè ïîñëåäóþùåãî óçëa ñ íîâûì: if( pkey != pend) (pv->next)->prev = pv;
// Îáíîâëåíèå óêaçaòåëя ía êîíåö ñïèñêa,
// åñëè óçåë âñòaâëяåòñя â êîíåö: else pend = pv;
return pv;
}
return 0;
}
Ìåòîä remOve óäaëяåò óçåë ñ çaäaííûì êëþ÷îì èç ñïèñêa è âîçâðaùaåò çía÷åíèå true â ñëó÷aå óñïåøíîãî óäaëåíèя è false, åñëè óçåë ñ òaêèì êëþ÷îì â ñïèñêå íå íaéäåí:
bOOl List::remOve(int key){ if(NOde *pkey = find(key)){
if (pkey == pbeg){ // Óäaëåíèå èç ía÷aëa ñïèñêa pbeg = pbeg->next;
pbeg->prev= 0;}
else if (pkey == pend){ // Óäaëåíèå èç êîíöa ñïèñêa pend = pend->prev;
pend->next = 0;}
else { // Óäaëåíèå èç ñåðåäèíû ñïèñêa (pkey->prev)->next = pkey->next;
(pkey->next)->prev= pkey->prev;} delete pkey;
return true;} return false;
}
Ìåòîäû ïå÷aòè ñïèñêa â ïðяìîì è îáðaòíîì íaïðaâëåíèè ïîýëåìåíòíî ïðîñìaò- ðèâaþò ñïèñîê, ïåðåõîäя ïî ñîîòâåòñòâóþùèì ññûëêaì:
vOid List::print(){ NOde *pv= pbeg;
COut << endl << "list: "; while (pv){
COut << pv->d << ' '; pv= pv->next;}
COut << endl;
}
vOid List::print_baCk(){ NOde *pv= pend;
COut << endl << " list baCk: "; while (pv){
COut << pv->d << ' '; pv = pv->prev;}
COut << endl;
}
Äåñòðóêòîð ñïèñêa îñâîáîæäaåò ïaìяòü èç-ïîä âñåõ åãî ýëåìåíòîâ:
List::~List(){
if (pbeg != 0){ NOde *pv= pbeg; while (pv){
pv= pv->next; delete pbeg; pbeg = pv;}
}
}
Íèæå ïðèâåäåí ïðèìåð ïðîãðaììû, èñïîëüçóþùåé êëaññ List. Ïðîãðaììa aía- ëîãè÷ía ïðèâåäåííîé ía ñ. 116: îía ôîðìèðóåò ñïèñîê èç 5 ÷èñåë, âûâîäèò åãî ía ýêðaí, äîáaâëяåò ÷èñëî â ñïèñîê, óäaëяåò ÷èñëî èç ñïèñêa è ñíîâa âûâîäèò åãî ía ýêðaí:
int main(){ List L;
fOr (inti= 1; i<6; i++) L.add(i); L.print();
L.print_baCk();
L.insert(2, 200);
if (!L.remOve(5))COut << "nOt fOund"; L.print();
L.print_baCk();
}
Êëaññ List ïðåäíaçía÷åí äëя õðaíåíèя öåëûõ ÷èñåë. ×òîáû õðaíèòü â íåì äaííûå ëþáîãî òèïa, òðåáóåòñя îïèñaòü ýòîò êëaññ êaê øaáëîí è ïåðåäaòü òèï â êa÷åñòâå ïaðaìåòða.
Cèíòanñèñ îïèñaíèя øaáëîía:
Do'stlaringiz bilan baham: |