Последовательность камней домино представить в виде двунаправленного списка, заполненного произвольным образом. Исключить все дубли, вывести результат. АЛГОРИТМ: #include <STDIO.H> #include <IOSTREAM.H> #include <CONIO.H> #include <STDLIB.H> #include <time.h> class Dlists { public: Dlists(); Dlists& set(unsigned int,unsigned int,unsigned int =count);//добавляет элемент Dlists& del(unsigned int =count-1); //удаляет элемент unsigned int getUp(unsigned int =0) const; //читает 1 часть элемента списка unsigned int getDown(unsigned int =0) const;//читает 2 часть элемента списка unsigned int getcount() const; //количество элементов списка ~Dlists(); private: struct dlist{ dlist* previous; int UpN; int DownN; dlist* next; }; dlist *Head; //указывает на первый элемент из списка unsigned int count; //содержит количество элементов списка };//end class Dlists //---------------------------------------------------------------------------- //Dlists function Dlists::Dlists(){ Head=0; count=0; } //-------------------------------------- Dlists& Dlists::set(unsigned int Up,unsigned int Down,unsigned int N){ if(Up>6) return *this; if(Down>6) return *this; if( N > count ) return *this; if(N==0){ if(!count ){ dlist* iX=new dlist; Head=iX; iX->next=iX; iX->UpN=Up; iX->DownN=Down; iX->previous=iX; count++; return *this; }else{ dlist* iX=new dlist; iX->next=Head; iX->UpN=Up; iX->DownN=Down; iX->previous=(Head->previous); (Head->previous)->next=iX; Head->previous=iX; Head=iX; count++; return *this; }; }; dlist* lX; lX=Head; if(count/2<=N){ for(unsigned int i=N;i>=2;i--){ lX=(lX->next); }; }else{ for(unsigned int i=count;i>=N;i--){ lX=(lX->previous); }; }; dlist*iX=new dlist; iX->UpN=Up; iX->DownN=Down; iX->next=(lX->next); (lX->next)->previous=iX; iX->previous=lX; lX->next=iX; count++; return *this; }//end set() //-------------------------------------- Dlists& Dlists::del(unsigned int N){ if( N >= count ) return *this; if(N==0){ if(1==count){ delete Head; Head=NULL; }else{ dlist* lX; lX=Head; Head=(Head->next); Head->previous=(lX->previous); (lX->previous)->next=Head; delete lX; }; count--; return *this; }; dlist* lX; lX=Head; if(count/2<=N){ for(unsigned int i=N;i>=2;i--){ lX=(lX->next); }; }else{ for(unsigned int i=count;i>=N;i--){ lX=(lX->previous); }; }; dlist* lY; lY=(lX->next); lX->next=(lY->next); (lY->next)->previous=lX; delete lY; count--; return *this; }//end del() //-------------------------------------- unsigned int Dlists::getUp(unsigned int N) const{ if( N >= count ) return 0; dlist* lX; lX=Head; if(count/2<=N){ for(unsigned int i=N;i>=1;i--){ lX=(lX->next); }; }else{ for(unsigned int i=count;i>N;i--){ lX=(lX->previous); }; }; return (lX->UpN); }//end get() //-------------------------------------- unsigned int Dlists::getDown(unsigned int N) const{ if( N >= count ) return 0; dlist* lX; lX=Head; if(count/2<=N){ for(unsigned int i=N;i>=1;i--){ lX=(lX->next); }; }else{ for(unsigned int i=count;i>N;i--){ lX=(lX->previous); }; }; return (lX->DownN); }//end get() //-------------------------------------- unsigned int Dlists::getcount() const{ return count; } //-------------------------------------- Dlists::~Dlists(){ if(count!=0){ for(unsigned int i=count;i>0;i--)del(); }; } //end DLists function-------------------- int main(){//---------------------------------------------------------- Dlists domino; unsigned int i,j,N; for(j=0;j<=6;j++){ //Создадим кости домино for(i=0;i<=6;i++) domino.set(i,j); }; N=domino.getcount(); //напечатаем кости for(i=0;i<N;i++) cout<<domino.getUp(i); cout<<"\n"; for(i=0;i<N;i++) cout<<domino.getDown(i); cout<<"\n"; cout<<N<<" fishek domino\n\n"; time_t t; //Перемешаем кости srand((unsigned) time(&t)); for(i=0;i<N;i++){ j=rand()%(N-i); domino.set(domino.getUp(j),domino.getDown(j)); domino.del(j); }; for(i=0;i<N;i++) cout<<domino.getUp(i);//напечатаем кости cout<<"\n"; for(i=0;i<N;i++) cout<<domino.getDown(i); cout<<"\n"; cout<<N<<" fishek domino v sluchajnom porjadke\n\n"; for(i=0;i<N;i++){ //удалим дубли if(domino.getUp(i)==domino.getDown(i)){; domino.del(i); i--; N--; }; }; for(i=0;i<N;i++) cout<<domino.getUp(i);//напечатаем кости cout<<"\n"; for(i=0;i<N;i++) cout<<domino.getDown(i); cout<<"\n"; cout<<N<<" fishki domino bez dublej\n"; getch(); return 1; };//end main----------------------------------------------------------------
Ключевые слова:
двунаправленные списки домино
|
|||||||