Can someone explain what we mean when we do, like what does struct Node* next do. does it create a pointer of type struct? any help and resources about structures in c would be helpful
struct Node {
    int dest;
    struct Node* next;
};
Can someone explain what we mean when we do, like what does struct Node* next do. does it create a pointer of type struct? any help and resources about structures in c would be helpful
struct Node {
    int dest;
    struct Node* next;
};
 
    
    "struct" itself is not a type. "struct [tag]" is a type, for example "struct Node" in your code.
In your case you define a structure type. Every structure of that type will contain a pointer to another structure of that type as a member called "next".
This allows you to chain the structures together in a so called linked list. You store a pointer to the first structure in a variable, then you can follow the chain of links down to the structure you need.
For example, you can do
struct Node *start;
start = malloc(sizeof struct Node);
start->dest = 7;
start->next = malloc(sizeof struct Node);
start->next->dest = 13;
start->next->next = malloc(sizeof struct Node);
start->next->next->dest = 19;
printf("%d %d %d\n", start->dest, start->next->dest, start->next->next->dest);
free(start->next->next);
free(start->next);
free(start);
Please note that this code omits all error handling, in real code you have to handle the case when malloc returns NULL.
Also, in real code you would use such a structure in loops that traverse the chain, not directly as above.
 
    
    As @Serge is pointing out in comments, is not a struct within a struct, is a reference (a pointer) to an object of the same type, an example:
#include <stdio.h>
struct Node {
    int dest;
    struct Node* next;
};
int main(void)
{
    /* An array of nodes */
    struct Node nodes[] = {
        {1, &nodes[1]}, // next points to the next element
        {2, &nodes[2]}, // next points to the next element
        {3, NULL}       // next points to null
    };
    /* A pointer to the first element of the array */                           
    struct Node *node = nodes;
    while (node) {
        printf("%d\n", node->dest);
        node = node->next; // node moves to the next element
    }
    return 0;
}
Output:
1
2
3
Of course, in my example there is no benefit in using a linked list, linked lists are useful when we don't know the number of elements before-hand.
Another example using dynamic memory:
struct Node *head, *node;
node = head = calloc(1, sizeof *node);
node->dest = 1;
while (more_elements_needed) {
    node->next = calloc(1, sizeof *node);
    node->next->dest = node->dest + 1;
    node = node->next;
}
for (node = head; node != NULL; node = node->next) {
    printf("%d\n", node->dest);
}
