I'd say they are all valueable... algorithms and datastructures are great, but if you don't know a programming language in which to apply them, well... and if you do know a programming language, but don't have any algorithmic knowledge, you are also in trouble. It's really the combination of all of them that are important.
In terms of filling in your knowledge gaps, the best way is to read things online, try implementing things, and let curiosity both in the reading and the implementation lead to new readings and implementation efforts. It's important to get a good mix of both the theoretical concepts and practical elements of implementation.
When it comes to actual implementation, specifically in C++, I found A Beginner's C++ (now outdated, but has lots of useful information nevertheless) and C++ FAQ Lite, to be incredibly helpful. For a wider range of subject areas,Google Code University and the Google Techtalks are a good way to gain additional knowledge, although they currently do not have enough to provide a full CS degree's worth. Really, just reading up on things you find interesting, googling any terms or materials that aren't fully explained or that seem interesting, and repeating this over and over are probably the best way to go about it.