template <class T>
bag<T>::bag(int max = 20)
{
  head.link = NULL;
  cursor = &head;
}

template <class T>
bag<T>::~bag(void)
{
  bagnode<T> * p = head.link;
  bagnode<T> * tmp;
  while (p)
    {
      tmp = p;
      p = p->link;
      delete tmp;
    }
}
  
template <class T>
int bag<T>::count(void)
{
  int n = 0;
  bagnode<T> * p = head.link;
  while (p)
    {
      n++;
      p = p->link;
    }
  return n;
}

template <class T>
int bag<T>::full(void)
{
  return 0;
}

template <class T>
int bag<T>::empty(void)
{
  return head.link == NULL;
}

template <class T>
T * bag<T>::insert(T x)
{
  bagnode<T> * bn = new bagnode<T>;
  bn->data = x;
  bn->link = head.link;
  head.link = bn;
  return &(bn->data);
}

template <class T>
void bag<T>::remove(T x)
{
  bagnode<T> * p = head.link;
  bagnode<T> * tmp;
  while (p->link && p->link->data != x)
    p = p->link;
  if (p)
    {
      tmp = p->link;
      p->link = p->link->link;
      delete tmp;
    }
}

template <class T>
int bag<T>::has(T x)
{
  bagnode<T> * p = head.link;
  while (p)
    {
      if (p->data == x)
	return 1;
      else
	p = p->link;
    }
  return 0;
}

template <class T>
T * bag<T>::next(void)
{
  cursor = cursor->link;
  if (cursor)
    return &cursor->data;
  else
    return NULL;
}

template <class T>
void bag<T>::resetcursor(void)
{
  cursor = &head;
}







