Make sure you know how to program before you start reading books. Your course will undoubtably teach you Java upto a sensible level and will almost certainly have one or two semesters and projects in C, so get these done before you try and read books.
1. Make sure you know Java. Really know. Make sure you could do the following:
a) Make a function that given a character,
returns the character as lower case (if between 'A' and 'Z', or returns the original character).
b) Can implement a
linked list in Java
c) Can implement an
interface for a hypothetical button
d) Could implement (using Swing or just the console) and implementation of the "
Game of Life"
2. Make sure you know C. You don't need to know a lot of C, but enough to at the very least:
a) Implement a vector structure and a function add_to_vector(struct vector v, void* elem) where the
vector expands to allow more elements in. Make sure it
doesn't memory leak.
b) Implement a self-sorting binary tree structure and a function add_to_tree(struct tree, struct elem) that
adds the element to the binary tree and a function delete_from_tree(struct tree, struct elem) that finds the element and
removes it correctly without memory leaks
3. Now you are ready to learn from books. Don't try and learn programming from books (it doesn't work) and don't try and read the books before you can program - if you can't program you'll struggle on your course regardless of how much theory you know. With good programming experience you'll learn the theory faster anyway.
Here's my suggestions:
The New Turing Omnibus is a really good intro into lots of the theory behind programming, and will give you a massive head start in your theory classes.
The Mythical Man Month is another particularly brilliant book - it's not so much concerned with programming
per se, but gives a lot of insight into how programmers (and their managers) think, and thus is a great way to start to understand the thought processes behind many of the decisions you'll be faced with at University and beyond.
Goedel, Escher, Bach: An Eternal Golden Braid is somewhat more maths-y but is once again a brilliant book that will help you understand the subtleties of the limitations of computer science (and math)