#include <iostream>
//#define DEBUG

template <class T> class simpList;

template <class T>
class simpNode{
public:
  friend class simpList<T>;
private:
  T data;
  simpNode * next;
};

template < class T> 
class simpList{
public:

  simpList(){ //constructor
    length=0;
    header = new simpNode<T>;
    header->next = NULL;
  }

  ~simpList(){ //destructor
    simpNode<T> * tmp1, * tmp2;
    tmp1 = header;
    while (tmp1->next != NULL){
#ifdef DEBUG
      cout <<"\n\tDeleting a node...";
#endif
      tmp2 = tmp1->next;
      delete tmp1;
      tmp1 = tmp2;
    }
    delete tmp1;
  }

  void insert(T x, int p){// p >= 1
    if (p > length+1) return;
    length +=1;
    simpNode<T> * tmp1;
    tmp1 = new simpNode<T>;
    tmp1->data = x;
    simpNode<T> * tmp2 = header;
    for (int i=0; i < p-1; i++, tmp2 = tmp2->next);
    tmp1->next = tmp2->next;
    tmp2->next = tmp1;
  }

  void printList(){//assumes that "<<" is defined for  class T
    simpNode<T> * tmp;
    cout << "here\n";
    for (tmp=header->next; tmp != NULL; tmp=tmp->next)cout << tmp->data << ",  ";
  }

  void makeEmpty();
  int find(T x);
  T findkth(int p);
  void remove(T e);
private:
  int length;
  simpNode<T> * header;
};
  

simpList<float> L1;
void main(){
  L1.insert(0.5, 1);   L1.insert(0.6, 1);   L1.insert(0.3, 1);
  L1.insert(0.9, 2);

  L1.printList();

  //  L1.~simpList();
}
