Whatever you put inside the parenthesis is considered/has to be a condition. So it could be `while (a == 5)` or if a variable is itself a condition you can put the variable directly in the parenthesis. For example every integer, *except for <kbd>0</kbd>*, is considered as `true`, so if I have `while (10)` this condition will always be `true` (and will probably cause an infinite loop).

Now the value `NULL` is interpreted as `false`. The <kbd>!</kbd> just changes the condition to its opposite. So `true` becomes `false` and `false` becomes `true`. Take a look at the example below:

<!-- language: lang-c -->

    #include <stdio.h>
    
    int main(void)
    {
        if (NULL)
        {
            printf("NULL is interpreted as 'true'\n");
        }
        else if (!NULL)
        {
            printf("NULL is interpreted as 'false'\n");
        }
    
        return 0;
    }

It will print

<!-- language: lang-none -->

    NULL is interpreted as 'false'

___
Now on `struct`s. You basically create a `struct` whenever you want a type for a variable, that holds more than one type of variables. For example if we had a store with PCs and wanted to store them somehow, you could create a `struct` that would contain each PC's variables (i.e. CPU speed, RAM etc). The `struct` would look like that:

<!-- language: lang-c -->

    struct pc
    {
        float cpu_frq;
        int gb_of_ram;
    };

Now every time you wanted to create a variable of this type inside your program you would have to do it that way:

<!-- language: lang-c -->

    struct pc pc_name;
    pc_name.cpu_frq = 3.2;
    pc_name.gb_of_ram = 8;

___
In order to not have to type the whole struct name (i.e. `struct pc`) we use a `typedef`, which creates an 'alias' for a variable type. So you can change to 

<!-- language: lang-c -->

    typedef struct pc {
        float cpu_frq;
        int gb_of_ram;
    } apc;

and declare your variables as

<!-- language: lang-c -->

    apc pc_name;
    pc_name.cpu_frq = 3.2;
    pc_name.gb_of_ram = 8;

So to answer directly your question the top `node` is the name of the `struct` and the bottom `node` is the 'alias' name of the struct.
___
If you didn't use the `typedef` at top, what is now the 'alias', would be declaration of variables. So that

<!-- language: lang-c -->

    struct pc {
        float cpu_speed;
        int gb_of_ram;
    } apc;

would have this as consequence:

<!-- language: lang-c -->

    apc.cpu_speed = 3.2;
    apc.gb_of_ram = 8;

If something is unclear (probably many things as I didn't use a really great example) ask away!