This course is a sequel to CSci 135 Software Design and Analysis I. It introduces the concept of abstract data types, called ADTs for short, as well as specific ADTS such as queues, stacks, lists, and binary trees. It also introduces algorithms for a few common problems such as sorting. Practically speaking, it furthers the students' programming skills with topics such as recursion, pointers, and exception handling, and provides a chance to improve software engineering skills and to give the students practical experience for more productive programming.