Класс работы со списком

ЗАДАНИЕ:
Дан список из последовательности натуральных чисел. Добавить в список после максимального элемента минимальный.

АЛГОРИТМ:
1.Создадим класс содержащий:
1.элементы данные:
1.1.1. структура:
данные элемента списка + указатель на следующий элемент списка
1.1.2. указатель(голова) всегда указывающий на первый элемент списка
1.1.3. счетчик содержащий количество элементов списка(обьектов
класса)
2.элементы функции:
1.2.1.функция добавляющая элемент
1.2.2.функция удаляющая элемент списка
1.2.3.функция чтения данных элемента списка
1.2.4.функция чтения количества элементов списка
2.Введем 20 случайных элементов списка
3.За один проход списка сохраним первые встретившиеся максимальные и
минимальные элементы и их порядковые номера в списке
4.Удалим минимальный элемент списка и запишем его после максимального

#include <STDIO.H>
#include <IOSTREAM.H>
#include <CONIO.H>
#include <STDLIB.H>
#include <time.h>
 
class Lists
{
   public:
      Lists();
      ~Lists();
      Lists& set(unsigned int,unsigned int =count);//записывает с добавкой
      Lists& del(unsigned int =count-1);	   //удаляет элемент
      unsigned int get(unsigned int =0);	   //читает
      unsigned int getcount() const;   	   //количество объектов класса
   private:
      struct list{
         unsigned int Nature;
         list* next;
      };
      list *Head;             //указывает на 1 элемент списка
      static int count;       //содержит количество объектов класса
};//end class Lists
int Lists::count=0;
 
void main(void){//----------------------------------------------------------
clrscr();
//2.Введем 20 случайных элементов списка
Lists list;
int i;
time_t t;
 
srand((unsigned) time(&t));   //чтобы генератор случайных чисел не "повторялся"
for(i=0;i<20;i++) list.set(rand()%100);
 
cout<<list.get(0);
for(i=1;i<list.getcount();i++) cout<<","<<list.get(i);
cout<<"\n";
//3.За один проход списка сохраним первые встретившиеся максимальные и
  минимальные элементы и их порядковые номера в списке
unsigned int iMax,iMaxN=0,iMin,iMinN=0;
 
iMin=iMax=list.get(0);
 
for(i=0;i<list.getcount();i++){
	if( iMin>list.get(i) ){
		iMin=list.get(i);
		iMinN=i;
	};
	if( iMax<list.get(i) ){
		iMax=list.get(i);
		iMaxN=i;
	};
};
//4.Удалим минимальный элемент списка и запишем его после максимального
if(iMinN<iMaxN){//если минимальный элемент расположен до максимального
	list.del(iMinN);
	list.set(iMin,iMaxN);
}else{          //если минимальный элемент расположен после максимального
	list.del(iMinN);
	list.set(iMin,iMaxN+1);
};
 
cout<<list.get(0);
for(i=1;i<list.getcount();i++) cout<<","<<list.get(i);
cout<<"\n";
cout<<"MAX="<<iMax<<", MIN="<<iMin;
 
getch();
};//end main----------------------------------------------------------------
 
//Lists function
Lists::Lists(){
   Head=NULL;
}
//--------------------------------------
Lists& Lists::set(unsigned int iN,unsigned int N){
   if( N > count ) return *this;
 
   if(N==0){
      if(!count ){
         list* iX=new list;
         Head=iX;
         iX->next=iX;
         iX->Nature=iN;
         count++;
         return *this;
      }else{
         list* iX=new list;
         iX->next=Head;
         iX->Nature=iN;
         Head=iX;
         count++;
         return *this;
      };
   };
 
   list* lX;
   lX=Head;
   for(unsigned int i=N;i>=2;i--){
      lX=(lX->next);
   };
   list*iX=new list;
   iX->next=(lX->next);
   lX->next=iX;
   iX->Nature=iN;
   count++;
   return *this;
}//end set()
//--------------------------------------
Lists& Lists::del(unsigned int N){
   if( N >= count ) return *this;
 
   if(N==0){
      if(1==count){
         delete Head;
         Head=NULL;
      }else{
         list* lX;
         lX=Head;
         Head=(Head->next);
         delete lX;
      };
      count--;
      return *this;
   };
 
   list* lX;
   lX=Head;
   for(unsigned int i=N;i>=2;i--){
      lX=(lX->next);
   };
   list* lY;
   lY=(lX->next);
   lY==(lY->next)?lX->next=lX:lX->next=(lY->next);
   delete lY;
   count--;
   return *this;
}//end del()
//--------------------------------------
unsigned int Lists::get(unsigned int N){
   if( N >= count ) return 0;
   list* lX;
   lX=Head;
   for(unsigned int i=N;i>=1;i--){
      lX=(lX->next);
   };
   return (lX->Nature);
}//end get()
//--------------------------------------
unsigned int Lists::getcount() const{
   return count;
}
//--------------------------------------
Lists::~Lists(){
   if(count!=0){
      for(unsigned int i=count;i>0;i--)del();
   };
}
//end Lists function--------------------

Ключевые слова: 
однонаправленный однонаправленные список списки
ВложениеРазмер
список.zip19.44 кб