There's some bad things and ugly things in the design of this API:
ListItr *itr; // done earlier in the code, and then later... itr = &(list->first());The call to first() creates a ListItr object and returns it, and normally you assign it to a variable. But not here. The value is created as a temporary variable, not assigned to any variable. But we grab its address and store it in a pointer. That sounds fine, as long as you (the programmer) trusts that the rules of C++ and the particular compiler will keep such temporary variables around. (Do you believe? Clap your hands if you believe!)
Updates to the specification for Lab 1 that you may follow if you wish.
ListItr itr = list->find(val); if ( itr.isPastEnd() ) cout << "Search not successful" << endl; else cout << "Search successful. Found value:" << itr.retrieve() << endl;