This course focuses on algorithms, and how they can be implemented. Unfortunately, there isn't time to also focus equally on the software engineering aspects of how these algorithms are implemented in C.
If you have taken a course in software engineering (or have been introduced to these principles in an introductory programming course or from actual work experience), then you probably realized that the implementation of cursors shown above is terrible from the perspective of software engineering. It makes assumptions about the nature of the underlying sa_t and sa_cell_t structures that should be hidden by a layer of abstraction. A small change to the sa_cell_t structure could easily break this code.
In most cases, would be better to implement the idea of cursors as part of the sa library itself, so that functions that use this library do not depend on picayune details of the actual structures used by the library. The underlying algorithms will be entirely the same, of course, but the code would be more abstract and more reusable. In this text, however, I will usually sacrifice software engineering principles in favor of clean and concrete algorithms.