//adinvsliste.cpp
/*
  Realizza una struttura dati, e le funzioni ad essa associate, che permette:

  1) memorizzare sequenze di interi
  2) crescere a piacimento
  3) accedere velocemente ad ogni elem della sequenza
  4) eliminare un elem dalla seq (op poco frequente)

*/
//uso un array dinamico!

#include<iostream.h>


void AggiungiElem(int*& vett, int& dimcor, int& dimmax, int elem)
{
  if (dimcor < dimmax) {
    vett[dimcor] = elem;
    dimcor = dimcor+1;
  }
  else { //ingrandire l'array;
    dimmax = dimmax*2;
    int* vaux = new int[dimmax];
    for (int i=0; i < dimcor; i++)
      vaux[i] = vett[i];
    vaux[dimcor] = elem;
    dimcor = dimcor+1;
    delete[] vett;
    vett = vaux;
  }
}


int DammiElem(int* vett, int pos)
{ return vett[pos-1]; } //indici struttura partono da 1


void EliminaElem(int*& vett, int& dimcor, int& dimmax, int pos)
{ // si assume j <= dimcor
  if (dimcor <= 1) {
    dimcor = 0;
  }
  else if (dimcor > dimmax/2) {
    for (int i = pos-1; i < dimcor-1; i++)
      vett[i] = vett[i+1];
    dimcor = dimcor-1;
  }
  else {
    //rimpicciolire l'array;
    dimmax = dimmax/2;
    int* vaux = new int[dimmax];
    for (int i = 0; i < pos-1; i++)
      vaux[i] = vett[i];
    for (int i = pos-1; i < dimcor-1; i++)
      vaux[i] = vett[i+1];
    dimcor = dimcor-1;
    delete[] vett;
    vett = vaux;
  }
}


void Stampa(int* vett, int dimcor, int dimmax)
{
  cout << dimmax << ',' << dimcor << " : ";//per vedere come cresce l'array
  if (dimcor == 0)
    cout << "null\n";
  else {
    for(int i=0; i < dimcor; i++)
      cout << DammiElem(vett,i) << ' ';
    cout << endl;
  }
}


void main()
{
  //inizializzo struttura
  int dimmax = 3;
  int* a = new int[dimmax];
  int dimcor = 0;

  //leggo sequenza e la memorizzo nella struttura usando AggiungiElem
  int elem;
  cin >> elem;
  while (elem != 0) {
    AggiungiElem(a,dimcor,dimmax,elem);
    Stampa(a,dimcor,dimmax);
    cin >> elem;
  }

  //elimino elementi di indice pari
  int i;
  cin >> i;
  while (i > 0) {
      EliminaElem(a,dimcor,dimmax,i);
      Stampa(a,dimcor,dimmax);
    cin >> i;
  }
}




