C++で単方向リスト

30分プログラム、その745。C++で単方向リストを書いてみた。
さっきBoostのインストールを開始したんですが、なかなか時間かかりますね。で、その間の暇つぶしに単方向リスト書いてました。
いたるところでnewしてますが、まったくdeleteしてません。だって、Boostのインストールが完了してないから、shared_ptrが使えないんですもん。ごめんなさい。

使い方

list<int>* xs = cons(1, cons(2, cons(3, nil<int>())));

cout << length(xs) << endl;

ソースコード

#include <iostream>

template <typename T>
struct list{
  T value;

  // fix later
  list* next;

  list(T value, list<T>* next)
    :value(value), next(next)
  {}
};

template <typename T>
inline list<T>* nil(){
  return 0;
}

template <typename T>
list<T>* cons(T value, list<T>* next){
  return new list<T>(value, next);
}

template <typename T>
T head(list<T>* xs){
  return xs->value;
}

template <typename T>
list<T>* tail(list<T>* xs){
  return xs->next;
}

template <typename T>
int length(list<T>* xs){
  if(xs == nil<T>()){
    return 0;
  }else{
    return 1 + length(tail(xs));
  }
}

template <typename T>
list<T>* append(list<T>* xs, list<T>* ys){
  if(xs == nil<T>()){
    return ys;
  }else{
    return cons(head(xs), append(tail(xs),ys));
  }
}

template <typename T, typename F>
void for_each(F f, list<T>* xs){
  if(xs != nil<T>()) {
    f(head(xs));
    for_each(f, tail(xs));
  }
}

void puti(int d){
  printf("%d ",d);
}

int main(int argc, char *argv[])
{
  using namespace std;

  list<int>* xs = cons(1, cons(2, cons(3, nil<int>())));
  list<int>* ys = cons(4, cons(5, cons(6, nil<int>())));

  cout << length(xs) << endl;
  cout << length(append(xs,ys)) << endl;

  for_each(puti, xs);
  puts("");

  for_each(puti, append(xs, ys));
  puts("");
  return 0;
}