Шаблон иерархической структуры данных в памяти (односвязный список, содержащий статический массив указателей на объекты), страница 7

                        imin=j;

                  }

                  if (jelem->data[j+1]==NULL) {      /* шаг по j */

                        jelem=jelem->next;

                        j=0;

                  } else j++;

            }

            tmp=minelem->data[imin];      /* меняем местами минимум с i-м элементом */

            minelem->data[imin]=ielem->data[i];

            ielem->data[i]=tmp;

            if (ielem->data[i+1]==NULL) {            /* шаг по i */

                  ielem=ielem->next;

                  i=0;

            } else i++;

      }

}

template <class T>

void CListArr<T>::InsertKeepOrder(T elem) {          /* вставка elem  с сохранением порядка */

      TElem *cur;

      int         i, k;

      cur=top;

      k=0;                               /* номер элемента */

      while (cur!=NULL) {                /* поиск 1-го большего элемента (цикл по списку) */

            i=0;

            for (i=0; cur->data[i]!=NULL; i++) {     /* цикл по массиву */

                  if (elem < *(cur->data[i])) { cur=NULL; break; }

                  k++;

            }

            if (cur==NULL) break;

            cur=cur->next;

      }

      /* после поиска определили номер k */

      Insert(elem,k);               /* вставка элемента elem по номеру k */

}

template <class T>

int   CListArr<T>::LoadFile(char * filename) { /* загрузка из файла, filename - имя файла */

      TElem *cur;

      T           data;

      int         n, i;

      ifstream fin(filename);

      FreeMemory();                 /* освобождение памяти */

      top=new TElem;                /* создание 1-го элемента списка */

      top->next=NULL;

      top->data[0]=NULL;

      cur=top;

      nelems=0;                     /* инициализация счетчика */

      fin >> n;                     /* считываем количество элементов массива 1-го элемента списка */

      if (fin==NULL) {              /* если конец файла (пустой файл) */

            delete top;             /* удаляем вершину списка */

            top=NULL;

            return -1;

      }

      while (1) {

            if (n>MAXN) {          /* если в файле размер строки больше допустимой */

                  FreeMemory();     /* удаление всей структуры */

                  return -1;

            }

            for (i=0; i<n; i++) {   /* считывание элементов массива */

                  fin >> data;

                  cur->data[i]=new T;

                  *(cur->data[i])=data;

                  nelems++;

            }

            cur->data[n]=NULL;

            cur->next=NULL;

            fin >> n;               /* считывание количества элементов следующего массива */

            if (fin!=NULL) {        /* если не конец файла */

                  cur->next=new TElem;                     /* создание нового элемнта списка */

                  cur=cur->next;

                  cur->next=NULL;

                  cur->data[0]=NULL;

            } else break;           /* выход */

      }

      return 0;                     /* успешное завершение */

}

template <class T>

void CListArr<T>::SaveFile(char * filename) {  /* сохранение данных в файле */

      ofstream fout(filename);

      TElem *cur;

      int         i;

      for (cur=top; cur!=NULL; cur=cur->next) { /* цикл по списку */

            fout << nElems(cur);

            /* вывод массива данных  */

            for (i=0; cur->data[i]!=NULL; i++) fout << " " << *(cur->data[i]); 

            fout << endl;

      }

}

template <class T>

void CListArr<T>::Balancing() {    /* балансировка структуры */

      /* curnew - позиция элемента в новом списке, curold - в старом списке */

      TElem * curnew, *curold, *tmp;

      /* позиция в массиве нового (inew) и старого списка (iold) */

      int         inew, iold;