どっちにしても

    for(p = p_start; p != p_end; ++p)
        if(p->id == id )return p;

の部分は関数なりマクロになりにした方がいいんじゃないのか?
同じアルゴリズムが、同じ関数の二箇所で使われてるのはどうかと思う。