Except for the obvious difference that all the programming examples in the current text are in C, this book is an almost word-for-word reproduction of the first author’s 1987 Pascal-based book [1]. All the chapter titles and basic content are identical except that this edition is missing the case study chapter on an index writer.
I asked the obvious questions as I reviewed the book. How did the change from Pascal to C affect the strengths of the book? Were other substantive changes made? How have the contents weathered the changes suggested by Computing curricula 1991 [2]?
Since many institutions have switched to C as the language for the first course, and since several of Kruse’s competitors have produced C versions of their texts, it is quite logical that this book should have appeared. The C code itself exhibits a consistent, structured, highly readable style. The translators appear to have capitalized on C’s strengths without sacrificing the focus on data abstraction and algorithm design regardless of language. These features speak to the original version’s lucidity. The authors are not suggesting that C is the best language for presenting this material, however. All the passages that extol the virtues of Pascal as a language for presentation of algorithms in the second edition [1] are glaringly omitted from the new C edition.
The preface indicates the book’s suitability for a CS2 course utilizing the first eight chapters and part of the ninth, or for covering both CS2 and CS7 if the entire book is used over two semesters. The text assumes that students have had a first course in programming (not necessarily in C, as a brief ANSI C tutorial appears in an appendix). It does not require mathematics beyond good high school preparation, although the authors suggest that a concurrent course in discrete mathematics would be useful for the later chapters.
I paid particular attention to how well the book covers the algorithm and data structures knowledge units described by Computing curricula 1991. Of the nine knowledge units on algorithms (AL1-AL9), a thorough job is done on six. The book has good coverage of the basic data structures (AL1--arrays, tables, stacks, queues, trees, and graphs) and the AL2 notion of abstract data types. Recursion and recursive algorithms (AL3) are covered but without the mathematical foundation suggested in AL3. Complexity analysis (AL4) utilizing big “O” notation is covered throughout. Sorting and searching (AL6) receive considerable attention. Perhaps the book’s greatest strength lies in its coverage of practical problem-solving strategies (AL8), beginning with the Game of Life problem and continuing through its improvements and other compelling and creative problems. No coverage is given to three topics--complexity classes (AL5), including P and NP; computability and undecidability (AL7); and parallel and distributed algorithms (AL9).
Although this book, like its predecessors, is carefully laid out with helpful illustrations, it suffers from the lack of red as a contrasting color, which was one of the strengths of the second edition of the Pascal version. This book will be warmly received by those who loved Kruse’s book before, but were looking for a C version. It should not be overlooked by those wishing for their first C data structures text. It is not, however, for those looking for a stronger theory-based text with a strong mathematical foundation.