#include <iostream.h>
#include "apstring.h"

template <class ANYTHING>
class link {

public:
  link *next;
  ANYTHING element;
  link (ANYTHING e, link *l) {
    element = e;
    next=l;
  }

};


template <class ANYTHING>
class list {

private:
  link<ANYTHING> *head;
  link<ANYTHING> *current;

public:

  list(){
    head=NULL;
    current=head;
  }
  
  void add(ANYTHING element){
    head=new link<ANYTHING> (element,head);
  }
  void advance(){
    //if (current->next)
      current=current->next;
  }
  ANYTHING access(){
    return current->element;
  }
  int tail(){
    return !current;
  }
  void reset(){ 
    current=head;
  }
};


struct Student
{
  apstring name;
  int AS;
  float GPA;
  Student(int i):AS(i) {}
  Student() {}

};

list<int> numbers;
list<Student> students;

main() {
  //add numbers
  numbers.add(1);
  numbers.add(2);
  numbers.add(3);
  numbers.add(4);
  numbers.add(5);
  
  //use now
  numbers.reset();
  cout<<"My Numbers are ";
  for(;!numbers.tail();numbers.advance())
    cout<<numbers.access()<<" ";
  cout<<endl<<endl;


  Student s1(555);
  s1.name="Jonathan Fishbeck";
  s1.GPA=4;

  Student s2(555);
  s2.name="Jim Caggy";
  s2.GPA=3.9;
  //add students
  students.add(s1);
  students.add(s2);
  //now use 
  students.reset();
  cout<<"My Students are \n";
  for(;!students.tail();students.advance()) {
    cout<<"NAME : "<<students.access().name<<endl;
    cout<<"AS   : "<<students.access().AS<<endl;
    cout<<"GPA  : "<<students.access().GPA<<endl<<endl;
  }
  cout<<endl;
}

#include <iostream.h>
#include "apstring.h"

template <class ANYTHING>
class link {

public:
  link *next;
  ANYTHING *element;
  link (ANYTHING *e, link *l) {
    element = e;
    next=l;
  }

};


template <class ANYTHING>
class list {

private:
  link<ANYTHING> *head;
  link<ANYTHING> *current;

public:

  list(){
    head=NULL;
    current=head;
  }
  
  void add(ANYTHING *element){
    head=new link<ANYTHING> (element,head);
  }
  void advance(){
    //if (current->next)
      current=current->next;
  }
  ANYTHING* access(){
    return current->element;
  }
  int tail(){
    return !current;
  }
  void reset(){ 
    current=head;
  }
};

struct Student
{
  apstring name;
  int AS;
  float GPA;
  Student(int i):AS(i) {}
  Student() {}

};

list<int> numbers;
list<Student> students;
main() {
  //add numbers
  int one=1,two=2,three=3,four=4,five=5;
  numbers.add(&one);
  numbers.add(&two);
  numbers.add(&three);
  numbers.add(&four);
  numbers.add(&five);
  
  //use now
  numbers.reset();
  cout<<"My Numbers are ";
  for(;!numbers.tail();numbers.advance())
    cout<<*numbers.access()<<" ";
  cout<<endl<<endl;


  Student * s1= new Student(555);
  s1->name="Jonathan Fishbeck";
  s1->GPA=4;

  Student * s2= new Student(555);
  s2->name="Jim Caggy ";
  s2->GPA=3.9;

  //add students
  students.add(s1);
  students.add(s2);
  //now use 
  students.reset();
  cout<<"My Students are \n";
  for(;!students.tail();students.advance()) {
    cout<<"NAME : "<<students.access()->name<<endl;
    cout<<"AS   : "<<students.access()->AS<<endl;
    cout<<"GPA  : "<<students.access()->GPA<<endl<<endl;
  }
  cout<<endl;
}


 OUTPUT:
 My Numbers are 5 4 3 2 1 

 My Students are 
 NAME : Jim Caggy
 AS   : 555
 GPA  : 3.9

 NAME : Jonathan Fishbeck
 AS   : 555
 GPA  : 4