So, there is only a very trivial difference between a struct and a class . And struct was kept for backward compatibility with C, while class was introduced because it is generally more appropriate for Object-Oriented Programming purely on the basis of vocabulary (i.e. in OOP with about "classes" of objects) and on the grounds of default access rights and inheritance (private) which is more in-line with OOP design philosophy. But, in practical terms, the difference between struct and class remains trivial.
What you call "structures" is what experienced programmers colloquially refer to as "POD-types" (Plain-Old-Data types). These are basically simple little bundle of data like:
struct Vector2d {
double x;
double y;
};
By convention, in C++, people use the keyword struct when creating such simple classes, and thus, people sometimes call them "structures", but I tend to dislike this awkward, overly general wording.
So, the purpose of POD-types is similar to that of any other class, except that, in this case, you don't have any functionality to associate directly to the class (or very little functionality). In other words, when you just want to bundle a bunch of data elements together, not much more. POD-types are a special kind of "value-objects" (or value-classes).
>>How do they help with coding?
Well POD-types help with coding just because data structures are omni-present in programming tasks and very often all you need is to group a number of variables together as one logical entity, and that's it.
Enums simply allow you to associate identifiers to the elements of an enumeration of choices for a particular purpose. Like in firstPerson's example, you have 4 choices for the purpose of telling a direction: north, south, east, and west. Enums are a nice way to make human-readable code that is neat and safe.
Of course, both enums and structs don't serve such a special purpose that no other thing could do the same job, they are just two more tools in the tool-box.
>>They don't seem like it makes the code shorter so I'm confused
Making code shorter is rarely a concern for any programmer (I mean, not uselessly repeating large sections of code is certainly a concern, but compressing code to the absolute minimal amount of lines is just plain stupid). Programmers are by far more interested in making neat, human-readable code. You often will hear things like "code should read like prose", "correctness, simplicity, and clarity come first", or "prefer long descriptive names for variables to short accronyms", etc. This is all because generally good code is easy to read and understand without even having any comments explaining it. Many programming languages were designed with these prime concerns in mind. Tools like struct and enum are simply nice and simple, and intuitive constructions that are tailored to a very common purpose in programming.
N.B. One very important advantage of enums over constant values is that they are type-safe, as in firstPerson's example, when using a Direction enum, as a parameter to a function or something, the type-safety of the enum (almost) guarantees that the caller will not provide a value other than the three values that are part of the enum's definition.