/*
MODYFIKACJA: Dodajemy sortowanie.
Wprowadzenie danych do dynamicznej tablicy napisów.
Program prosi o podanie ciągu napisów który użytkownik kończy napisem pustym.
W trakcie wprowadzenia gromadzi napisy w dynamicznej tablice.




















*/
#include <iostream>
#include <malloc>
#include <limits>

using namespace std; // w starszych kompilatorach trzeba zakomentować ten wiersz

void Drukuj(char **T,unsigned N)
  {
   unsigned i=0;
   for(char **K=T+N;T<K;++T) cout<<"T["<<(++i)<<"]=\""<<*T<<"\";"<<endl;
  }

void Zwolnij(char **T,unsigned N)
  {
   char **P=T;
   for(char **K=T+N;T<K;++T) delete[] *T;
   delete[] P;
  }

void _quick(char **T,int Lo,int Hi)
  {
   int L=Lo,H=Hi;
   char *Mid=T[(L+H)>>1];
   while(true)
     {
      while((L<=Hi)&&(strcmp(T[L],Mid)<0)) ++L;
      while((H>=Lo)&&(strcmp(T[H],Mid)>0)) --H;
      if(L>H) break;
      if(L<H)
        {
         char *Tmp=T[L];
         T[L]=T[H];
         T[H]=Tmp;
        }
      ++L;
      --H;
      if(L>H) break;
     }
   if(L<Hi) _quick(T,L,Hi);
   if(H>Lo) _quick(T,Lo,H);
  }

inline void QuickSort(char **T,unsigned Rozmiar)
  {
   _quick(T,0,Rozmiar-1);
  }

int main()
  {
   while(true)
     {
      unsigned Ilosc=0;
      char **T=0;
      while(true)
        {
         cout<<"Podaj napis nr "<<(Ilosc+1)<<" (<enter>-koniec): ";
         char bufor[80];
         cin.getline(bufor,80,'\n');
         if(*bufor)
           {
            char **N=new char*[Ilosc+1];
            if(T)
              {
               memcpy(N,T,Ilosc*sizeof(char*));
               delete[] T;
              }
            T=N;
            T[Ilosc++]=strdup(bufor);
           }
         else break;
        }
      if(!Ilosc) break;
      cout<<endl;
      Drukuj(T,Ilosc);
      cout<<endl;
      cin.get();
      cout<<endl;
      QuickSort(T,Ilosc);
      Drukuj(T,Ilosc);
      Zwolnij(T,Ilosc);
      cout<<endl;
     }
   return 0;
  }


