#include #include using namespace std; struct mezgls{ char nos[10]; mezgls *kdels; mezgls *lbralis; mezgls *kbralis; }; class apskata{ public: ifstream lasa; ofstream raksta; apskata(); bool sakums(); ~apskata(); void ielasa(); void rekursija(mezgls*); //rekursija, kas ielasa rindas 1. elementu void rekursija1(mezgls*); //rekursija, kas izmanto jau ielasiito rindas 1. elementu void izvada(); void izvrek(mezgls*); private: mezgls *sakne,*tmp,*tmp1,*tmp2; char cur,buf[10]; int a,b; }; apskata::apskata(){ //inicializaacija lasa.open("spogulis.in"); raksta.open("spogulis.out"); } bool apskata::sakums(){ //paarbauda vai kokaa nav tikai viena sakne sakne=new(mezgls); sakne->lbralis=sakne; for(int i=0;i<10;i++) buf[i]='\0'; lasa.get(cur); a=0; while((cur!=' ')&&(cur!='\n')){ buf[a]=cur; a++; lasa.get(cur); } buf[a]='\0'; strcpy(sakne->nos,buf); if(cur=='\n'){ raksta<nos<<'\n'; raksta<<0; sakne=NULL; return 0; }else{ lasa.close(); lasa.open("spogulis.in"); return 1; } } apskata::~apskata(){ //destruktors lasa.close(); raksta.close(); } void apskata::ielasa(){ //koka zimeshanas funkcija rekursija(sakne); } void apskata::rekursija(mezgls *apskata){ tmp=apskata; lasa.get(cur); a=0; while((cur!=' ')&&(cur!='\n')){ //ielasa rindas pirmo simbolu, tas ir mezglu, kuram buus beerni buf[a]=cur; a++; lasa.get(cur); } if(cur!='\n'){ //parbauda vai nav ielasiita 0 buf[a]='\0'; b=1; a=0; while(buf[a]!='\0'){ //saliidzina vai tas ir vajadziigais mezgls if(buf[a]!=apskata->nos[a]) b=0; a++; } if(b==1){ //ja tie ir atbilstoshaas saknes berni b=0; while(cur!='\n'){ lasa.get(cur); a=0; while((cur!=' ')&&(cur!='\n')){ //ielasa mezgla beernus buf[a]=cur; a++; lasa.get(cur); } b++; buf[a]='\0'; if(b==1){ //apskata vai tas nav mezgla 1. berns tmp1=new (mezgls); tmp1->kbralis=NULL; tmp1->kdels=NULL; tmp1->lbralis=apskata->lbralis; strcpy(tmp1->nos,buf); tmp2=tmp1; apskata->kdels=tmp1; tmp=tmp1; }else{ tmp1=new (mezgls); tmp1->kbralis=tmp; tmp1->kdels=NULL; tmp->lbralis=tmp1; tmp1->lbralis=apskata->lbralis; strcpy(tmp1->nos,buf); apskata->kdels=tmp1; tmp=tmp1; } } rekursija(tmp2); }else{ rekursija1(apskata->lbralis); } } } void apskata::rekursija1(mezgls *apskata){ tmp=apskata; b=1; a=0; while(buf[a]!='\0'){ if(buf[a]!=apskata->nos[a]) b=0; a++; } if(b==1){ b=0; while(cur!='\n'){ lasa.get(cur); a=0; while((cur!=' ')&&(cur!='\n')){ //ielasa mezgla beernus buf[a]=cur; a++; lasa.get(cur); } b++; buf[a]='\0'; if(b==1){ //apskata vai tas nav mezgla 1. berns tmp1=new (mezgls); tmp1->kbralis=NULL; tmp1->kdels=NULL; tmp1->lbralis=apskata->lbralis; strcpy(tmp1->nos,buf); tmp2=tmp1; apskata->kdels=tmp1; tmp=tmp1; }else{ tmp1=new (mezgls); tmp1->kbralis=tmp; tmp1->kdels=NULL; tmp->lbralis=tmp1; tmp1->lbralis=apskata->lbralis; strcpy(tmp1->nos,buf); apskata->kdels=tmp1; tmp=tmp1; } } rekursija(tmp2); }else{ tmp2=apskata->lbralis; rekursija1(apskata->lbralis); } } void apskata::izvada(){ //izsauc fju, kas ieraksta failaa izvrek(sakne); raksta<<"0"; } void apskata::izvrek(mezgls *aps){ tmp2=new(mezgls); if(aps->kdels!=NULL){ //ja nav neviena berna, tad neko neraksta raksta<nos; tmp2->kdels=aps->kdels; while(tmp2->kdels!=NULL){ //kameer ir kaads berns, tikmeer raksta tmp1=tmp2->kdels; raksta<<" "<nos; tmp2->kdels=tmp1->kbralis; } raksta<<"\n"; while(aps->kdels!=NULL){ //rekursiivi apskata visus mezgla beernus izvrek(aps->kdels); tmp1=aps->kdels; aps->kdels=tmp1->kbralis; } } delete(aps); delete(tmp2); } int main(){ apskata test; if(test.sakums()){ test.ielasa(); test.izvada(); } test.~apskata(); return 0; }